Commit 4dedd5aa by artur

Merge branch 'master' of github.com:yiisoft/yii2

parents d2fcbcc0 d7a251bb
...@@ -8,9 +8,7 @@ ...@@ -8,9 +8,7 @@
namespace yii\build\controllers; namespace yii\build\controllers;
use Yii; use Yii;
use yii\base\InvalidParamException;
use yii\console\Controller; use yii\console\Controller;
use yii\helpers\Console;
use yii\helpers\FileHelper; use yii\helpers\FileHelper;
/** /**
...@@ -77,6 +75,12 @@ class AppController extends Controller ...@@ -77,6 +75,12 @@ class AppController extends Controller
$this->stdout("done.\n"); $this->stdout("done.\n");
} }
/**
* Finds linkable applications
*
* @param string $dir directory to search in
* @return array list of applications command can link
*/
protected function findDirs($dir) protected function findDirs($dir)
{ {
$list = []; $list = [];
......
...@@ -32,9 +32,11 @@ Application Structure ...@@ -32,9 +32,11 @@ Application Structure
* [Entry Scripts](structure-entry-scripts.md) * [Entry Scripts](structure-entry-scripts.md)
* [Applications](structure-applications.md) * [Applications](structure-applications.md)
* [Controllers and Actions](structure-controllers.md) * [Application Components](structure-application-components.md)
* [Controllers](structure-controllers.md)
* [Views](structure-views.md) * [Views](structure-views.md)
* [Models](structure-models.md) * [Models](structure-models.md)
* **TBD** [Filters](structure-filters.md)
* **TBD** [Widgets](structure-widgets.md) * **TBD** [Widgets](structure-widgets.md)
* **TBD** [Modules](structure-modules.md) * **TBD** [Modules](structure-modules.md)
* **TBD** [Extensions](structure-extensions.md) * **TBD** [Extensions](structure-extensions.md)
...@@ -49,7 +51,7 @@ Handling Requests ...@@ -49,7 +51,7 @@ Handling Requests
* **TBD** [Responses](runtime-responses.md) * **TBD** [Responses](runtime-responses.md)
* **TBD** [Sessions and Cookies](runtime-sessions-cookies.md) * **TBD** [Sessions and Cookies](runtime-sessions-cookies.md)
* [URL Parsing and Generation](runtime-url-handling.md) * [URL Parsing and Generation](runtime-url-handling.md)
* **TBD** [Filtering](runtime-filtering.md)
Key Concepts Key Concepts
......
Application Components
======================
Applications are [service locators](concept-service-locators.md). They host a set of the so-called
*application components* that provide different services for processing requests. For example,
the `urlManager` component is responsible for routing Web requests to appropriate controllers;
the `db` component provides DB-related services; and so on.
Each application component has an ID that uniquely identifies itself among other application components
in the same application. You can access an application component through the expression
```php
\Yii::$app->ComponentID
```
For example, you can use `\Yii::$app->db` to get the [[yii\db\Connection|DB connection]],
and `\Yii::$app->cache` to get the [[yii\caching\Cache|primary cache]] registered with the application.
Application components can be any objects. You can register them by configuring
the [[yii\base\Application::components]] property in [application configurations](structure-applications.md#application-configurations).
For example,
```php
[
'components' => [
// register "cache" component using a class name
'cache' => 'yii\caching\ApcCache',
// register "db" component using a configuration array
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
'username' => 'root',
'password' => '',
],
// register "search" component using an anonymous function
'search' => function () {
return new app\components\SolrService;
},
],
]
```
> Info: While you can register as many application components as you want, you should do this judiciously.
Application components are like global variables. Using too many application components can potentially
make your code harder to test and maintain. In many cases, you can simply create a local component
and use it when needed.
## Core Application Components <a name="core-application-components"></a>
Yii defines a set of *core* application components with fixed IDs and default configurations. For example,
the [[yii\web\Application::request|request]] component is used to collect information about
a user request and resolve it into a [route](runtime-routing.md); the [[yii\base\Application::db|db]]
component represents a database connection through which you can perform database queries.
It is with help of these core application components that Yii applications are able to handle user requests.
Below is the list of the predefined core application components. You may configure and customize them
like you do with normal application components. When you are configuring a core application component,
if you do not specify its class, the default one will be used.
* [[yii\web\AssetManager|assetManager]]: manages asset bundles and asset publishing.
Please refer to the [Managing Assets](output-assets.md) section for more details.
* [[yii\db\Connection|db]]: represents a database connection through which you can perform DB queries.
Note that when you configure this component, you must specify the component class as well as other required
component properties, such as [[yii\db\Connection::dsn]].
Please refer to the [Data Access Objects](db-dao.md) section for more details.
* [[yii\base\Application::errorHandler|errorHandler]]: handles PHP errors and exceptions.
Please refer to the [Handling Errors](tutorial-handling-errors.md) section for more details.
* [[yii\base\Formatter|formatter]]: formats data when they are displayed to end users. For example, a number
may be displayed with thousand separator, a date may be formatted in long format.
Please refer to the [Data Formatting](output-formatting.md) section for more details.
* [[yii\i18n\I18N|i18n]]: supports message translation and formatting.
Please refer to the [Internationalization](tutorial-i18n.md) section for more details.
* [[yii\log\Dispatcher|log]]: manages log targets.
Please refer to the [Logging](tutorial-logging.md) section for more details.
* [[yii\swiftmailer\Mailer|mail]]: supports mail composing and sending.
Please refer to the [Mailing](tutorial-mailing.md) section for more details.
* [[yii\base\Application::response|response]]: represents the response being sent to end users.
Please refer to the [Responses](runtime-responses.md) section for more details.
* [[yii\base\Application::request|request]]: represents the request received from end users.
Please refer to the [Requests](runtime-requests.md) section for more details.
* [[yii\web\Session|session]]: represents the session information. This component is only available
in [[yii\web\Application|Web applications]].
Please refer to the [Sessions and Cookies](runtime-sessions-cookies.md) section for more details.
* [[yii\web\UrlManager|urlManager]]: supports URL parsing and creation.
Please refer to the [URL Parsing and Generation](runtime-url-handling.md) section for more details.
* [[yii\web\User|user]]: represents the user authentication information. This component is only available
in [[yii\web\Application|Web applications]]
Please refer to the [Authentication](security-authentication.md) section for more details.
* [[yii\web\View|view]]: supports view rendering.
Please refer to the [Views](structure-views.md) section for more details.
...@@ -177,7 +177,7 @@ The rest of the array elements (key-value pairs) specify the parameters to be bo ...@@ -177,7 +177,7 @@ The rest of the array elements (key-value pairs) specify the parameters to be bo
#### [[yii\base\Application::components|components]] <a name="components"></a> #### [[yii\base\Application::components|components]] <a name="components"></a>
This is the single most important property. It allows you to register a list of named components This is the single most important property. It allows you to register a list of named components
called [application components](#application-components) that you can use in other places. For example, called [application components](#structure-application-components.md) that you can use in other places. For example,
```php ```php
[ [
...@@ -199,7 +199,7 @@ while the value represents the component class name or [configuration](concept-c ...@@ -199,7 +199,7 @@ while the value represents the component class name or [configuration](concept-c
You can register any component with an application, and the component can later be accessed globally You can register any component with an application, and the component can later be accessed globally
using the expression `\Yii::$app->ComponentID`. using the expression `\Yii::$app->ComponentID`.
Please read the [application components](#application-components) section for details. Please read the [Application Components](structure-application-components.md) section for details.
#### [[yii\base\Application::controllerMap|controllerMap]] <a name="controllerMap"></a> #### [[yii\base\Application::controllerMap|controllerMap]] <a name="controllerMap"></a>
...@@ -217,7 +217,7 @@ specific controllers. In the following example, `account` will be mapped to ...@@ -217,7 +217,7 @@ specific controllers. In the following example, `account` will be mapped to
'account' => 'app\controllers\UserController', 'account' => 'app\controllers\UserController',
'article' => [ 'article' => [
'class' => 'app\controllers\PostController', 'class' => 'app\controllers\PostController',
'pageTitle' => 'something new', 'enableCsrfValidation' => false,
], ],
], ],
], ],
...@@ -569,71 +569,6 @@ as for that of `beforeAction`. That is, controllers are the first objects trigge ...@@ -569,71 +569,6 @@ as for that of `beforeAction`. That is, controllers are the first objects trigge
followed by modules (if any), and finally applications. followed by modules (if any), and finally applications.
## Application Components <a name="application-components"></a>
Applications are [service locators](concept-service-locators.md). They host a set of the so-called
*application components* that provide different services for processing requests. For example,
the `urlManager` component is responsible for routing Web requests to appropriate controllers;
the `db` component provides DB-related services; and so on.
Each application component has an ID that uniquely identifies itself among other application components
in the same application. You can access an application component through the expression `$app->ID`,
where `$app` refers to an application instance, and `ID` stands for the ID of an application component.
For example, you can use `Yii::$app->db` to get the [[yii\db\Connection|DB connection]], and `Yii::$app->cache`
to get the [[yii\caching\Cache|primary cache]] registered with the application.
Application components can be any objects. You can register them with an application to make them
globally accessible. This is usually done by configuring the [[yii\base\Application::components]] property,
as described in the [components](#components) subsection.
> Info: While you can register as many application components as you want, you should do this judiciously.
Application components are like global variables. Using too many application components can potentially
make your code harder to test and maintain. In many cases, you can simply create a local component
and use it when needed.
Yii defines a set of *core* application components with fixed IDs and default configurations. For example,
the [[yii\web\Application::request|request]] component is used to collect information about
a user request and resolve it into a [route](runtime-routing.md); the [[yii\base\Application::db|db]]
component represents a database connection through which you can perform database queries.
It is with help of these core application components that Yii applications are able to handle user requests.
Below is the list of the predefined core application components. You may configure and customize them
like you do with normal application components. When you are configuring a core application component,
if you do not specify its class, the default one will be used.
* [[yii\web\AssetManager|assetManager]]: manages asset bundles and asset publishing.
Please refer to the [Managing Assets](output-assets.md) section for more details.
* [[yii\db\Connection|db]]: represents a database connection through which you can perform DB queries.
Note that when you configure this component, you must specify the component class as well as other required
component properties, such as [[yii\db\Connection::dsn]].
Please refer to the [Data Access Objects](db-dao.md) section for more details.
* [[yii\base\Application::errorHandler|errorHandler]]: handles PHP errors and exceptions.
Please refer to the [Handling Errors](tutorial-handling-errors.md) section for more details.
* [[yii\base\Formatter|formatter]]: formats data when they are displayed to end users. For example, a number
may be displayed with thousand separator, a date may be formatted in long format.
Please refer to the [Data Formatting](output-formatting.md) section for more details.
* [[yii\i18n\I18N|i18n]]: supports message translation and formatting.
Please refer to the [Internationalization](tutorial-i18n.md) section for more details.
* [[yii\log\Dispatcher|log]]: manages log targets.
Please refer to the [Logging](tutorial-logging.md) section for more details.
* [[yii\swiftmailer\Mailer|mail]]: supports mail composing and sending.
Please refer to the [Mailing](tutorial-mailing.md) section for more details.
* [[yii\base\Application::response|response]]: represents the response being sent to end users.
Please refer to the [Responses](runtime-responses.md) section for more details.
* [[yii\base\Application::request|request]]: represents the request received from end users.
Please refer to the [Requests](runtime-requests.md) section for more details.
* [[yii\web\Session|session]]: represents the session information. This component is only available
in [[yii\web\Application|Web applications]].
Please refer to the [Sessions and Cookies](runtime-sessions-cookies.md) section for more details.
* [[yii\web\UrlManager|urlManager]]: supports URL parsing and creation.
Please refer to the [URL Parsing and Generation](runtime-url-handling.md) section for more details.
* [[yii\web\User|user]]: represents the user authentication information. This component is only available
in [[yii\web\Application|Web applications]]
Please refer to the [Authentication](security-authentication.md) section for more details.
* [[yii\web\View|view]]: supports view rendering.
Please refer to the [Views](structure-views.md) section for more details.
## Application Lifecycle <a name="application-lifecycle"></a> ## Application Lifecycle <a name="application-lifecycle"></a>
When an [entry script](structure-entry-scripts.md) is being executed to handle a request, When an [entry script](structure-entry-scripts.md) is being executed to handle a request,
......
Controller Controllers
========== ===========
> Note: This section is under development. Controllers are part of the [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) architecture.
They contain the actual logic about processing requests and generating responses. In particular, after
taking over the control from [applications](structure-applications.md), controllers will analyze incoming request data,
pass them to [models](structure-models.md), inject model results into [views](structure-views.md),
and finally generate outgoing responses.
Controller is one of the key parts of the application. It determines how to handle incoming request and creates a response. Controllers are composed by *actions*, each of which deals with one particular type of request. A controller
can have one or multiple actions.
Most often a controller takes HTTP request data and returns HTML, JSON or XML as a response. > Info: You may consider a controller as a grouping of similar actions. The controller provides an environment
for sharing common data among its actions.
Basics
------
Controller resides in application's `controllers` directory and is named like `SiteController.php`, ## IDs and Routes
where the `Site` part could be anything describing a set of actions it contains.
The basic web controller is a class that extends [[yii\web\Controller]] and could be very simple: Both controllers and actions have IDs. Controller IDs are used to uniquely identify controllers within the same
application, while actions IDs are used to identify actions within the same controller. The combination of
a controller ID and an action ID forms a *route* which takes the format of `ControllerID/ActionID`.
End users can address any controller action through the corresponding route. For example, the URL
`http://hostname/index.php?r=site/index` specifies that the request should be handled by the `site` controller
using its `index` action.
By default, controller and action IDs should contain lower-case alphanumeric characters and dashes only.
For example, `site`, `index`, `post-comment` and `comment2` are all valid controller/action IDs, while
`Site`, `postComment` and `index?` are not. To use other characters in the IDs, you should configure
[[yii\base\Application::controllerMap]] and/or override [[yii\base\Controller::actions()]].
In practice, a controller is often designed to handle the requests about a specific type of resource,
while each action within it supports a specific manipulation about that resource type. For this reason,
controller IDs are often nouns, while action IDs are often verbs. For example, you may create an `article`
controller to handle all requests about article data; and within the `article` controller, you may create
actions such as `create`, `update`, `delete` to support the corresponding manipulations about articles.
## Creating Controllers
In [[yii\web\Application|Web applications]], controllers should extend from [[yii\web\Controller]] or its
child classes. Similarly in [[yii\console\Application|console applications]], controllers should extend from
[[yii\console\Controller]] or its child classes.
Controller classes should be [autoloadable](concept-autoloading.md). They should be created under
the namespace as specified by [[yii\base\Application::controllerNamespace]]. By default, it is `app\controllers`.
This means controller classes should usually be located under the path aliased as `@app/controllers`.
The following code defines a `site` controller:
```php
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
}
```
As aforementioned, the class should be saved in the file `@app/controllers/SiteController.php`.
### Controller Class Naming
The controller class name `SiteController` is derived from the controller ID `site` according to the following rules:
* Turn the first letter in each word into upper case;
* Remove dashes;
* Append the suffix `Controller`.
For example, `site` becomes `SiteController`, and `post-comment` becomes `PostCommentController`.
If you want to name controller classes in a different way, you may configure the [[yii\base\Application::controllerMap]]
property, like the following in an [application configuration](structure-applications.md#application-configurations):
```php
[
'controllerMap' => [
[
'account' => 'app\controllers\UserController',
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
],
]
```
## Creating Actions
You can create actions in two ways: inline actions and standalone actions. An inline action is
defined as a method in the controller class, while a standalone action is a class extending
[[yii\base\Action]] or its child class. Inline actions take less effort to create and are often preferred
if you have no intention to reuse these actions. Standalone actions, on the other hand, are mainly
created to be used in different controllers or be redistributed as [extensions](structure-extensions.md).
### Inline Actions
Inline actions are defined in terms of *public* `action*` methods in controller classes. The following code defines
two actions `index` and `hello-world`.
```php ```php
namespace app\controllers; namespace app\controllers;
...@@ -24,62 +112,117 @@ class SiteController extends Controller ...@@ -24,62 +112,117 @@ class SiteController extends Controller
{ {
public function actionIndex() public function actionIndex()
{ {
// will render view from "views/site/index.php"
return $this->render('index'); return $this->render('index');
} }
public function actionTest() public function actionHelloWorld()
{ {
// will just print "test" to the browser return 'Hello World';
return 'test';
} }
} }
``` ```
As you can see, typical controller contains actions that are public class methods named as `actionSomething`. Action IDs for inline actions must contain lower-case alphanumeric characters and dashes only. And the names
The output of an action is what the method returns: it could be a string or an instance of [[yii\web\Response]], [for example](#custom-response-class). of the `action*` methods are derived from action IDs according to the following criteria:
The return value will be handled by the `response` application
component which can convert the output to different formats such as JSON for example. The default behavior
is to output the value unchanged though.
* Turn the first letter in each word of the action ID into upper case;
* Remove dashes;
* Prepend the prefix `action`.
Routes For example, `index` becomes `actionIndex`, and `hello-world` becomes `actionHelloWorld`, as shown in the
------ above example.
Each controller action has a corresponding internal route. In our example above `actionIndex` has `site/index` route > Note: The names of `action*` methods are *case-sensitive*. If you have a method named `ActionIndex`,
and `actionTest` has `site/test` route. In this route `site` is referred to as controller ID while `test` is action ID. it will not be considered as an `action*` method, and as a result, the request for the `index` action
will result in an exception. Also note that `action*` methods must be public. A private or protected
`action*` method does NOT define an inline action.
By default you can access specific controller and action using the `http://example.com/?r=controller/action` URL. This The return value of an `action*` method can be either a [response](runtime-responses.md) object or
behavior is fully customizable. For more details please refer to [URL Management](url.md). the data to be populated into a [response](runtime-responses.md). In particular, for Web applications,
the data will be assigned to [[yii\web\Response::data]], while for console applications, the data
will be assigned to [[yii\console\Response::exitStatus]]. In the example above, each action returns
a string which will be assigned to [[yii\web\Response::data]] and further displayed to end users.
If a controller is located inside a module, the route of its actions will be in the format of `module/controller/action`. Inline actions are preferred in most cases because they take little effort to create. However, if an action
can be reused in another controller or application, you may consider defining it as a standalone action.
A controller can be located under a subdirectory of the controller directory of an application or module. The route
will be prefixed with the corresponding directory names. For example, you may have a `UserController` under `controllers/admin`.
The route of its `actionIndex` would be `admin/user/index`, and `admin/user` would be the controller ID.
In case module, controller or action specified isn't found Yii will return "not found" page and HTTP status code 404. ### Standalone Actions
> Note: If module name, controller name or action name contains camelCased words, internal route will use dashes i.e. for Standalone actions are defined in terms of action classes extending [[yii\base\Action]] or its child classes.
`DateTimeController::actionFastForward` route will be `date-time/fast-forward`. For example, in the Yii releases, there are [[yii\web\ViewAction]] a nd [[yii\web\ErrorAction]], both of which
are standalone actions.
To use a standalone action, you should override the [[yii\base\Controller::actions()]] method in your
controller classes like the following:
```php
public function actions()
{
return [
// declares "error" action using a class name
'error' => 'yii\web\ErrorAction',
// declares "view" action using a configuration array
'view' => [
'class' => 'yii\web\ViewAction',
'viewPrefix' => '',
],
];
}
```
The method should return an array whose keys are action IDs and values the corresponding action class names
or [configurations](concept-configurations.md).
Action IDs for standalone actions can contain arbitrary characters, as long as they are declared in
the [[yii\base\Controller::actions()]] method.
To create a standalone action class, you should extend [[yii\base\Action]] or its child class, and implement
a public method named `run()`. The role of the `run()` method is similar to an inline action method. For example,
```php
<?php
namespace app\components;
use yii\base\Action;
class DemoAction extends Action
{
public function run()
{
return "Hello World";
}
}
```
### Default Action
Each controller has a default action specified via the [[yii\base\Controller::defaultAction]] property.
When a [route](#ids-routes) contains the controller ID only, it implies that the default action of
the specified controller is requested.
### Defaults By default, the default action is set as `index`. If you want to change the default value, simply override
this property in the controller class, like the following:
If user isn't specifying any route i.e. using URL like `http://example.com/`, Yii assumes that default route should be ```php
used. It is determined by [[yii\web\Application::defaultRoute]] method and is `site` by default meaning that `SiteController` namespace app\controllers;
will be loaded.
A controller has a default action. When the user request does not specify which action to execute by using an URL such as use yii\web\Controller;
`http://example.com/?r=site`, the default action will be executed. By default, the default action is named as `index`.
It can be changed by setting the [[yii\base\Controller::defaultAction]] property.
Action parameters class SiteController extends Controller
----------------- {
public $defaultAction = 'home';
It was already mentioned that a simple action is just a public method named as `actionSomething`. Now we'll review public function actionHome()
ways that an action can get parameters from HTTP. {
return $this->render('home');
}
}
```
### Action parameters ### Action Parameters
You can define named arguments for an action and these will be automatically populated from corresponding values from You can define named arguments for an action and these will be automatically populated from corresponding values from
`$_GET`. This is very convenient both because of the short syntax and an ability to specify defaults: `$_GET`. This is very convenient both because of the short syntax and an ability to specify defaults:
...@@ -112,6 +255,9 @@ The action above can be accessed using either `http://example.com/?r=blog/view&i ...@@ -112,6 +255,9 @@ The action above can be accessed using either `http://example.com/?r=blog/view&i
`http://example.com/?r=blog/view&id=42&version=3`. In the first case `version` isn't specified and default parameter `http://example.com/?r=blog/view&id=42&version=3`. In the first case `version` isn't specified and default parameter
value is used instead. value is used instead.
### Action Patterns
### Getting data from request ### Getting data from request
If your action is working with data from HTTP POST or has too many GET parameters you can rely on request object that If your action is working with data from HTTP POST or has too many GET parameters you can rely on request object that
...@@ -144,141 +290,21 @@ class BlogController extends Controller ...@@ -144,141 +290,21 @@ class BlogController extends Controller
} }
``` ```
Standalone actions
------------------
If action is generic enough it makes sense to implement it in a separate class to be able to reuse it.
Create `actions/Page.php`
```php
namespace app\actions;
class Page extends \yii\base\Action
{
public $view = 'index';
public function run()
{
return $this->controller->render($view);
}
}
```
The following code is too simple to implement as a separate action but gives an idea of how it works. Action implemented
can be used in your controller as following:
```php
class SiteController extends \yii\web\Controller
{
public function actions()
{
return [
'about' => [
'class' => 'app\actions\Page',
'view' => 'about',
],
];
}
}
```
After doing so you can access your action as `http://example.com/?r=site/about`.
Action Filters
--------------
You may apply some action filters to controller actions to accomplish tasks such as determining
who can access the current action, decorating the result of the action, etc.
An action filter is an instance of a class extending [[yii\base\ActionFilter]].
To use an action filter, attach it as a behavior to a controller or a module. The following ## Controllers in Modules and Subdirectories
example shows how to enable HTTP caching for the `index` action:
```php If a controller is located inside a module, the route of its actions will be in the format of `module/controller/action`.
public function behaviors()
{
return [
'httpCache' => [
'class' => \yii\filters\HttpCache::className(),
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('user')->max('updated_at');
},
],
];
}
```
You may use multiple action filters at the same time. These filters will be applied in the
order they are declared in `behaviors()`. If any of the filter cancels the action execution,
the filters after it will be skipped.
When you attach a filter to a controller, it can be applied to all actions of that controller;
If you attach a filter to a module (or application), it can be applied to the actions of any controller
within that module (or application).
To create a new action filter, extend from [[yii\base\ActionFilter]] and override the
[[yii\base\ActionFilter::beforeAction()|beforeAction()]] and [[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 `beforeAction()` of a filter returns false, the filters after this one
will be skipped and the action will not be executed.
The [authorization](authorization.md) section of this guide shows how to use the [[yii\filters\AccessControl]] filter,
and the [caching](caching.md) section gives more details about the [[yii\filters\PageCache]] and [[yii\filters\HttpCache]] filters.
These built-in filters are also good references when you learn to create your own filters.
Catching all incoming requests
------------------------------
Sometimes it is useful to handle all incoming requests with a single controller action. For example, displaying a notice
when website is in maintenance mode. In order to do it you should configure web application `catchAll` property either
dynamically or via application config:
```php
return [
'id' => 'basic',
'basePath' => dirname(__DIR__),
// ...
'catchAll' => [ // <-- here
'offline/notice',
'param1' => 'value1',
'param2' => 'value2',
],
]
```
In the above `offline/notice` refer to `OfflineController::actionNotice()`. `param1` and `param2` are parameters passed A controller can be located under a subdirectory of the controller directory of an application or module. The route
to action method. will be prefixed with the corresponding directory names. For example, you may have a `UserController` under `controllers/admin`.
The route of its `actionIndex` would be `admin/user/index`, and `admin/user` would be the controller ID.
Custom response class In case module, controller or action specified isn't found Yii will return "not found" page and HTTP status code 404.
---------------------
```php
namespace app\controllers;
use yii\web\Controller; > Note: If module name, controller name or action name contains camelCased words, internal route will use dashes i.e. for
use app\components\web\MyCustomResponse; #extended from yii\web\Response `DateTimeController::actionFastForward` route will be `date-time/fast-forward`.
class SiteController extends Controller
{
public function actionCustom()
{
/*
* do your things here
* since Response in extended from yii\base\Object, you can initialize its values by passing in
* __constructor() simple array.
*/
return new MyCustomResponse(['data' => $myCustomData]);
}
}
```
See also ## Controller Lifecycle <a name="lifecycle"></a>
--------
- [Console](console.md)
You may apply some action filters to controller actions to accomplish tasks such as determining
who can access the current action, decorating the result of the action, etc.
An action filter is an instance of a class extending [[yii\base\ActionFilter]].
To use an action filter, attach it as a behavior to a controller or a module. The following
example shows how to enable HTTP caching for the `index` action:
```php
public function behaviors()
{
return [
'httpCache' => [
'class' => \yii\filters\HttpCache::className(),
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('user')->max('updated_at');
},
],
];
}
```
You may use multiple action filters at the same time. These filters will be applied in the
order they are declared in `behaviors()`. If any of the filter cancels the action execution,
the filters after it will be skipped.
When you attach a filter to a controller, it can be applied to all actions of that controller;
If you attach a filter to a module (or application), it can be applied to the actions of any controller
within that module (or application).
To create a new action filter, extend from [[yii\base\ActionFilter]] and override the
[[yii\base\ActionFilter::beforeAction()|beforeAction()]] and [[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 `beforeAction()` of a filter returns false, the filters after this one
will be skipped and the action will not be executed.
The [authorization](authorization.md) section of this guide shows how to use the [[yii\filters\AccessControl]] filter,
and the [caching](caching.md) section gives more details about the [[yii\filters\PageCache]] and [[yii\filters\HttpCache]] filters.
These built-in filters are also good references when you learn to create your own filters.
...@@ -11,7 +11,6 @@ namespace yii\apidoc\helpers; ...@@ -11,7 +11,6 @@ namespace yii\apidoc\helpers;
use cebe\jssearch\Indexer; use cebe\jssearch\Indexer;
use cebe\jssearch\tokenizer\StandardTokenizer; use cebe\jssearch\tokenizer\StandardTokenizer;
use cebe\jssearch\TokenizerInterface; use cebe\jssearch\TokenizerInterface;
use yii\helpers\StringHelper;
class ApiIndexer extends Indexer class ApiIndexer extends Indexer
{ {
......
...@@ -9,7 +9,6 @@ namespace yii\apidoc\helpers; ...@@ -9,7 +9,6 @@ namespace yii\apidoc\helpers;
use cebe\markdown\GithubMarkdown; use cebe\markdown\GithubMarkdown;
use phpDocumentor\Reflection\DocBlock\Type\Collection; use phpDocumentor\Reflection\DocBlock\Type\Collection;
use yii\apidoc\models\MethodDoc;
use yii\apidoc\models\TypeDoc; use yii\apidoc\models\TypeDoc;
use yii\apidoc\renderers\BaseRenderer; use yii\apidoc\renderers\BaseRenderer;
use yii\helpers\Inflector; use yii\helpers\Inflector;
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
namespace yii\apidoc\helpers; namespace yii\apidoc\helpers;
use cebe\markdown\GithubMarkdown;
use phpDocumentor\Reflection\DocBlock\Type\Collection; use phpDocumentor\Reflection\DocBlock\Type\Collection;
use yii\apidoc\models\MethodDoc; use yii\apidoc\models\MethodDoc;
use yii\apidoc\models\TypeDoc; use yii\apidoc\models\TypeDoc;
......
...@@ -9,11 +9,9 @@ namespace yii\apidoc\templates\pdf; ...@@ -9,11 +9,9 @@ namespace yii\apidoc\templates\pdf;
use cebe\markdown\latex\GithubMarkdown; use cebe\markdown\latex\GithubMarkdown;
use Yii; use Yii;
use yii\apidoc\helpers\ApiIndexer;
use yii\apidoc\helpers\ApiMarkdownLaTeX; use yii\apidoc\helpers\ApiMarkdownLaTeX;
use yii\apidoc\helpers\IndexFileAnalyzer; use yii\apidoc\helpers\IndexFileAnalyzer;
use yii\helpers\Console; use yii\helpers\Console;
use yii\helpers\FileHelper;
/** /**
* *
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
namespace yii\elasticsearch; namespace yii\elasticsearch;
use yii\base\NotSupportedException;
use yii\db\ActiveQueryInterface; use yii\db\ActiveQueryInterface;
use yii\db\ActiveQueryTrait; use yii\db\ActiveQueryTrait;
use yii\db\ActiveRelationTrait; use yii\db\ActiveRelationTrait;
......
...@@ -38,6 +38,7 @@ Yii Framework 2 Change Log ...@@ -38,6 +38,7 @@ Yii Framework 2 Change Log
- Bug #3601: Fixed the bug that the refresh URL was not generated correctly by `Captcha` (qiangxue, klevron) - Bug #3601: Fixed the bug that the refresh URL was not generated correctly by `Captcha` (qiangxue, klevron)
- Bug: Fixed inconsistent return of `\yii\console\Application::runAction()` (samdark) - Bug: Fixed inconsistent return of `\yii\console\Application::runAction()` (samdark)
- Bug: URL encoding for the route parameter added to `\yii\web\UrlManager` (klimov-paul) - Bug: URL encoding for the route parameter added to `\yii\web\UrlManager` (klimov-paul)
- Bug: Fixed the bug that requesting protected or private action methods would cause 500 error instead of 404 (qiangxue)
- Enh #2264: `CookieCollection::has()` will return false for expired or removed cookies (qiangxue) - Enh #2264: `CookieCollection::has()` will return false for expired or removed cookies (qiangxue)
- Enh #2435: `yii\db\IntegrityException` is now thrown on database integrity errors instead of general `yii\db\Exception` (samdark) - Enh #2435: `yii\db\IntegrityException` is now thrown on database integrity errors instead of general `yii\db\Exception` (samdark)
- Enh #2837: Error page now shows arguments in stack trace method calls (samdark) - Enh #2837: Error page now shows arguments in stack trace method calls (samdark)
......
...@@ -216,7 +216,7 @@ class Controller extends Component implements ViewContextInterface ...@@ -216,7 +216,7 @@ class Controller extends Component implements ViewContextInterface
$methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $id)))); $methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $id))));
if (method_exists($this, $methodName)) { if (method_exists($this, $methodName)) {
$method = new \ReflectionMethod($this, $methodName); $method = new \ReflectionMethod($this, $methodName);
if ($method->getName() === $methodName) { if ($method->isPublic() && $method->getName() === $methodName) {
return new InlineAction($id, $this, $methodName); return new InlineAction($id, $this, $methodName);
} }
} }
......
...@@ -10,7 +10,6 @@ namespace yii\console\controllers; ...@@ -10,7 +10,6 @@ namespace yii\console\controllers;
use Yii; use Yii;
use yii\console\Exception; use yii\console\Exception;
use yii\console\Controller; use yii\console\Controller;
use yii\helpers\StringHelper;
use yii\helpers\VarDumper; use yii\helpers\VarDumper;
/** /**
......
...@@ -7,8 +7,6 @@ ...@@ -7,8 +7,6 @@
namespace yii\helpers; namespace yii\helpers;
use yii\base\Arrayable;
/** /**
* BaseVarDumper provides concrete implementation for [[VarDumper]]. * BaseVarDumper provides concrete implementation for [[VarDumper]].
* *
......
...@@ -9,7 +9,6 @@ namespace yii\rest; ...@@ -9,7 +9,6 @@ namespace yii\rest;
use Yii; use Yii;
use yii\base\Model; use yii\base\Model;
use yii\db\ActiveRecord;
use yii\helpers\Url; use yii\helpers\Url;
/** /**
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
namespace yii\rest; namespace yii\rest;
use Yii; use Yii;
use yii\db\ActiveRecord;
/** /**
* DeleteAction implements the API endpoint for deleting a model. * DeleteAction implements the API endpoint for deleting a model.
......
<?php <?php
namespace yiiunit\framework\helpers; namespace yiiunit\framework\helpers;
use yii\data\ArrayDataProvider;
use yii\helpers\VarDumper; use yii\helpers\VarDumper;
use yiiunit\TestCase; use yiiunit\TestCase;
......
...@@ -4,7 +4,6 @@ namespace yiiunit\framework\rbac; ...@@ -4,7 +4,6 @@ namespace yiiunit\framework\rbac;
use Yii; use Yii;
use yii\console\Application; use yii\console\Application;
use yii\console\Controller; use yii\console\Controller;
use yii\console\controllers\MigrateController;
use yii\db\Connection; use yii\db\Connection;
use yii\rbac\DbManager; use yii\rbac\DbManager;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment