From 20563b2b7a40e90ee6be4cc9138dd04a4297d235 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara <softark@gmail.com> Date: Thu, 6 Nov 2014 23:53:45 +0900 Subject: [PATCH] docs/guide-ja/structure-filters.md - prepared for translation [ci skip] --- docs/guide-ja/structure-filters.md | 400 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 400 insertions(+) create mode 100644 docs/guide-ja/structure-filters.md diff --git a/docs/guide-ja/structure-filters.md b/docs/guide-ja/structure-filters.md new file mode 100644 index 0000000..4268348 --- /dev/null +++ b/docs/guide-ja/structure-filters.md @@ -0,0 +1,400 @@ +Filters +======= + +Filters are objects that run before and/or after [controller actions](structure-controllers.md#actions). For example, +an access control filter may run before actions to ensure that they are allowed to be accessed by particular end users; +a content compression filter may run after actions to compress the response content before sending them out to end users. + +A filter may consist of a pre-filter (filtering logic applied *before* actions) and/or a post-filter (logic applied +*after* actions). + + +## Using Filters <a name="using-filters"></a> + +Filters are essentially a special kind of [behaviors](concept-behaviors.md). Therefore, using filters is the same +as [using behaviors](concept-behaviors.md#attaching-behaviors). You can declare filters in a controller class +by overriding its [[yii\base\Controller::behaviors()|behaviors()]] method like the following: + +```php +public function behaviors() +{ + return [ + [ + 'class' => 'yii\filters\HttpCache', + 'only' => ['index', 'view'], + 'lastModified' => function ($action, $params) { + $q = new \yii\db\Query(); + return $q->from('user')->max('updated_at'); + }, + ], + ]; +} +``` + +By default, filters declared in a controller class will be applied to *all* actions in that controller. You can, +however, explicitly specify which actions the filter should be applied to by configuring the +[[yii\base\ActionFilter::only|only]] property. In the above example, the `HttpCache` filter only applies to the +`index` and `view` actions. You can also configure the [[yii\base\ActionFilter::except|except]] property to blacklist +some actions from being filtered. + +Besides controllers, you can also declare filters in a [module](structure-modules.md) or [application](structure-applications.md). +When you do so, the filters will be applied to *all* controller actions belonging to that module or application, +unless you configure the filters' [[yii\base\ActionFilter::only|only]] and [[yii\base\ActionFilter::except|except]] +properties like described above. + +> Note: When declaring filters in modules or applications, you should use [routes](structure-controllers.md#routes) + instead of action IDs in the [[yii\base\ActionFilter::only|only]] and [[yii\base\ActionFilter::except|except]] properties. + This is because action IDs alone cannot fully specify actions within the scope of a module or application. + +When multiple filters are configured for a single action, they are applied according to the rules described below, + +* Pre-filtering + - Apply filters declared in the application in the order they are listed in `behaviors()`. + - Apply filters declared in the module in the order they are listed in `behaviors()`. + - Apply filters declared in the controller in the order they are listed in `behaviors()`. + - If any of the filters cancel the action execution, the filters (both pre-filters and post-filters) after it will + not be applied. +* Running the action if it passes the pre-filtering. +* Post-filtering + - Apply filters declared in the controller in the reverse order they are listed in `behaviors()`. + - Apply filters declared in the module in the reverse order they are listed in `behaviors()`. + - Apply filters declared in the application in the reverse order they are listed in `behaviors()`. + + +## Creating Filters <a name="creating-filters"></a> + +To create a new action filter, extend from [[yii\base\ActionFilter]] and override the +[[yii\base\ActionFilter::beforeAction()|beforeAction()]] and/or [[yii\base\ActionFilter::afterAction()|afterAction()]] +methods. The former will be executed before an action runs while the latter after an action runs. +The return value of [[yii\base\ActionFilter::beforeAction()|beforeAction()]] determines whether an action should +be executed or not. If it is false, the filters after this one will be skipped and the action will not be executed. + +The following example shows a filter that logs the action execution time: + +```php +namespace app\components; + +use Yii; +use yii\base\ActionFilter; + +class ActionTimeFilter extends ActionFilter +{ + private $_startTime; + + public function beforeAction($action) + { + $this->_startTime = microtime(true); + return parent::beforeAction($action); + } + + public function afterAction($action, $result) + { + $time = microtime(true) - $this->_startTime; + Yii::trace("Action '{$action->uniqueId}' spent $time second."); + return parent::afterAction($action, $result); + } +} +``` + + +## Core Filters <a name="core-filters"></a> + +Yii provides a set of commonly used filters, found primarily under the `yii\filters` namespace. In the following, +we will briefly introduce these filters. + + +### [[yii\filters\AccessControl|AccessControl]] <a name="access-control"></a> + +AccessControl provides simple access control based on a set of [[yii\filters\AccessControl::rules|rules]]. +In particular, before an action is executed, AccessControl will examine the listed rules and find the first one +that matches the current context variables (such as user IP address, user login status, etc.) The matching +rule will dictate whether to allow or deny the execution of the requested action. If no rule matches, the access +will be denied. + +The following example shows how to allow authenticated users to access the `create` and `update` actions +while denying all other users from accessing these two actions. + +```php +use yii\filters\AccessControl; + +public function behaviors() +{ + return [ + 'access' => [ + 'class' => AccessControl::className(), + 'only' => ['create', 'update'], + 'rules' => [ + // allow authenticated users + [ + 'allow' => true, + 'roles' => ['@'], + ], + // everything else is denied by default + ], + ], + ]; +} +``` + +For more details about access control in general, please refer to the [Authorization](security-authorization.md) section. + + +### Authentication Method Filters <a name="auth-method-filters"></a> + +Authentication method filters are used to authenticate a user based using various methods, such as +[HTTP Basic Auth](http://en.wikipedia.org/wiki/Basic_access_authentication), [OAuth 2](http://oauth.net/2/). +These filter classes are all under the `yii\filters\auth` namespace. + +The following example shows how you can use [[yii\filters\auth\HttpBasicAuth]] to authenticate a user using +an access token based on HTTP Basic Auth method. Note that in order for this to work, your +[[yii\web\User::identityClass|user identity class]] must implement the [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]] +method. + +```php +use yii\filters\auth\HttpBasicAuth; + +public function behaviors() +{ + return [ + 'basicAuth' => [ + 'class' => HttpBasicAuth::className(), + ], + ]; +} +``` + +Authentication method filters are commonly used in implementing RESTful APIs. For more details, please refer to the +RESTful [Authentication](rest-authentication.md) section. + + +### [[yii\filters\ContentNegotiator|ContentNegotiator]] <a name="content-negotiator"></a> + +ContentNegotiator supports response format negotiation and application language negotiation. It will try to +determine the response format and/or language by examining `GET` parameters and `Accept` HTTP header. + +In the following example, ContentNegotiator is configured to support JSON and XML response formats, and +English (United States) and German languages. + +```php +use yii\filters\ContentNegotiator; +use yii\web\Response; + +public function behaviors() +{ + return [ + [ + 'class' => ContentNegotiator::className(), + 'formats' => [ + 'application/json' => Response::FORMAT_JSON, + 'application/xml' => Response::FORMAT_XML, + ], + 'languages' => [ + 'en-US', + 'de', + ], + ], + ]; +} +``` + +Response formats and languages often need to be determined much earlier during +the [application lifecycle](structure-applications.md#application-lifecycle). For this reason, ContentNegotiator +is designed in a way such that it can also be used as a [bootstrapping component](structure-applications.md#bootstrap) +besides filter. For example, you may configure it in the [application configuration](structure-applications.md#application-configurations) +like the following: + +```php +use yii\filters\ContentNegotiator; +use yii\web\Response; + +[ + 'bootstrap' => [ + [ + 'class' => ContentNegotiator::className(), + 'formats' => [ + 'application/json' => Response::FORMAT_JSON, + 'application/xml' => Response::FORMAT_XML, + ], + 'languages' => [ + 'en-US', + 'de', + ], + ], + ], +]; +``` + +> Info: In case the preferred content type and language cannot be determined from a request, the first format and + language listed in [[formats]] and [[languages]] will be used. + + + +### [[yii\filters\HttpCache|HttpCache]] <a name="http-cache"></a> + +HttpCache implements client-side caching by utilizing the `Last-Modified` and `Etag` HTTP headers. +For example, + +```php +use yii\filters\HttpCache; + +public function behaviors() +{ + return [ + [ + 'class' => HttpCache::className(), + 'only' => ['index'], + 'lastModified' => function ($action, $params) { + $q = new \yii\db\Query(); + return $q->from('user')->max('updated_at'); + }, + ], + ]; +} +``` + +Please refer to the [HTTP Caching](caching-http.md) section for more details about using HttpCache. + + +### [[yii\filters\PageCache|PageCache]] <a name="page-cache"></a> + +PageCache implements server-side caching of whole pages. In the following example, PageCache is applied +to the `index` action to cache the whole page for maximum 60 seconds or until the count of entries in the `post` +table changes. It also stores different versions of the page depending on the chosen application language. + +```php +use yii\filters\PageCache; +use yii\caching\DbDependency; + +public function behaviors() +{ + return [ + 'pageCache' => [ + 'class' => PageCache::className(), + 'only' => ['index'], + 'duration' => 60, + 'dependency' => [ + 'class' => DbDependency::className(), + 'sql' => 'SELECT COUNT(*) FROM post', + ], + 'variations' => [ + \Yii::$app->language, + ] + ], + ]; +} +``` + +Please refer to the [Page Caching](caching-page.md) section for more details about using PageCache. + + +### [[yii\filters\RateLimiter|RateLimiter]] <a name="rate-limiter"></a> + +RateLimiter implements a rate limiting algorithm based on the [leaky bucket algorithm](http://en.wikipedia.org/wiki/Leaky_bucket). +It is primarily used in implementing RESTful APIs. Please refer to the [Rate Limiting](rest-rate-limiting.md) section +for details about using this filter. + + +### [[yii\filters\VerbFilter|VerbFilter]] <a name="verb-filter"></a> + +VerbFilter checks if the HTTP request methods are allowed by the requested actions. If not allowed, it will +throw an HTTP 405 exception. In the following example, VerbFilter is declared to specify a typical set of allowed +request methods for CRUD actions. + +```php +use yii\filters\VerbFilter; + +public function behaviors() +{ + return [ + 'verbs' => [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'index' => ['get'], + 'view' => ['get'], + 'create' => ['get', 'post'], + 'update' => ['get', 'put', 'post'], + 'delete' => ['post', 'delete'], + ], + ], + ]; +} +``` + +### [[yii\filters\Cors|Cors]] <a name="cors"></a> + +Cross-origin resource sharing [CORS](https://developer.mozilla.org/fr/docs/HTTP/Access_control_CORS) is a mechanism that allows many resources (e.g. fonts, JavaScript, etc.) +on a Web page to be requested from another domain outside the domain the resource originated from. +In particular, JavaScript's AJAX calls can use the XMLHttpRequest mechanism. Such "cross-domain" requests would +otherwise be forbidden by Web browsers, per the same origin security policy. +CORS defines a way in which the browser and the server can interact to determine whether or not to allow the cross-origin request. + +The [[yii\filters\Cors|Cors filter]] should be defined before Authentication / Authorization filters to make sure the CORS headers +will always be sent. + +```php +use yii\filters\Cors; +use yii\helpers\ArrayHelper; + +public function behaviors() +{ + return ArrayHelper::merge([ + [ + 'class' => Cors::className(), + ], + ], parent::behaviors()); +} +``` + +The Cors filtering could be tuned using the `cors` property. + +* `cors['Origin']`: array used to define allowed origins. Can be `['*']` (everyone) or `['http://www.myserver.net', 'http://www.myotherserver.com']`. Default to `['*']`. +* `cors['Access-Control-Request-Method']`: array of allowed verbs like `['GET', 'OPTIONS', 'HEAD']`. Default to `['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']`. +* `cors['Access-Control-Request-Headers']`: array of allowed headers. Can be `['*']` all headers or specific ones `['X-Request-With']`. Default to `['*']`. +* `cors['Access-Control-Allow-Credentials']`: define if current request can be made using credentials. Can be `true`, `false` or `null` (not set). Default to `null`. +* `cors['Access-Control-Max-Age']`: define lifetime of pre-flight request. Default to `86400`. + +For example, allowing CORS for origin : `http://www.myserver.net` with method `GET`, `HEAD` and `OPTIONS` : + +```php +use yii\filters\Cors; +use yii\helpers\ArrayHelper; + +public function behaviors() +{ + return ArrayHelper::merge([ + [ + 'class' => Cors::className(), + 'cors' => [ + 'Origin' => ['http://www.myserver.net'], + 'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'], + ], + ], + ], parent::behaviors()); +} +``` + +You may tune the CORS headers by overriding default parameters on a per action basis. +For example adding the `Access-Control-Allow-Credentials` for the `login` action could be done like this : + +```php +use yii\filters\Cors; +use yii\helpers\ArrayHelper; + +public function behaviors() +{ + return ArrayHelper::merge([ + [ + 'class' => Cors::className(), + 'cors' => [ + 'Origin' => ['http://www.myserver.net'], + 'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'], + ], + 'actions' => [ + 'login' => [ + 'Access-Control-Allow-Credentials' => true, + ] + ] + ], + ], parent::behaviors()); +} +``` -- libgit2 0.27.1