From 55c4b61840cfe1e9d112ebf161f1ff88dcbab1e0 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 30 Oct 2014 19:20:48 +0900 Subject: [PATCH 001/144] docs/guide-ja/structure-application-components.md added [ci skip] --- docs/guide-ja/structure-application-components.md | 119 ++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 docs/guide-ja/structure-application-components.md diff --git a/docs/guide-ja/structure-application-components.md b/docs/guide-ja/structure-application-components.md new file mode 100644 index 0000000..667b423 --- /dev/null +++ b/docs/guide-ja/structure-application-components.md @@ -0,0 +1,119 @@ +アプリケーションコンポーネント +============================== + +アプリケーションは [サービスロケータ](concept-service-locator.md) です。 +アプリケーションは、リクエストを処理するためのいろいろなサービスを提供する一連のオブジェクト、いわゆる *アプリケーションコンポーネント* をホストします。 +例えば、`urlManager` がウェブリクエストを適切なコントローラにルーティングする役割を負い、 +`db` コンポーネントが DB 関連のサービスを提供する、等々です。 + +全てのアプリケーションコンポーネントは、それぞれ、同一のアプリケーション内で他のアプリケーションコンポーネントから区別できるように、ユニークな ID を持ちます。 +アプリケーションコンポーネントには、次の式によってアクセス出来ます: + +```php +\Yii::$app->componentID +``` + +例えば、`\Yii::$app->db` を使って、アプリケーションに登録された [[yii\db\Connection|DB 接続]] を取得することが出来ます。 +また、`\Yii::$app->cache` を使って、[[yii\caching\Cache|プライマリキャッシュ]] を取得できます。 + +アプリケーションコンポーネントは、上記の式を使ってアクセスされた最初の時に作成されます。 +二度目以降のアクセスでは、同じコンポーネントのインスタンスが返されます。 + +どのようなオブジェクトでも、アプリケーションコンポーネントとすることが可能です。 +[アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の中で [[yii\base\Application::components]] プロパティを構成することによって、アプリケーションコンポーネントを登録することが出来ます。 +例えば、 + +```php +[ + 'components' => [ + // クラス名を使って "cache" コンポーネントを登録 + 'cache' => 'yii\caching\ApcCache', + + // コンフィギュレーション配列を使って "db" コンポーネントを登録 + 'db' => [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=demo', + 'username' => 'root', + 'password' => '', + ], + + // 無名関数を使って "search" コンポーネントを登録 + 'search' => function () { + return new app\components\SolrService; + }, + ], +] +``` + +> Info|情報: 必要なだけ多くのアプリケーションコンポーネントを登録することが出来ますが、慎重にしなければなりません。 + アプリケーションコンポーネントはグローバル変数のようなものです。あまり多くのアプリケーションコンポーネントを使うと + コードのテストと保守が困難になるおそれがあります。 + 多くの場合、必要なときにローカルなコンポーネントを作成して使用するだけで十分です。 + + +## コンポーネントをブートストラップに含める + +上述のように、アプリケーションコンポーネントは最初にアクセスされた時に初めてインスタンスが作成されます。 +リクエストの間に全くアクセスされなかった時は、インスタンスは作成されません。けれども、場合によっては、 +明示的にアクセスされないときでも、リクエストごとにアプリケーションコンポーネントのインスタンスを作成する必要がある +ことがあります。そうするためには、アプリケーションの [[yii\base\Application::bootstrap|bootstrap]] プロパティのリストに +そういうコンポーネントの ID を挙げることが出来ます。 + +例えば、次のアプリケーションコンフィギュレーションは、`log` コンポーネントが常にロードされることを保証するものです: + +```php +[ + 'bootstrap' => [ + 'log', + ], + 'components' => [ + 'log' => [ + // "log" コンポーネントのコンフィギュレーション + ], + ], +] +``` + + +## コアアプリケーションコンポーネント + +Yii は固定の ID とデフォルトのコンフィギュレーションを持つ一連の *コア* アプリケーションコンポーネントを定義しています。 +例えば、[[yii\web\Application::request|request]] コンポーネントは、ユーザリクエストに関する情報を収集し、 +それを [ルート](runtime-routing.md) として解決します。 +[[yii\base\Application::db|db]] コンポーネントは、それを通じてデータベースクエリを実行できるデータベース接続を表現します。 +Yii のアプリケーションがユーザリクエストを処理することが出来るのは、まさにこれらのコアアプリケーションコンポーネントの助力によります。 +下記が事前に定義されたコアアプリケーションコンポーネントです。 +通常のアプリケーションコンポーネントに対するのと同様に、これらを構成し、カスタマイズすることが出来ます。 +コアアプリケーションコンポーネントを構成するときは、クラスを指定しなければ、デフォルトのクラスが使用されます。 + +* [[yii\web\AssetManager|assetManager]]: アセットバンドルとアセットの発行を管理します。 + 更なる詳細は [アセットを管理する](structure-assets.md) の節を参照してください。 +* [[yii\db\Connection|db]]: データベース接続を表します。これを通じて、DB クエリを実行することが出来ます。 + このコンポーネントを構成するときは、コンポーネントのクラスはもちろん、 + [[yii\db\Connection::dsn]] のような必須のコンポーネントプロパティを指定しなければならないことに注意してください。 + 更なる詳細は [データアクセスオブジェクト (DAO)](db-dao.md) の節を参照してください。 +* [[yii\base\Application::errorHandler|errorHandler]]: PHP のエラーと例外を処理します。 + 更なる詳細は [エラー処理](runtime-handling-errors.md) の節を参照してください。 +* [[yii\i18n\Formatter|formatter]]: エンドユーザに表示されるデータに書式を設定します。 + 例えば、数字が3桁ごとの区切りを使って表示されたり、日付が長い書式で表示されたりします。 + 更なる詳細は [データの書式設定](output-formatter.md) の節を参照してください。 +* [[yii\i18n\I18N|i18n]]: メッセージの翻訳と書式設定をサポートします。 + 更なる詳細は [国際化](tutorial-i18n.md) の節を参照してください。 +* [[yii\log\Dispatcher|log]]: ログの対象を管理します。 + 更なる詳細は [ログ](runtime-logging.md) の節を参照してください。 +* [[yii\swiftmailer\Mailer|mail]]: メールの作成と送信をサポートします。 + 更なる詳細は [メール](tutorial-mailing.md) の節を参照してください。 +* [[yii\base\Application::response|response]]: エンドユーザに送信されるレスポンスを表現します。 + 更なる詳細は [レスポンス](runtime-responses.md) の節を参照してください。 +* [[yii\base\Application::request|request]]: エンドユーザから受信したリクエストを表現します。 + 更なる詳細は [リクエスト](runtime-requests.md) の節を参照してください。 +* [[yii\web\Session|session]]: セッション情報を表現します。 + このコンポーネントは、[[yii\web\Application|ウェブアプリケーション]] においてのみ利用できます。. + 更なる詳細は [セッションとクッキー](runtime-sessions-cookies.md) の節を参照してください。 +* [[yii\web\UrlManager|urlManager]]: URL の解析と生成をサポートします。 + 更なる詳細は [URL の解析と生成](runtime-url-handling.md) の節を参照してください。 +* [[yii\web\User|user]]: ユーザの認証情報を表現します。 + このコンポーネントは、[[yii\web\Application|ウェブアプリケーション]] においてのみ利用できます。. + 更なる詳細は [認証](security-authentication.md) の節を参照してください。 +* [[yii\web\View|view]]: ビューの描画をサポートします。 + 更なる詳細は [ビュー](structure-views.md) の節を参照してください。 From 655dcba0ebbbec4d7e1a2c87232b690774dfed9d Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Thu, 30 Oct 2014 14:21:26 +0100 Subject: [PATCH 002/144] added info about JSON input to the REST guide issue #4198 --- docs/guide/rest-quick-start.md | 43 +++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/docs/guide/rest-quick-start.md b/docs/guide/rest-quick-start.md index bdc63cf..22db300 100644 --- a/docs/guide/rest-quick-start.md +++ b/docs/guide/rest-quick-start.md @@ -5,7 +5,7 @@ Yii provides a whole set of tools to simplify the task of implementing RESTful W In particular, Yii supports the following features about RESTful APIs: * Quick prototyping with support for common APIs for [Active Record](db-active-record.md); -* Response format (supporting JSON and XML by default) negotiation; +* Response format negotiation (supporting JSON and XML by default); * Customizable object serialization with support for selectable output fields; * Proper formatting of collection data and validation errors; * Support for [HATEOAS](http://en.wikipedia.org/wiki/HATEOAS); @@ -18,7 +18,7 @@ In particular, Yii supports the following features about RESTful APIs: In the following, we use an example to illustrate how you can build a set of RESTful APIs with some minimal coding effort. -Assume you want to expose the user data via RESTful APIs. The user data are stored in the user DB table, +Assume you want to expose the user data via RESTful APIs. The user data are stored in the `user` DB table, and you have already created the [[yii\db\ActiveRecord|ActiveRecord]] class `app\models\User` to access the user data. @@ -59,6 +59,21 @@ Then, modify the configuration about the `urlManager` component in your applicat The above configuration mainly adds a URL rule for the `user` controller so that the user data can be accessed and manipulated with pretty URLs and meaningful HTTP verbs. +## Enabling JSON input + +By default the `Content-Type` of incoming requests such as `POST` or `PUT` is only recognized as `application/x-www-form-urlencoded` +or `multipart/form-data` which is the content type used by HTML forms. + +To enable sending content in JSON format to the API, you have to configure the [[yii\web\Request::$parsers|parsers]] property of +the `request` application component to use the [[yii\web\JsonParser]] for JSON input: + +```php +'request' => [ + 'parsers' => [ + 'application/json' => 'yii\web\JsonParser', + ] +] +``` ## Trying it Out @@ -76,6 +91,7 @@ for accessing the user data. The APIs you have created include: * `OPTIONS /users/123`: show the supported verbs regarding endpoint `/users/123`. > Info: Yii will automatically pluralize controller names for use in endpoints. +> You can configure this using the [[yii\rest\UrlRule::$pluralize]]-property. You may access your APIs with the `curl` command like the following, @@ -83,9 +99,7 @@ You may access your APIs with the `curl` command like the following, $ curl -i -H "Accept:application/json" "http://localhost/users" HTTP/1.1 200 OK -Date: Sun, 02 Mar 2014 05:31:43 GMT -Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y -X-Powered-By: PHP/5.4.20 +... X-Pagination-Total-Count: 1000 X-Pagination-Page-Count: 50 X-Pagination-Current-Page: 1 @@ -116,9 +130,7 @@ is returned in XML format: $ curl -i -H "Accept:application/xml" "http://localhost/users" HTTP/1.1 200 OK -Date: Sun, 02 Mar 2014 05:31:43 GMT -Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y -X-Powered-By: PHP/5.4.20 +... X-Pagination-Total-Count: 1000 X-Pagination-Page-Count: 50 X-Pagination-Current-Page: 1 @@ -143,6 +155,20 @@ Content-Type: application/xml ``` +The following command will create a new user by sending a POST request with the user data in JSON format: + +``` +$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" -XPOST "http://localhost/users" -d '{"username": "example", "email": "user@example.com"}' + +HTTP/1.1 201 Created +... +Location: http://localhost/users/1 +Content-Length: 99 +Content-Type: application/json; charset=UTF-8 + +{"id":1,"username":"example","email":"user@example.com","created_at":1414674789,"updated_at":1414674789} +``` + > Tip: You may also access your APIs via Web browser by entering the URL `http://localhost/users`. However, you may need some browser plugins to send specific request headers. @@ -172,4 +198,3 @@ You may use [[yii\rest\UrlRule]] to simplify the routing to your API endpoints. While not required, it is recommended that you develop your RESTful APIs as a separate application, different from your Web front end and back end for easier maintenance. - From 224fe12f07213dcbdf5dde11f8562be1492c650b Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Thu, 30 Oct 2014 14:41:16 +0100 Subject: [PATCH 003/144] added disabling of loginUrl to the REST guide issue #4198 --- docs/guide/rest-authentication.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/guide/rest-authentication.md b/docs/guide/rest-authentication.md index 45d13ba..2c6f7ca 100644 --- a/docs/guide/rest-authentication.md +++ b/docs/guide/rest-authentication.md @@ -25,7 +25,9 @@ Yii supports all of the above authentication methods. You can also easily create To enable authentication for your APIs, do the following steps: -1. Configure the [[yii\web\User::enableSession|enableSession]] property of the `user` application component to be false. +1. Configure the `user` application component: + - Set the [[yii\web\User::enableSession|enableSession]] property to be `false`. + - Set the [[yii\web\User::loginUrl|loginUrl]] property to be `null` to show a HTTP 403 error instead of redirecting to the login page. 2. Specify which authentication methods you plan to use by configuring the `authenticator` behavior in your REST controller classes. 3. Implement [[yii\web\IdentityInterface::findIdentityByAccessToken()]] in your [[yii\web\User::identityClass|user identity class]]. @@ -45,7 +47,7 @@ public function init() } ``` -For example, to use HTTP Basic Auth, you may configure `authenticator` as follows, +For example, to use HTTP Basic Auth, you may configure the `authenticator` behavior as follows, ```php use yii\filters\auth\HttpBasicAuth; From e923a13ccd6fccd80048c2f4a288ceb42a431556 Mon Sep 17 00:00:00 2001 From: Victor Demin Date: Thu, 30 Oct 2014 15:41:32 +0100 Subject: [PATCH 004/144] Readme on "uncheck" parameter in activeCheckbox Just a readme update. "If you do not want any hidden input, you should explicitly set this option as null." close #5823 --- framework/helpers/BaseHtml.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index c938d69..e9a7961 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -1246,7 +1246,7 @@ class BaseHtml * - uncheck: string, the value associated with the uncheck state of the radio button. If not set, * it will take the default value '0'. This method will render a hidden input so that if the radio button * is not checked and is submitted, the value of this attribute will still be submitted to the server - * via the hidden input. + * via the hidden input. If you do not want any hidden input, you should explicitly set this option as null. * - label: string, a label displayed next to the radio button. It will NOT be HTML-encoded. Therefore you can pass * in HTML code such as an image tag. If this is is coming from end users, you should [[encode()]] it to prevent XSS attacks. * The radio button will be enclosed by the label tag. Note that if you do not specify this option, a default label @@ -1296,7 +1296,7 @@ class BaseHtml * - uncheck: string, the value associated with the uncheck state of the radio button. If not set, * it will take the default value '0'. This method will render a hidden input so that if the radio button * is not checked and is submitted, the value of this attribute will still be submitted to the server - * via the hidden input. + * via the hidden input. If you do not want any hidden input, you should explicitly set this option as null. * - label: string, a label displayed next to the checkbox. It will NOT be HTML-encoded. Therefore you can pass * in HTML code such as an image tag. If this is is coming from end users, you should [[encode()]] it to prevent XSS attacks. * The checkbox will be enclosed by the label tag. Note that if you do not specify this option, a default label From f92eacd767b975375efff82350037e94794c9daa Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Thu, 30 Oct 2014 11:52:44 -0400 Subject: [PATCH 005/144] minor doc adjustment [skip ci] --- docs/guide/rest-quick-start.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/guide/rest-quick-start.md b/docs/guide/rest-quick-start.md index 22db300..17310ed 100644 --- a/docs/guide/rest-quick-start.md +++ b/docs/guide/rest-quick-start.md @@ -59,12 +59,10 @@ Then, modify the configuration about the `urlManager` component in your applicat The above configuration mainly adds a URL rule for the `user` controller so that the user data can be accessed and manipulated with pretty URLs and meaningful HTTP verbs. -## Enabling JSON input -By default the `Content-Type` of incoming requests such as `POST` or `PUT` is only recognized as `application/x-www-form-urlencoded` -or `multipart/form-data` which is the content type used by HTML forms. +## Enabling JSON Input -To enable sending content in JSON format to the API, you have to configure the [[yii\web\Request::$parsers|parsers]] property of +To let the API accepting input data in JSON format, configure the [[yii\web\Request::$parsers|parsers]] property of the `request` application component to use the [[yii\web\JsonParser]] for JSON input: ```php @@ -75,6 +73,10 @@ the `request` application component to use the [[yii\web\JsonParser]] for JSON i ] ``` +> Info: The above configuration is optional. Without the above configuration, the API would only recognize + `application/x-www-form-urlencoded` and `multipart/form-data` input formats. + + ## Trying it Out With the above minimal amount of effort, you have already finished your task of creating the RESTful APIs From b752d6ea605e2bcb272a3a34d7588fc006b66bf1 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Thu, 30 Oct 2014 12:14:41 -0400 Subject: [PATCH 006/144] syntax fix [skip ci] --- docs/guide/rest-quick-start.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/rest-quick-start.md b/docs/guide/rest-quick-start.md index 17310ed..1f4e82a 100644 --- a/docs/guide/rest-quick-start.md +++ b/docs/guide/rest-quick-start.md @@ -62,7 +62,7 @@ can be accessed and manipulated with pretty URLs and meaningful HTTP verbs. ## Enabling JSON Input -To let the API accepting input data in JSON format, configure the [[yii\web\Request::$parsers|parsers]] property of +To let the API accept input data in JSON format, configure the [[yii\web\Request::$parsers|parsers]] property of the `request` application component to use the [[yii\web\JsonParser]] for JSON input: ```php From 02cc3901caa8b0289201c73198e0b275260d27b1 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Thu, 30 Oct 2014 13:18:27 -0400 Subject: [PATCH 007/144] doc fix [skip ci] --- docs/guide/input-validation.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/docs/guide/input-validation.md b/docs/guide/input-validation.md index 981657b..902374a 100644 --- a/docs/guide/input-validation.md +++ b/docs/guide/input-validation.md @@ -83,7 +83,7 @@ You can specify the rule type in one of the following forms: the [Core Validators](tutorial-core-validators.md) for the complete list of core validators. * the name of a validation method in the model class, or an anonymous function. Please refer to the [Inline Validators](#inline-validators) subsection for more details. -* the name of a validator class. Please refer to the [Standalone Validators](#standalone-validators) +* a fully qualified validator class name. Please refer to the [Standalone Validators](#standalone-validators) subsection for more details. A rule can be used to validate one or multiple attributes, and an attribute may be validated by one or multiple rules. @@ -367,11 +367,12 @@ class MyForm extends Model or if they have already failed some validation rules. If you want to make sure a rule is always applied, you may configure the [[yii\validators\Validator::skipOnEmpty|skipOnEmpty]] and/or [[yii\validators\Validator::skipOnError|skipOnError]] properties to be false in the rule declarations. For example: +> > ```php -[ - ['country', 'validateCountry', 'skipOnEmpty' => false, 'skipOnError' => false], -] -``` +> [ +> ['country', 'validateCountry', 'skipOnEmpty' => false, 'skipOnError' => false], +> ] +> ``` ### Standalone Validators @@ -529,13 +530,14 @@ JS; ``` > Tip: The above code is given mainly to demonstrate how to support client-side validation. In practice, - you may use the [in](tutorial-core-validators.md#in) core validator to achieve the same goal. You may - write the validation rule like the following: +> you may use the [in](tutorial-core-validators.md#in) core validator to achieve the same goal. You may +> write the validation rule like the following: +> > ```php -[ - ['status', 'in', 'range' => Status::find()->select('id')->asArray()->column()], -] -``` +> [ +> ['status', 'in', 'range' => Status::find()->select('id')->asArray()->column()], +> ] +> ``` ### Deferred Validation From dcfcc68e644f8288e3a77c40406448e798a7d145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mirc=C9=99lal?= <01youknowme@gmail.com> Date: Fri, 31 Oct 2014 00:47:15 +0400 Subject: [PATCH 008/144] improved translations --- framework/messages/az/yii.php | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/framework/messages/az/yii.php b/framework/messages/az/yii.php index 9b3276e..2f10986 100644 --- a/framework/messages/az/yii.php +++ b/framework/messages/az/yii.php @@ -18,13 +18,13 @@ */ return [ '(not set)' => '(məlumat yoxdur)', - 'An internal server error occurred.' => 'Daxili server xətasi meydana gəldi.', + 'An internal server error occurred.' => 'Daxili server xətası meydana gəldi.', 'Are you sure you want to delete this item?' => 'Bu elementi silmək istədiyinizə əminsinizmi?', 'Delete' => 'Sil', 'Error' => 'Xəta', 'File upload failed.' => 'Fayl yüklənmədi.', 'Home' => 'Ana səhifə', - 'Invalid data received for parameter "{param}".' => 'Bu "{param}" parametri üçün yalnış məlumat alındı.', + 'Invalid data received for parameter "{param}".' => '"{param}" parametri üçün yalnış məlumat alındı.', 'Login Required' => 'İstifadəçi girişi tələb olunur', 'Missing required arguments: {params}' => 'Tələb olunan arqumentlər tapılmadı: {params}', 'Missing required parameters: {params}' => 'Tələb olunan parametrlər tapılmadı: {params}', @@ -33,19 +33,19 @@ return [ 'No help for unknown sub-command "{command}".' => 'Qeyri-müəyyən "{command}" sub-əmri üçün kömək yoxdur.', 'No results found.' => 'Heç bir nəticə tapılmadı', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Ancaq bu MIME tipli fayllara icazə verilib: {mimeTypes}.', - 'Only files with these extensions are allowed: {extensions}.' => 'Genislənmələri ancaq bu tipdə olan fayllara icazə verilib: {extensions}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Genişlənmələri ancaq bu tipdə olan fayllara icazə verilib: {extensions}.', 'Page not found.' => 'Səhifə tapılmadı.', - 'Please fix the following errors:' => 'Xahiş olunur xətaları düzəldin:', - 'Please upload a file.' => 'Xahiş olunur fayl yükləyin.', - 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{totalCount, number} {totalCount, plural, one{elementin} other{element}} {begin, number}-{end, number} arasi göstərilir.', + 'Please fix the following errors:' => 'Xahiş olunur xətaları düzəldin: ', + 'Please upload a file.' => 'Xahiş olunur bir fayl yükləyin.', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{totalCount, number} {totalCount, plural, one{elementin} other{elementdən}} {begin, number}-{end, number} arası göstərilir.', 'The file "{file}" is not an image.' => '"{file}" təsvir faylı deyil.', 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => '"{file}" faylı çox böyükdür. Həcmi {limit, number} {limit, plural, one{byte} other{bytes}} qiymətindən böyük ola bilməz.', 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => '"{file}" faylı çox kiçikdir. Həcmi {limit, number} {limit, plural, one{byte} other{bytes}} qiymətindən kiçik ola bilməz.', - 'The format of {attribute} is invalid.' => '{attribute} formati düzgün deyil.', + 'The format of {attribute} is invalid.' => '{attribute} formatı düzgün deyil.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox böyükdür. Uzunluq {limit, plural, one{pixel} other{pixels}} qiymətindən böyük ola bilməz.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox böyükdür. En {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən böyük ola bilməz.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox kiçikdir. En {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən kiçik ola bilməz.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox kiçikdir. En {limit, number} {limit, plural, one{pixel} other{pixels}} qiymətindən kiçik ola bilməz.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox böyükdür. Eni {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən böyük ola bilməz.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox kiçikdir. Eni {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən kiçik ola bilməz.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox kiçikdir. Eni {limit, number} {limit, plural, one{pixel} other{pixels}} qiymətindən kiçik ola bilməz.', 'The verification code is incorrect.' => 'Təsdiqləmə kodu səhvdir.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Toplam {count, number} {count, plural, one{element} other{element}}.', 'Unable to verify your data submission.' => 'Təqdim etdiyiniz məlumat təsdiqlənmədi.', @@ -54,7 +54,7 @@ return [ 'Update' => 'Yenilə', 'View' => 'Bax', 'Yes' => 'Bəli', - 'You are not allowed to perform this action.' => 'Bu əməliyyati yerinə yetirmək üçün icazəniz yoxdur.', + 'You are not allowed to perform this action.' => 'Bu əməliyyatı yerinə yetirmək üçün icazəniz yoxdur.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Ancaq {limit, number} {limit, plural, one{fayl} other{fayl}} yükləyə bilərsiniz.', 'the input value' => 'daxil olunmuş qiymət', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" artıq istifadə olunub.', @@ -68,12 +68,12 @@ return [ '{attribute} must be an integer.' => '{attribute} tam ədəd olmalıdır.', '{attribute} must be either "{true}" or "{false}".' => '{attribute} {true} ya da {false} ola bilər.', '{attribute} must be greater than "{compareValue}".' => '{attribute}, "{compareValue}" dən böyük olmalıdır.', - '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute}, "{compareValue}" dən böyük və ya bərabər olmalıdır.', + '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute}, "{compareValue}"dən böyük və ya bərabər olmalıdır.', '{attribute} must be less than "{compareValue}".' => '{attribute}, "{compareValue}" dən az olmalıdır.', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute}, "{compareValue}" dən az və ya bərabər olmalıdır.', + '{attribute} must be less than or equal to "{compareValue}".' => '{attribute}, "{compareValue}"dən az və ya bərabər olmalıdır.', '{attribute} must be no greater than {max}.' => '{attribute} {max} dən böyük olmamalıdır.', '{attribute} must be no less than {min}.' => '{attribute} {min} dən kiçik olmamalıdır.', - '{attribute} must be repeated exactly.' => '{attribute} dəqiq təkrar olunmalidir.', + '{attribute} must be repeated exactly.' => '{attribute} dəqiq təkrar olunmalıdir.', '{attribute} must not be equal to "{compareValue}".' => '{attribute}, "{compareValue}" ilə eyni olmamalıdır', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} ən az {min, number} simvol olmalıdır.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} ən çox {max, number} simvol olmalıdır.', From 68b558d002cd3b3de37059f69d6ac55fbc66ab90 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 31 Oct 2014 10:37:47 +0300 Subject: [PATCH 009/144] Removed some badges, reodered the rest --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 1611073..a8dd733 100644 --- a/README.md +++ b/README.md @@ -11,18 +11,13 @@ Yii 2 requires PHP 5.4 and embraces the best practices and protocols found in mo [![Latest Stable Version](https://poser.pugx.org/yiisoft/yii2/v/stable.png)](https://packagist.org/packages/yiisoft/yii2) [![Total Downloads](https://poser.pugx.org/yiisoft/yii2/downloads.png)](https://packagist.org/packages/yiisoft/yii2) [![Reference Status](https://www.versioneye.com/php/yiisoft:yii2/reference_badge.svg)](https://www.versioneye.com/php/yiisoft:yii2/references) - [![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2) [![Dependency Status](https://www.versioneye.com/php/yiisoft:yii2/dev-master/badge.png)](https://www.versioneye.com/php/yiisoft:yii2/dev-master) [![HHVM Status](http://hhvm.h4cc.de/badge/yiisoft/yii2-dev.png)](http://hhvm.h4cc.de/package/yiisoft/yii2-dev) - [![Code Coverage](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/coverage.png?s=31d80f1036099e9d6a3e4d7738f6b000b3c3d10e)](https://scrutinizer-ci.com/g/yiisoft/yii2/) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/quality-score.png?s=b1074a1ff6d0b214d54fa5ab7abbb90fc092471d)](https://scrutinizer-ci.com/g/yiisoft/yii2/) [![Code Climate](https://codeclimate.com/github/yiisoft/yii2.png)](https://codeclimate.com/github/yiisoft/yii2) -[![Issue Stats Issues](http://issuestats.com/github/yiisoft/yii2/badge/issue)](http://issuestats.com/github/yiisoft/yii2) -[![Issue Stats Pull request](http://issuestats.com/github/yiisoft/yii2/badge/pr)](http://issuestats.com/github/yiisoft/yii2) - DIRECTORY STRUCTURE ------------------- From 497e1fedc5e9b54916b46488a4cb9d09103412dc Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 31 Oct 2014 16:40:01 +0300 Subject: [PATCH 010/144] Added phpdoc for ContentDecorator --- framework/widgets/ContentDecorator.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/framework/widgets/ContentDecorator.php b/framework/widgets/ContentDecorator.php index 2ab9e72..26dee57 100644 --- a/framework/widgets/ContentDecorator.php +++ b/framework/widgets/ContentDecorator.php @@ -11,6 +11,32 @@ use yii\base\InvalidConfigException; use yii\base\Widget; /** + * ContentDecorator records all output between [[begin()]] and [[end()]] calls, passes it to the given view file + * as `$content` and then echoes rendering result. + * + * ```php + * '@app/views/layouts/base.php', + * 'params' => [], + * 'view' => $this, + * ]) ?> + * + * some content here + * + * + * ``` + * + * There are [[\yii\base\View::beginContent()]] and [[\yii\base\View::endContent()]] wrapper methods in the + * [[\yii\base\View]] component to make syntax more friendly. In the view these could be used as follows: + * + * ```php + * beginContent('@app/views/layouts/base.php') ?> + * + * some content here + * + * endContent() ?> + * ``` + * * @author Qiang Xue * @since 2.0 */ From b2341edfcf8ab5b7b798b1e67ad175731927892f Mon Sep 17 00:00:00 2001 From: Alexander Mohorev Date: Sat, 25 Oct 2014 22:17:51 +0300 Subject: [PATCH 011/144] add more default names of exceptions --- framework/base/ErrorException.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/framework/base/ErrorException.php b/framework/base/ErrorException.php index 52a56ce..92fcc1b 100644 --- a/framework/base/ErrorException.php +++ b/framework/base/ErrorException.php @@ -75,18 +75,20 @@ class ErrorException extends \ErrorException { $names = [ E_ERROR => 'PHP Fatal Error', + E_WARNING => 'PHP Warning', E_PARSE => 'PHP Parse Error', + E_NOTICE => 'PHP Notice', E_CORE_ERROR => 'PHP Core Error', - E_COMPILE_ERROR => 'PHP Compile Error', - E_USER_ERROR => 'PHP User Error', - E_WARNING => 'PHP Warning', E_CORE_WARNING => 'PHP Core Warning', + E_COMPILE_ERROR => 'PHP Compile Error', E_COMPILE_WARNING => 'PHP Compile Warning', + E_USER_ERROR => 'PHP User Error', E_USER_WARNING => 'PHP User Warning', + E_USER_NOTICE => 'PHP User Notice', E_STRICT => 'PHP Strict Warning', - E_NOTICE => 'PHP Notice', E_RECOVERABLE_ERROR => 'PHP Recoverable Error', E_DEPRECATED => 'PHP Deprecated Warning', + E_USER_DEPRECATED => 'PHP User Deprecated Warning', ]; return isset($names[$this->getCode()]) ? $names[$this->getCode()] : 'Error'; From 1be82dc0f5af1e22703bffd3350a3faf1e38accd Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 31 Oct 2014 16:52:26 +0300 Subject: [PATCH 012/144] Added phpdoc for Block --- framework/widgets/Block.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/framework/widgets/Block.php b/framework/widgets/Block.php index ea96619..998dd6c 100644 --- a/framework/widgets/Block.php +++ b/framework/widgets/Block.php @@ -10,6 +10,29 @@ namespace yii\widgets; use yii\base\Widget; /** + * Block records all output between [[begin()]] and [[end()]] calls and stores it in [[\yii\base\View::$blocks]]. + * for later use. + * + * [[\yii\base\View]] component contains two methods [[\yii\base\View::beginBlock()]] and [[\yii\base\View::endBlock()]]. + * The general idea is that you're defining block default in a view or layout: + * + * ```php + * beginBlock('messages', true) ?> + * Nothing. + * endBlock() ?> + * ``` + * + * And then overriding default in sub-views: + * + * ```php + * beginBlock('username') ?> + * Umm... hello? + * endBlock() ?> + * ``` + * + * Second parameter defines if block content should be outputted which is desired when rendering its content but isn't + * desired when redefining it in subviews. + * * @author Qiang Xue * @since 2.0 */ From a92e214b9ea0af95c0dc5d2a2b6efb53adefe949 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 09:52:45 -0400 Subject: [PATCH 013/144] Fixes #5770: Added more PHP error names for `ErrorException` --- framework/CHANGELOG.md | 1 + framework/base/ErrorException.php | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 671fbd9..2d8ddc7 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -25,6 +25,7 @@ Yii Framework 2 Change Log - Enh #5613: Added `--overwrite` option to Gii console command to support overwriting all files (motin, qiangxue) - Enh #5646: Call `yii\base\ErrorHandler::unregister()` instead of `restore_*_handlers` directly (aivus) - Enh #5735: Added `yii\bootstrap\Tabs::renderTabContent` to support manually rendering tab contents (RomeroMsk) +- Enh #5770: Added more PHP error names for `ErrorException` (mongosoft) - Enh #5806: Allow `Html::encode()` to be used when the application is not started (qiangxue) - Enh: `Console::confirm()` now uses `Console::stdout()` instead of `echo` to be consistent with all other functions (cebe) - Chg #3630: `yii\db\Command::queryInternal()` is now protected (samdark) diff --git a/framework/base/ErrorException.php b/framework/base/ErrorException.php index 92fcc1b..580a828 100644 --- a/framework/base/ErrorException.php +++ b/framework/base/ErrorException.php @@ -73,22 +73,22 @@ class ErrorException extends \ErrorException */ public function getName() { - $names = [ - E_ERROR => 'PHP Fatal Error', - E_WARNING => 'PHP Warning', - E_PARSE => 'PHP Parse Error', - E_NOTICE => 'PHP Notice', - E_CORE_ERROR => 'PHP Core Error', - E_CORE_WARNING => 'PHP Core Warning', + static $names = [ E_COMPILE_ERROR => 'PHP Compile Error', E_COMPILE_WARNING => 'PHP Compile Warning', - E_USER_ERROR => 'PHP User Error', - E_USER_WARNING => 'PHP User Warning', - E_USER_NOTICE => 'PHP User Notice', - E_STRICT => 'PHP Strict Warning', - E_RECOVERABLE_ERROR => 'PHP Recoverable Error', + E_CORE_ERROR => 'PHP Core Error', + E_CORE_WARNING => 'PHP Core Warning', E_DEPRECATED => 'PHP Deprecated Warning', + E_ERROR => 'PHP Fatal Error', + E_NOTICE => 'PHP Notice', + E_PARSE => 'PHP Parse Error', + E_RECOVERABLE_ERROR => 'PHP Recoverable Error', + E_STRICT => 'PHP Strict Warning', E_USER_DEPRECATED => 'PHP User Deprecated Warning', + E_USER_ERROR => 'PHP User Error', + E_USER_NOTICE => 'PHP User Notice', + E_USER_WARNING => 'PHP User Warning', + E_WARNING => 'PHP Warning', ]; return isset($names[$this->getCode()]) ? $names[$this->getCode()] : 'Error'; From 10cc19d0b60cea97d0b103bba852046d7529953b Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 10:01:20 -0400 Subject: [PATCH 014/144] Fixes #5833: The `message` command fails with a FK constraint error when trying to update messages --- framework/CHANGELOG.md | 1 + framework/console/controllers/MessageController.php | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 2d8ddc7..d68c6ab 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -15,6 +15,7 @@ Yii Framework 2 Change Log - Bug #5702: Parenthesis should be automatically added to `Validator::whenClient` to avoid js error (mdmunir, qiangxue) - Bug #5745: Gii and debug modules may cause 404 exception when the route contains dashes (qiangxue) - Bug #5780: `QueryBuilder::batchInsert()` may cause "undefined index" error (qiangxue) +- Bug #5833: The `message` command fails with a FK constraint error when trying to update messages (qiangxue) - Bug: Gii console command help information does not contain global options (qiangxue) - Bug: `yii\web\UrlRule` was unable to create URLs for rules containing unicode characters (samdark) - Enh #5223: Query builder now supports selecting sub-queries as columns (qiangxue) diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php index 8c52010..2b35c50 100644 --- a/framework/console/controllers/MessageController.php +++ b/framework/console/controllers/MessageController.php @@ -203,10 +203,10 @@ class MessageController extends Controller $db->createCommand() ->insert($sourceMessageTable, ['category' => $category, 'message' => $m])->execute(); - $lastId = $db->getLastInsertID(); + $lastID = $db->getLastInsertID(); foreach ($languages as $language) { $db->createCommand() - ->insert($messageTable, ['id' => $lastId, 'language' => $language])->execute(); + ->insert($messageTable, ['id' => $lastID, 'language' => $language])->execute(); } } } @@ -222,17 +222,12 @@ class MessageController extends Controller ->delete($sourceMessageTable, ['in', 'id', $obsolete])->execute(); echo "deleted.\n"; } else { - $last_id = $db->getLastInsertID(); $db->createCommand() ->update( $sourceMessageTable, ['message' => new \yii\db\Expression("CONCAT('@@',message,'@@')")], ['in', 'id', $obsolete] )->execute(); - foreach ($languages as $language) { - $db->createCommand() - ->insert($messageTable, ['id' => $last_id, 'language' => $language])->execute(); - } echo "updated.\n"; } } From 8022942125e245791e8874c819c3b6e97ab468f6 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Fri, 31 Oct 2014 15:55:13 +0100 Subject: [PATCH 015/144] added tipp for asset registering --- docs/guide/structure-assets.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/guide/structure-assets.md b/docs/guide/structure-assets.md index c957779..d7763ef 100644 --- a/docs/guide/structure-assets.md +++ b/docs/guide/structure-assets.md @@ -212,6 +212,8 @@ listed in the registered bundles. The order of these tags is determined by the d the registered bundles and the order of the assets listed in the [[yii\web\AssetBundle::css]] and [[yii\web\AssetBundle::js]] properties. +> Tip: The [[yii\web\AssetBundle::register()]] method returns the registered asset bundle object, so you can use it to retrieve +> information like for example the [[yii\web\AssetBundle::basePath|basePath]] from it. ### Customizing Asset Bundles From a911984ae0265c4bca2149184fd5f4ccc75e76c7 Mon Sep 17 00:00:00 2001 From: ahmadrusli Date: Sat, 1 Nov 2014 01:25:29 +0700 Subject: [PATCH 016/144] Update yii.php --- framework/messages/id/yii.php | 62 +++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/framework/messages/id/yii.php b/framework/messages/id/yii.php index b180195..efbc342 100644 --- a/framework/messages/id/yii.php +++ b/framework/messages/id/yii.php @@ -39,17 +39,17 @@ return [ 'Page not found.' => 'Halaman tidak ditemukan.', 'Please fix the following errors:' => 'Silahkan perbaiki kesalahan berikut:', 'Please upload a file.' => 'Silahkan mengunggah berkas.', - 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Menampilkan {begin, number}-{end, number} dari {totalCount, number} {totalCount, plural, one{element} other{elements}}.', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Menampilkan {begin, number}-{end, number} dari {totalCount, number} {totalCount, plural, one{item} other{item}}.', 'The file "{file}" is not an image.' => 'File bukan berupa gambar.', - 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Berkas "{file}" terlalu besar. Ukurannya tidak boleh lebih besar dari {limit, number} {limit, plural, one{byte} other{bytes}}.', - 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Berkas "{file}" terlalu kecil. Ukurannya tidak boleh lebih kecil dari {limit, number} {limit, plural, one{byte} other{bytes}}.', + 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Berkas "{file}" terlalu besar. Ukurannya tidak boleh lebih besar dari {limit, number} {limit, plural, one{bita} other{bita}}.', + 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Berkas "{file}" terlalu kecil. Ukurannya tidak boleh lebih kecil dari {limit, number} {limit, plural, one{bita} other{bita}}.', 'The format of {attribute} is invalid.' => 'Format dari {attribute} tidak valid.', - 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu besar. Tingginya tidak boleh lebih besar dari {limit, number} {limit, plural, one{píxel} other{píxels}}.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu besar. Lebarnya tidak boleh lebih besar dari {limit, number} {limit, plural, one{píxel} other{píxels}}.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu kecil. Tingginya tidak boleh lebih kecil dari {limit, number} {limit, plural, one{píxel} other{píxels}}.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu kecil. Lebarnya tidak boleh lebih kecil dari {limit, number} {limit, plural, one{píxel} other{píxels}}.', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu besar. Tingginya tidak boleh lebih besar dari {limit, number} {limit, plural, one{piksel} other{piksel}}.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu besar. Lebarnya tidak boleh lebih besar dari {limit, number} {limit, plural, one{piksel} other{piksel}}.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu kecil. Tingginya tidak boleh lebih kecil dari {limit, number} {limit, plural, one{piksel} other{piksel}}.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Gambar "{file}" terlalu kecil. Lebarnya tidak boleh lebih kecil dari {limit, number} {limit, plural, one{piksel} other{piksel}}.', 'The verification code is incorrect.' => 'Kode verifikasi tidak benar.', - 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{element} other{elements}}.', + 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{item}}.', 'Unable to verify your data submission.' => 'Tidak dapat memverifikasi pengiriman data Anda.', 'Unknown command "{command}".' => 'Perintah tidak dikenal "{command}".', 'Unknown option: --{name}' => 'Opsi tidak dikenal: --{name}', @@ -57,15 +57,15 @@ return [ 'View' => 'Lihat', 'Yes' => 'Ya', 'You are not allowed to perform this action.' => 'Anda tidak diperbolehkan untuk melakukan aksi ini.', - 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Anda dapat mengunggah paling banyak {limit, number} {limit, plural, one{arxiu} other{arxius}}.', - 'in {delta, plural, =1{a day} other{# days}}' => 'dalam {delta, plural, =1{un dia} other{# dies}}', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'dalam {delta, plural, =1{un minut} other{# minuts}}', - 'in {delta, plural, =1{a month} other{# months}}' => 'dalam {delta, plural, =1{un mes} other{# mesos}}', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'dalam {delta, plural, =1{un segon} other{# segons}}', - 'in {delta, plural, =1{a year} other{# years}}' => 'dalam {delta, plural, =1{un any} other{# anys}}', - 'in {delta, plural, =1{an hour} other{# hours}}' => 'dalam {delta, plural, =1{una hora} other{# hores}}', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Anda dapat mengunggah paling banyak {limit, number} {limit, plural, one{file} other{file}}.', + 'in {delta, plural, =1{a day} other{# days}}' => 'dalam {delta, plural, =1{satu hari} other{# hari}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'dalam {delta, plural, =1{satu menit} other{# menit}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'dalam {delta, plural, =1{satu bulan} other{# bulan}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'dalam {delta, plural, =1{satu detik} other{# detik}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'dalam {delta, plural, =1{satu tahun} other{# tahun}}', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'dalam {delta, plural, =1{satu jam} other{# jam}}', 'the input value' => 'nilai input', - '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" telah diambil.', + '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" telah dipergunakan.', '{attribute} cannot be blank.' => '{attribute} tidak boleh kosong.', '{attribute} is invalid.' => '{attribute} tidak valid.', '{attribute} is not a valid URL.' => '{attribute} bukan URL yang valid.', @@ -83,21 +83,21 @@ return [ '{attribute} must be no less than {min}.' => '{attribute} harus tidak boleh lebih kecil dari {min}.', '{attribute} must be repeated exactly.' => '{attribute} harus diulang sama persis.', '{attribute} must not be equal to "{compareValue}".' => '{attribute} harus tidak boleh sama dengan "{compareValue}".', - '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} harus memiliki paling sedikit {min, number} {min, plural, one{lletra} other{lletres}}.', - '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} harus memiliki paling banyak {max, number} {max, plural, one{lletra} other{lletres}}.', - '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} harus memiliki {length, number} {length, plural, one{lletra} other{lletres}}.', - '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{un dia} other{# dies}} yang lalu', - '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{un minut} other{# minuts}} yang lalu', - '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{un mes} other{# mesos}} yang lalu', - '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{un segon} other{# segons}} yang lalu', - '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{un any} other{# anys}} yang lalu', - '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{una hora} other{# hores}} yang lalu', - '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, =1{# byte} other{# bytes}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, =1{# gigabyte} other{# gigabytes}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, =1{# kilobyte} other{# kilobytes}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, =1{# megabyte} other{# megabytes}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, =1{# petabyte} other{# petabytes}}', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, =1{# terabyte} other{# terabytes}}', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} harus memiliki paling sedikit {min, number} {min, plural, one{karakter} other{karakter}}.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} harus memiliki paling banyak {max, number} {max, plural, one{karakter} other{karakter}}.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} harus memiliki {length, number} {length, plural, one{karakter} other{karakter}}.', + '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{satu hari} other{# hari}} yang lalu', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{satu menit} other{# menit}} yang lalu', + '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{satu bulan} other{# bulan}} yang lalu', + '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{satu detik} other{# detik}} yang lalu', + '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{satu tahun} other{# tahun}} yang lalu', + '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{satu jam} other{# jam}} yang lalu', + '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, =1{# bita} other{# bita}}', + '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, =1{# gigabita} other{# gigabita}}', + '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, =1{# kilobita } other{# kilobita }}', + '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, =1{# megabita} other{# megabita}}', + '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, =1{# petabita } other{# petabita }}', + '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, =1{# petabita } other{# petabita }}', '{n} B' => '{n} B', '{n} GB' => '{n} GB', '{n} KB' => '{n} KB', From 7c48837a67267438cc358281ea411ce7296e8f46 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 14:28:51 -0400 Subject: [PATCH 017/144] Fixes #5836: doc fixes. --- docs/guide/structure-assets.md | 5 +++-- framework/validators/Validator.php | 40 +++++++++++++++++++------------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/docs/guide/structure-assets.md b/docs/guide/structure-assets.md index d7763ef..29e1f2d 100644 --- a/docs/guide/structure-assets.md +++ b/docs/guide/structure-assets.md @@ -202,6 +202,9 @@ use app\assets\AppAsset; AppAsset::register($this); // $this represents the view object ``` +> Info: The [[yii\web\AssetBundle::register()]] method returns an asset bundle object containing the information + about the published assets, such as [[yii\web\AssetBundle::basePath|basePath]] or [[yii\web\AssetBundle::baseUrl|baseUrl]]. + If you are registering an asset bundle in other places, you should provide the needed view object. For example, to register an asset bundle in a [widget](structure-widgets.md) class, you can get the view object by `$this->view`. @@ -212,8 +215,6 @@ listed in the registered bundles. The order of these tags is determined by the d the registered bundles and the order of the assets listed in the [[yii\web\AssetBundle::css]] and [[yii\web\AssetBundle::js]] properties. -> Tip: The [[yii\web\AssetBundle::register()]] method returns the registered asset bundle object, so you can use it to retrieve -> information like for example the [[yii\web\AssetBundle::basePath|basePath]] from it. ### Customizing Asset Bundles diff --git a/framework/validators/Validator.php b/framework/validators/Validator.php index f0ce831..252c1e4 100644 --- a/framework/validators/Validator.php +++ b/framework/validators/Validator.php @@ -176,17 +176,17 @@ class Validator extends Component * Creates a validator object. * @param mixed $type the validator type. This can be a built-in validator name, * a method name of the model class, an anonymous function, or a validator class name. - * @param \yii\base\Model $object the data object to be validated. + * @param \yii\base\Model $model the data model to be validated. * @param array|string $attributes list of attributes to be validated. This can be either an array of * the attribute names or a string of comma-separated attribute names. * @param array $params initial values to be applied to the validator properties * @return Validator the validator */ - public static function createValidator($type, $object, $attributes, $params = []) + public static function createValidator($type, $model, $attributes, $params = []) { $params['attributes'] = $attributes; - if ($type instanceof \Closure || $object->hasMethod($type)) { + if ($type instanceof \Closure || $model->hasMethod($type)) { // method-based validator $params['class'] = __NAMESPACE__ . '\InlineValidator'; $params['method'] = $type; @@ -217,13 +217,13 @@ class Validator extends Component /** * Validates the specified object. - * @param \yii\base\Model $object the data object being validated + * @param \yii\base\Model $model the data model being validated * @param array|null $attributes the list of attributes to be validated. * Note that if an attribute is not associated with the validator, * it will be ignored. * If this parameter is null, every attribute listed in [[attributes]] will be validated. */ - public function validateAttributes($object, $attributes = null) + public function validateAttributes($model, $attributes = null) { if (is_array($attributes)) { $attributes = array_intersect($this->attributes, $attributes); @@ -231,11 +231,11 @@ class Validator extends Component $attributes = $this->attributes; } foreach ($attributes as $attribute) { - $skip = $this->skipOnError && $object->hasErrors($attribute) - || $this->skipOnEmpty && $this->isEmpty($object->$attribute); + $skip = $this->skipOnError && $model->hasErrors($attribute) + || $this->skipOnEmpty && $this->isEmpty($model->$attribute); if (!$skip) { - if ($this->when === null || call_user_func($this->when, $object, $attribute)) { - $this->validateAttribute($object, $attribute); + if ($this->when === null || call_user_func($this->when, $model, $attribute)) { + $this->validateAttribute($model, $attribute); } } } @@ -244,14 +244,14 @@ class Validator extends Component /** * Validates a single attribute. * Child classes must implement this method to provide the actual validation logic. - * @param \yii\base\Model $object the data object to be validated + * @param \yii\base\Model $model the data model to be validated * @param string $attribute the name of the attribute to be validated. */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { - $result = $this->validateValue($object->$attribute); + $result = $this->validateValue($model->$attribute); if (!empty($result)) { - $this->addError($object, $attribute, $result[0], $result[1]); + $this->addError($model, $attribute, $result[0], $result[1]); } } @@ -303,7 +303,7 @@ class Validator extends Component * - `messages`: an array used to hold the validation error messages for the attribute. * - `deferred`: an array used to hold deferred objects for asynchronous validation * - * @param \yii\base\Model $object the data object being validated + * @param \yii\base\Model $model the data model being validated * @param string $attribute the name of the attribute to be validated. * @param \yii\web\View $view the view object that is going to be used to render views or view files * containing a model form with this validator applied. @@ -311,7 +311,7 @@ class Validator extends Component * client-side validation. * @see \yii\widgets\ActiveForm::enableClientValidation */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { return null; } @@ -335,17 +335,17 @@ class Validator extends Component /** * Adds an error about the specified attribute to the model object. * This is a helper method that performs message selection and internationalization. - * @param \yii\base\Model $object the data object being validated + * @param \yii\base\Model $model the data model being validated * @param string $attribute the attribute being validated * @param string $message the error message * @param array $params values for the placeholders in the error message */ - public function addError($object, $attribute, $message, $params = []) + public function addError($model, $attribute, $message, $params = []) { - $value = $object->$attribute; - $params['attribute'] = $object->getAttributeLabel($attribute); + $value = $model->$attribute; + $params['attribute'] = $model->getAttributeLabel($attribute); $params['value'] = is_array($value) ? 'array()' : $value; - $object->addError($attribute, Yii::$app->getI18n()->format($message, $params, Yii::$app->language)); + $model->addError($attribute, Yii::$app->getI18n()->format($message, $params, Yii::$app->language)); } /** From 7d31fb597ecb74f1844229f3cbd80b37e7725d53 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 14:44:38 -0400 Subject: [PATCH 018/144] avoid test break. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f6fbb8f..0c9aac5 100644 --- a/composer.json +++ b/composer.json @@ -89,7 +89,7 @@ "require-dev": { "phpunit/phpunit": "3.7.*", "twig/twig": "*", - "smarty/smarty": "*", + "smarty/smarty": "~3.0.0", "imagine/imagine": "v0.5.0", "swiftmailer/swiftmailer": "*", "fzaninotto/faker": "*", From d13d274d05dee0c3eb8dfd365ac4d492c1c34b8d Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 14:56:59 -0400 Subject: [PATCH 019/144] renamed $object to $model --- framework/validators/BooleanValidator.php | 4 ++-- framework/validators/CompareValidator.php | 20 ++++++++-------- framework/validators/DateValidator.php | 8 +++---- framework/validators/DefaultValueValidator.php | 8 +++---- framework/validators/EmailValidator.php | 4 ++-- framework/validators/ExistValidator.php | 18 +++++++------- framework/validators/FileValidator.php | 28 +++++++++++----------- framework/validators/FilterValidator.php | 6 ++--- framework/validators/ImageValidator.php | 10 ++++---- framework/validators/InlineValidator.php | 8 +++---- framework/validators/NumberValidator.php | 16 ++++++------- framework/validators/RangeValidator.php | 4 ++-- .../validators/RegularExpressionValidator.php | 4 ++-- framework/validators/RequiredValidator.php | 4 ++-- framework/validators/SafeValidator.php | 2 +- framework/validators/StringValidator.php | 16 ++++++------- framework/validators/UniqueValidator.php | 28 +++++++++++----------- framework/validators/UrlValidator.php | 12 +++++----- 18 files changed, 100 insertions(+), 100 deletions(-) diff --git a/framework/validators/BooleanValidator.php b/framework/validators/BooleanValidator.php index 09b45f3..91e534a 100644 --- a/framework/validators/BooleanValidator.php +++ b/framework/validators/BooleanValidator.php @@ -67,13 +67,13 @@ class BooleanValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { $options = [ 'trueValue' => $this->trueValue, 'falseValue' => $this->falseValue, 'message' => Yii::$app->getI18n()->format($this->message, [ - 'attribute' => $object->getAttributeLabel($attribute), + 'attribute' => $model->getAttributeLabel($attribute), 'true' => $this->trueValue, 'false' => $this->falseValue, ], Yii::$app->language), diff --git a/framework/validators/CompareValidator.php b/framework/validators/CompareValidator.php index 70bc3ff..44c18e8 100644 --- a/framework/validators/CompareValidator.php +++ b/framework/validators/CompareValidator.php @@ -117,11 +117,11 @@ class CompareValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { - $value = $object->$attribute; + $value = $model->$attribute; if (is_array($value)) { - $this->addError($object, $attribute, Yii::t('yii', '{attribute} is invalid.')); + $this->addError($model, $attribute, Yii::t('yii', '{attribute} is invalid.')); return; } @@ -129,12 +129,12 @@ class CompareValidator extends Validator $compareLabel = $compareValue = $this->compareValue; } else { $compareAttribute = $this->compareAttribute === null ? $attribute . '_repeat' : $this->compareAttribute; - $compareValue = $object->$compareAttribute; - $compareLabel = $object->getAttributeLabel($compareAttribute); + $compareValue = $model->$compareAttribute; + $compareLabel = $model->getAttributeLabel($compareAttribute); } if (!$this->compareValues($this->operator, $this->type, $value, $compareValue)) { - $this->addError($object, $attribute, $this->message, [ + $this->addError($model, $attribute, $this->message, [ 'compareAttribute' => $compareLabel, 'compareValue' => $compareValue, ]); @@ -201,7 +201,7 @@ class CompareValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { $options = [ 'operator' => $this->operator, @@ -213,8 +213,8 @@ class CompareValidator extends Validator $compareValue = $this->compareValue; } else { $compareAttribute = $this->compareAttribute === null ? $attribute . '_repeat' : $this->compareAttribute; - $compareValue = $object->getAttributeLabel($compareAttribute); - $options['compareAttribute'] = Html::getInputId($object, $compareAttribute); + $compareValue = $model->getAttributeLabel($compareAttribute); + $options['compareAttribute'] = Html::getInputId($model, $compareAttribute); } if ($this->skipOnEmpty) { @@ -222,7 +222,7 @@ class CompareValidator extends Validator } $options['message'] = Yii::$app->getI18n()->format($this->message, [ - 'attribute' => $object->getAttributeLabel($attribute), + 'attribute' => $model->getAttributeLabel($attribute), 'compareAttribute' => $compareValue, 'compareValue' => $compareValue, ], Yii::$app->language); diff --git a/framework/validators/DateValidator.php b/framework/validators/DateValidator.php index eee0ca3..8ee5210 100644 --- a/framework/validators/DateValidator.php +++ b/framework/validators/DateValidator.php @@ -94,14 +94,14 @@ class DateValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { - $value = $object->$attribute; + $value = $model->$attribute; $timestamp = $this->parseDateValue($value); if ($timestamp === false) { - $this->addError($object, $attribute, $this->message, []); + $this->addError($model, $attribute, $this->message, []); } elseif ($this->timestampAttribute !== null) { - $object->{$this->timestampAttribute} = $timestamp; + $model->{$this->timestampAttribute} = $timestamp; } } diff --git a/framework/validators/DefaultValueValidator.php b/framework/validators/DefaultValueValidator.php index 0d80311..d31c2f4 100644 --- a/framework/validators/DefaultValueValidator.php +++ b/framework/validators/DefaultValueValidator.php @@ -41,13 +41,13 @@ class DefaultValueValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { - if ($this->isEmpty($object->$attribute)) { + if ($this->isEmpty($model->$attribute)) { if ($this->value instanceof \Closure) { - $object->$attribute = call_user_func($this->value, $object, $attribute); + $model->$attribute = call_user_func($this->value, $model, $attribute); } else { - $object->$attribute = $this->value; + $model->$attribute = $this->value; } } } diff --git a/framework/validators/EmailValidator.php b/framework/validators/EmailValidator.php index ee8c77e..3a1f82b 100644 --- a/framework/validators/EmailValidator.php +++ b/framework/validators/EmailValidator.php @@ -92,14 +92,14 @@ class EmailValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { $options = [ 'pattern' => new JsExpression($this->pattern), 'fullPattern' => new JsExpression($this->fullPattern), 'allowName' => $this->allowName, 'message' => Yii::$app->getI18n()->format($this->message, [ - 'attribute' => $object->getAttributeLabel($attribute), + 'attribute' => $model->getAttributeLabel($attribute), ], Yii::$app->language), 'enableIDN' => (boolean) $this->enableIDN, ]; diff --git a/framework/validators/ExistValidator.php b/framework/validators/ExistValidator.php index 20236f0..2657391 100644 --- a/framework/validators/ExistValidator.php +++ b/framework/validators/ExistValidator.php @@ -81,7 +81,7 @@ class ExistValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { $targetAttribute = $this->targetAttribute === null ? $attribute : $this->targetAttribute; @@ -91,31 +91,31 @@ class ExistValidator extends Validator } $params = []; foreach ($targetAttribute as $k => $v) { - $params[$v] = is_integer($k) ? $object->$v : $object->$k; + $params[$v] = is_integer($k) ? $model->$v : $model->$k; } } else { - $params = [$targetAttribute => $object->$attribute]; + $params = [$targetAttribute => $model->$attribute]; } if (!$this->allowArray) { foreach ($params as $value) { if (is_array($value)) { - $this->addError($object, $attribute, Yii::t('yii', '{attribute} is invalid.')); + $this->addError($model, $attribute, Yii::t('yii', '{attribute} is invalid.')); return; } } } - $targetClass = $this->targetClass === null ? get_class($object) : $this->targetClass; + $targetClass = $this->targetClass === null ? get_class($model) : $this->targetClass; $query = $this->createQuery($targetClass, $params); - if (is_array($object->$attribute)) { - if ($query->count("DISTINCT [[$targetAttribute]]") != count($object->$attribute)) { - $this->addError($object, $attribute, $this->message); + if (is_array($model->$attribute)) { + if ($query->count("DISTINCT [[$targetAttribute]]") != count($model->$attribute)) { + $this->addError($model, $attribute, $this->message); } } elseif (!$query->exists()) { - $this->addError($object, $attribute, $this->message); + $this->addError($model, $attribute, $this->message); } } diff --git a/framework/validators/FileValidator.php b/framework/validators/FileValidator.php index d43119c..16c38ba 100644 --- a/framework/validators/FileValidator.php +++ b/framework/validators/FileValidator.php @@ -166,12 +166,12 @@ class FileValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { if ($this->maxFiles > 1) { - $files = $object->$attribute; + $files = $model->$attribute; if (!is_array($files)) { - $this->addError($object, $attribute, $this->uploadRequired); + $this->addError($model, $attribute, $this->uploadRequired); return; } @@ -180,24 +180,24 @@ class FileValidator extends Validator unset($files[$i]); } } - $object->$attribute = array_values($files); + $model->$attribute = array_values($files); if (empty($files)) { - $this->addError($object, $attribute, $this->uploadRequired); + $this->addError($model, $attribute, $this->uploadRequired); } if (count($files) > $this->maxFiles) { - $this->addError($object, $attribute, $this->tooMany, ['limit' => $this->maxFiles]); + $this->addError($model, $attribute, $this->tooMany, ['limit' => $this->maxFiles]); } else { foreach ($files as $file) { $result = $this->validateValue($file); if (!empty($result)) { - $this->addError($object, $attribute, $result[0], $result[1]); + $this->addError($model, $attribute, $result[0], $result[1]); } } } } else { - $result = $this->validateValue($object->$attribute); + $result = $this->validateValue($model->$attribute); if (!empty($result)) { - $this->addError($object, $attribute, $result[0], $result[1]); + $this->addError($model, $attribute, $result[0], $result[1]); } } } @@ -334,22 +334,22 @@ class FileValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { ValidationAsset::register($view); - $options = $this->getClientOptions($object, $attribute); + $options = $this->getClientOptions($model, $attribute); return 'yii.validation.file(attribute, messages, ' . json_encode($options, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . ');'; } /** * Returns the client side validation options. - * @param \yii\base\Model $object the model being validated + * @param \yii\base\Model $model the model being validated * @param string $attribute the attribute name being validated * @return array the client side validation options */ - protected function getClientOptions($object, $attribute) + protected function getClientOptions($model, $attribute) { - $label = $object->getAttributeLabel($attribute); + $label = $model->getAttributeLabel($attribute); $options = []; if ($this->message !== null) { diff --git a/framework/validators/FilterValidator.php b/framework/validators/FilterValidator.php index edc171d..bd0404e 100644 --- a/framework/validators/FilterValidator.php +++ b/framework/validators/FilterValidator.php @@ -65,11 +65,11 @@ class FilterValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { - $value = $object->$attribute; + $value = $model->$attribute; if (!$this->skipOnArray || !is_array($value)) { - $object->$attribute = call_user_func($this->filter, $value); + $model->$attribute = call_user_func($this->filter, $value); } } } diff --git a/framework/validators/ImageValidator.php b/framework/validators/ImageValidator.php index 6643c6c..9fa38d5 100644 --- a/framework/validators/ImageValidator.php +++ b/framework/validators/ImageValidator.php @@ -162,21 +162,21 @@ class ImageValidator extends FileValidator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { ValidationAsset::register($view); - $options = $this->getClientOptions($object, $attribute); + $options = $this->getClientOptions($model, $attribute); return 'yii.validation.image(attribute, messages, ' . json_encode($options, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . ', deferred);'; } /** * @inheritdoc */ - protected function getClientOptions($object, $attribute) + protected function getClientOptions($model, $attribute) { - $options = parent::getClientOptions($object, $attribute); + $options = parent::getClientOptions($model, $attribute); - $label = $object->getAttributeLabel($attribute); + $label = $model->getAttributeLabel($attribute); if ($this->notImage !== null) { $options['notImage'] = Yii::$app->getI18n()->format($this->notImage, [ diff --git a/framework/validators/InlineValidator.php b/framework/validators/InlineValidator.php index 0e5cd33..c4f4b95 100644 --- a/framework/validators/InlineValidator.php +++ b/framework/validators/InlineValidator.php @@ -58,11 +58,11 @@ class InlineValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { $method = $this->method; if (is_string($method)) { - $method = [$object, $method]; + $method = [$model, $method]; } call_user_func($method, $attribute, $this->params); } @@ -70,12 +70,12 @@ class InlineValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { if ($this->clientValidate !== null) { $method = $this->clientValidate; if (is_string($method)) { - $method = [$object, $method]; + $method = [$model, $method]; } return call_user_func($method, $attribute, $this->params); diff --git a/framework/validators/NumberValidator.php b/framework/validators/NumberValidator.php index e299e96..bd7660c 100644 --- a/framework/validators/NumberValidator.php +++ b/framework/validators/NumberValidator.php @@ -75,22 +75,22 @@ class NumberValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { - $value = $object->$attribute; + $value = $model->$attribute; if (is_array($value)) { - $this->addError($object, $attribute, $this->message); + $this->addError($model, $attribute, $this->message); return; } $pattern = $this->integerOnly ? $this->integerPattern : $this->numberPattern; if (!preg_match($pattern, "$value")) { - $this->addError($object, $attribute, $this->message); + $this->addError($model, $attribute, $this->message); } if ($this->min !== null && $value < $this->min) { - $this->addError($object, $attribute, $this->tooSmall, ['min' => $this->min]); + $this->addError($model, $attribute, $this->tooSmall, ['min' => $this->min]); } if ($this->max !== null && $value > $this->max) { - $this->addError($object, $attribute, $this->tooBig, ['max' => $this->max]); + $this->addError($model, $attribute, $this->tooBig, ['max' => $this->max]); } } @@ -117,9 +117,9 @@ class NumberValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { - $label = $object->getAttributeLabel($attribute); + $label = $model->getAttributeLabel($attribute); $options = [ 'pattern' => new JsExpression($this->integerOnly ? $this->integerPattern : $this->numberPattern), diff --git a/framework/validators/RangeValidator.php b/framework/validators/RangeValidator.php index 370a1d5..04f37b2 100644 --- a/framework/validators/RangeValidator.php +++ b/framework/validators/RangeValidator.php @@ -79,7 +79,7 @@ class RangeValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { $range = []; foreach ($this->range as $value) { @@ -89,7 +89,7 @@ class RangeValidator extends Validator 'range' => $range, 'not' => $this->not, 'message' => Yii::$app->getI18n()->format($this->message, [ - 'attribute' => $object->getAttributeLabel($attribute), + 'attribute' => $model->getAttributeLabel($attribute), ], Yii::$app->language), ]; if ($this->skipOnEmpty) { diff --git a/framework/validators/RegularExpressionValidator.php b/framework/validators/RegularExpressionValidator.php index dee81ff..acf7482 100644 --- a/framework/validators/RegularExpressionValidator.php +++ b/framework/validators/RegularExpressionValidator.php @@ -62,7 +62,7 @@ class RegularExpressionValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { $pattern = $this->pattern; $pattern = preg_replace('/\\\\x\{?([0-9a-fA-F]+)\}?/', '\u$1', $pattern); @@ -82,7 +82,7 @@ class RegularExpressionValidator extends Validator 'pattern' => new JsExpression($pattern), 'not' => $this->not, 'message' => Yii::$app->getI18n()->format($this->message, [ - 'attribute' => $object->getAttributeLabel($attribute), + 'attribute' => $model->getAttributeLabel($attribute), ], Yii::$app->language), ]; if ($this->skipOnEmpty) { diff --git a/framework/validators/RequiredValidator.php b/framework/validators/RequiredValidator.php index 3b57876..e416b10 100644 --- a/framework/validators/RequiredValidator.php +++ b/framework/validators/RequiredValidator.php @@ -86,7 +86,7 @@ class RequiredValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { $options = []; if ($this->requiredValue !== null) { @@ -102,7 +102,7 @@ class RequiredValidator extends Validator } $options['message'] = Yii::$app->getI18n()->format($options['message'], [ - 'attribute' => $object->getAttributeLabel($attribute), + 'attribute' => $model->getAttributeLabel($attribute), ], Yii::$app->language); ValidationAsset::register($view); diff --git a/framework/validators/SafeValidator.php b/framework/validators/SafeValidator.php index fcb8440..846d63e 100644 --- a/framework/validators/SafeValidator.php +++ b/framework/validators/SafeValidator.php @@ -18,7 +18,7 @@ class SafeValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { } } diff --git a/framework/validators/StringValidator.php b/framework/validators/StringValidator.php index 0ca40c6..a9a34b2 100644 --- a/framework/validators/StringValidator.php +++ b/framework/validators/StringValidator.php @@ -96,12 +96,12 @@ class StringValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { - $value = $object->$attribute; + $value = $model->$attribute; if (!is_string($value)) { - $this->addError($object, $attribute, $this->message); + $this->addError($model, $attribute, $this->message); return; } @@ -109,13 +109,13 @@ class StringValidator extends Validator $length = mb_strlen($value, $this->encoding); if ($this->min !== null && $length < $this->min) { - $this->addError($object, $attribute, $this->tooShort, ['min' => $this->min]); + $this->addError($model, $attribute, $this->tooShort, ['min' => $this->min]); } if ($this->max !== null && $length > $this->max) { - $this->addError($object, $attribute, $this->tooLong, ['max' => $this->max]); + $this->addError($model, $attribute, $this->tooLong, ['max' => $this->max]); } if ($this->length !== null && $length !== $this->length) { - $this->addError($object, $attribute, $this->notEqual, ['length' => $this->length]); + $this->addError($model, $attribute, $this->notEqual, ['length' => $this->length]); } } @@ -146,9 +146,9 @@ class StringValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { - $label = $object->getAttributeLabel($attribute); + $label = $model->getAttributeLabel($attribute); $options = [ 'message' => Yii::$app->getI18n()->format($this->message, [ diff --git a/framework/validators/UniqueValidator.php b/framework/validators/UniqueValidator.php index 9b0388a..eb90494 100644 --- a/framework/validators/UniqueValidator.php +++ b/framework/validators/UniqueValidator.php @@ -74,24 +74,24 @@ class UniqueValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { /* @var $targetClass ActiveRecordInterface */ - $targetClass = $this->targetClass === null ? get_class($object) : $this->targetClass; + $targetClass = $this->targetClass === null ? get_class($model) : $this->targetClass; $targetAttribute = $this->targetAttribute === null ? $attribute : $this->targetAttribute; if (is_array($targetAttribute)) { $params = []; foreach ($targetAttribute as $k => $v) { - $params[$v] = is_integer($k) ? $object->$v : $object->$k; + $params[$v] = is_integer($k) ? $model->$v : $model->$k; } } else { - $params = [$targetAttribute => $object->$attribute]; + $params = [$targetAttribute => $model->$attribute]; } foreach ($params as $value) { if (is_array($value)) { - $this->addError($object, $attribute, Yii::t('yii', '{attribute} is invalid.')); + $this->addError($model, $attribute, Yii::t('yii', '{attribute} is invalid.')); return; } @@ -106,14 +106,14 @@ class UniqueValidator extends Validator $query->andWhere($this->filter); } - if (!$object instanceof ActiveRecordInterface || $object->getIsNewRecord()) { - // if current $object isn't in the database yet then it's OK just to call exists() + if (!$model instanceof ActiveRecordInterface || $model->getIsNewRecord()) { + // if current $model isn't in the database yet then it's OK just to call exists() $exists = $query->exists(); } else { - // if current $object is in the database already we can't use exists() - /* @var $objects ActiveRecordInterface[] */ - $objects = $query->limit(2)->all(); - $n = count($objects); + // if current $model is in the database already we can't use exists() + /* @var $models ActiveRecordInterface[] */ + $models = $query->limit(2)->all(); + $n = count($models); if ($n === 1) { $keys = array_keys($params); $pks = $targetClass::primaryKey(); @@ -121,10 +121,10 @@ class UniqueValidator extends Validator sort($pks); if ($keys === $pks) { // primary key is modified and not unique - $exists = $object->getOldPrimaryKey() != $object->getPrimaryKey(); + $exists = $model->getOldPrimaryKey() != $model->getPrimaryKey(); } else { // non-primary key, need to exclude the current record based on PK - $exists = $objects[0]->getPrimaryKey() != $object->getOldPrimaryKey(); + $exists = $models[0]->getPrimaryKey() != $model->getOldPrimaryKey(); } } else { $exists = $n > 1; @@ -132,7 +132,7 @@ class UniqueValidator extends Validator } if ($exists) { - $this->addError($object, $attribute, $this->message); + $this->addError($model, $attribute, $this->message); } } } diff --git a/framework/validators/UrlValidator.php b/framework/validators/UrlValidator.php index 4c2c0a5..11b67cd 100644 --- a/framework/validators/UrlValidator.php +++ b/framework/validators/UrlValidator.php @@ -66,14 +66,14 @@ class UrlValidator extends Validator /** * @inheritdoc */ - public function validateAttribute($object, $attribute) + public function validateAttribute($model, $attribute) { - $value = $object->$attribute; + $value = $model->$attribute; $result = $this->validateValue($value); if (!empty($result)) { - $this->addError($object, $attribute, $result[0], $result[1]); + $this->addError($model, $attribute, $result[0], $result[1]); } elseif ($this->defaultScheme !== null && strpos($value, '://') === false) { - $object->$attribute = $this->defaultScheme . '://' . $value; + $model->$attribute = $this->defaultScheme . '://' . $value; } } @@ -111,7 +111,7 @@ class UrlValidator extends Validator /** * @inheritdoc */ - public function clientValidateAttribute($object, $attribute, $view) + public function clientValidateAttribute($model, $attribute, $view) { if (strpos($this->pattern, '{schemes}') !== false) { $pattern = str_replace('{schemes}', '(' . implode('|', $this->validSchemes) . ')', $this->pattern); @@ -122,7 +122,7 @@ class UrlValidator extends Validator $options = [ 'pattern' => new JsExpression($pattern), 'message' => Yii::$app->getI18n()->format($this->message, [ - 'attribute' => $object->getAttributeLabel($attribute), + 'attribute' => $model->getAttributeLabel($attribute), ], Yii::$app->language), 'enableIDN' => (boolean) $this->enableIDN, ]; From 39e5e5d3ed16db32b5093510ca73b3278dd4b02c Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 15:01:48 -0400 Subject: [PATCH 020/144] fixed test break due to smarty error. --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 0c9aac5..59c2ebe 100644 --- a/composer.json +++ b/composer.json @@ -89,8 +89,8 @@ "require-dev": { "phpunit/phpunit": "3.7.*", "twig/twig": "*", - "smarty/smarty": "~3.0.0", - "imagine/imagine": "v0.5.0", + "smarty/smarty": "~3.0", + "imagine/imagine": "~0.5", "swiftmailer/swiftmailer": "*", "fzaninotto/faker": "*", "cebe/indent": "*" From 29f69394ab547fae3df3fac438f2efeecd4c064c Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 15:16:49 -0400 Subject: [PATCH 021/144] build break fix. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 59c2ebe..018f196 100644 --- a/composer.json +++ b/composer.json @@ -90,7 +90,7 @@ "phpunit/phpunit": "3.7.*", "twig/twig": "*", "smarty/smarty": "~3.0", - "imagine/imagine": "~0.5", + "imagine/imagine": "0.5.*", "swiftmailer/swiftmailer": "*", "fzaninotto/faker": "*", "cebe/indent": "*" From 1eef5cb33b0fe360d245774fbf8b5dd6e2b89242 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 15:22:13 -0400 Subject: [PATCH 022/144] fixed test break. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 018f196..03b04f5 100644 --- a/composer.json +++ b/composer.json @@ -89,7 +89,7 @@ "require-dev": { "phpunit/phpunit": "3.7.*", "twig/twig": "*", - "smarty/smarty": "~3.0", + "smarty/smarty": "~3.1", "imagine/imagine": "0.5.*", "swiftmailer/swiftmailer": "*", "fzaninotto/faker": "*", From b5060404116066304504ac5cebdb525f52b4c05f Mon Sep 17 00:00:00 2001 From: Alexander Mohorev Date: Fri, 31 Oct 2014 22:53:04 +0300 Subject: [PATCH 023/144] Grammatical errors and typos fixes --- docs/guide-ru/caching-fragment.md | 6 ++-- docs/guide-ru/caching-http.md | 2 +- docs/guide-ru/caching-page.md | 4 +-- docs/guide-ru/concept-configurations.md | 2 +- docs/guide-ru/concept-di-container.md | 8 +++--- docs/guide-ru/intro-upgrade-from-v1.md | 2 +- docs/guide-ru/intro-yii.md | 4 +-- docs/guide-ru/rest-quick-start.md | 2 +- docs/guide-ru/rest-rate-limiting.md | 2 +- docs/guide-ru/rest-resources.md | 2 +- docs/guide-ru/runtime-url-handling.md | 2 +- docs/guide-ru/start-workflow.md | 2 +- docs/guide-ru/structure-application-components.md | 4 +-- docs/guide-ru/structure-applications.md | 34 +++++++++++------------ docs/guide-ru/structure-controllers.md | 14 +++++----- docs/guide-ru/structure-views.md | 8 +++--- docs/guide-ru/structure-widgets.md | 4 +-- docs/guide-ru/tutorial-core-validators.md | 2 +- 18 files changed, 52 insertions(+), 52 deletions(-) diff --git a/docs/guide-ru/caching-fragment.md b/docs/guide-ru/caching-fragment.md index a4d014d..a4fd662 100644 --- a/docs/guide-ru/caching-fragment.md +++ b/docs/guide-ru/caching-fragment.md @@ -29,7 +29,7 @@ if ($this->beginCache($id)) { ### Срок хранения Наверное, наиболее часто используемым параметром является [[yii\widgets\FragmentCache::duration|duration]]. -Он определяет какое количество секунд содержимое будет оставаться действительным (корректным). Следующий код помещает фрагмент в кэш не более, чем на час:: +Он определяет какое количество секунд содержимое будет оставаться действительным (корректным). Следующий код помещает фрагмент в кэш не более, чем на час: ```php if ($this->beginCache($id, ['duration' => 3600])) { @@ -83,7 +83,7 @@ if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) { ### Переключение кэширования -Иногда может потребоваться включать кеширование фрагментов только для определённых условий. Например, страницу с формой мы хотим кэшировать только тогда, когда обращение к ней произошло впервые (посредством GET запроса). Любое последующее отображение формы (посредством POST запроса) не должно быть кэшировано, потому что может содержать данные, введённые пользователем. Для этого мы задаём параметр [[yii\widgets\FragmentCache::enabled|enabled]]: +Иногда может потребоваться включать кэширование фрагментов только для определённых условий. Например, страницу с формой мы хотим кэшировать только тогда, когда обращение к ней произошло впервые (посредством GET запроса). Любое последующее отображение формы (посредством POST запроса) не должно быть кэшировано, потому что может содержать данные, введённые пользователем. Для этого мы задаём параметр [[yii\widgets\FragmentCache::enabled|enabled]]: ```php if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) { @@ -117,7 +117,7 @@ if ($this->beginCache($id1)) { } ``` -Параметры кэширования могут быть различными для вложенных кэшей. Например, внутренний и внешний кэши в вышеприведённом примере могут иметь разные сроки хранения. Даже когда данные внешнего кэша уже не являются актуальными, внутренний кеш может содержать актуальный фрагмент. Тем не менее, обратное не верно. Если внешний кэш актуален, данные будут отдаваться из него даже если внутренний кэш содержит устаревшие данные. Следует проявлять осторожность при выставлении срока хранения и задания зависимостей для вложенных кэшей. В противном случае вы можете получить устаревшие данные. +Параметры кэширования могут быть различными для вложенных кэшей. Например, внутренний и внешний кэши в вышеприведённом примере могут иметь разные сроки хранения. Даже когда данные внешнего кэша уже не являются актуальными, внутренний кэш может содержать актуальный фрагмент. Тем не менее, обратное не верно. Если внешний кэш актуален, данные будут отдаваться из него даже если внутренний кэш содержит устаревшие данные. Следует проявлять осторожность при выставлении срока хранения и задания зависимостей для вложенных кэшей. В противном случае вы можете получить устаревшие данные. ## Динамическое содержимое diff --git a/docs/guide-ru/caching-http.md b/docs/guide-ru/caching-http.md index a6afd52..f05a7cf 100644 --- a/docs/guide-ru/caching-http.md +++ b/docs/guide-ru/caching-http.md @@ -104,7 +104,7 @@ Cache-Control: public, max-age=3600 ## Ограничитель кэша сессий -Когда на странице используются сессии, PHP автоматически отправляет некоторые связанные с кэшем HTTP заголовки, определённые в настройке `session.cache_limiter` в php.ini. Эти заголовки могут вмешиваться или отключать кэширование, которое вы ожидаете от `HttpCache`. Чтобы предотвратить эту проблему, по-умолчанию `HttpCache` будет автоматически отключать отправку этих заголовков. Если вы хотите изменить это поведение, вы должны настроить свойство [[yii\filters\HttpCache::sessionCacheLimiter]]. Это свойство может принимать строковое значение, включая `public`, `private`, `private_no_expire` и `nocache`. Пожалуйста, обратитесь к руководству PHP о [session_cache_limiter()](http://www.php.net/manual/en/function.session-cache-limiter.php) +Когда на странице используются сессии, PHP автоматически отправляет некоторые связанные с кэшем HTTP заголовки, определённые в настройке `session.cache_limiter` в php.ini. Эти заголовки могут вмешиваться или отключать кэширование, которое вы ожидаете от `HttpCache`. Чтобы предотвратить эту проблему, по умолчанию `HttpCache` будет автоматически отключать отправку этих заголовков. Если вы хотите изменить это поведение, вы должны настроить свойство [[yii\filters\HttpCache::sessionCacheLimiter]]. Это свойство может принимать строковое значение, включая `public`, `private`, `private_no_expire` и `nocache`. Пожалуйста, обратитесь к руководству PHP о [session_cache_limiter()](http://www.php.net/manual/en/function.session-cache-limiter.php) для объяснения этих значений. diff --git a/docs/guide-ru/caching-page.md b/docs/guide-ru/caching-page.md index 862b566..52d36dc 100644 --- a/docs/guide-ru/caching-page.md +++ b/docs/guide-ru/caching-page.md @@ -2,7 +2,7 @@ ================= Кэширование страниц — это кэширование всего содержимого страницы на стороне сервера. Позже, когда эта страница -будет снова запрошена, сервер вернет её из кэша вместо того что бы генерировать её заново. +будет снова запрошена, сервер вернет её из кэша вместо того чтобы генерировать её заново. Кэширование страниц осуществляется при помощи [фильтра действия](structure-filters.md) [[yii\filters\PageCache]] и может быть использовано в классе контроллера следующим образом: @@ -27,7 +27,7 @@ public function behaviors() } ``` -Приведённый код задействует кэширование только для действия `index`. Содержимое страницы кешируется максимум на 60 секунд +Приведённый код задействует кэширование только для действия `index`. Содержимое страницы кэшируется максимум на 60 секунд и варьируется в зависимости от текущего языка приложения. Кэшированная страница должна быть признана просроченной, если общее количество постов изменилось. diff --git a/docs/guide-ru/concept-configurations.md b/docs/guide-ru/concept-configurations.md index 224cd22..019e68a 100644 --- a/docs/guide-ru/concept-configurations.md +++ b/docs/guide-ru/concept-configurations.md @@ -2,7 +2,7 @@ ======== Настройки широко используются в Yii при создании новых объектов или при инициализации уже существующих объектов. -Обычно настройки включают в себя названия классов создаваемых объектов и список первоначальных значений +Обычно настройки включают в себя названия классов создаваемых объектов и список первоначальных значений, которые должны быть присвоены [свойствам](concept-properties.md) объекта. Также в настройках можно указать список [обработчиков событий](concept-events.md) объекта, и/или список [поведений](concept-behaviors.md) объекта. diff --git a/docs/guide-ru/concept-di-container.md b/docs/guide-ru/concept-di-container.md index d031b83..7806f88 100644 --- a/docs/guide-ru/concept-di-container.md +++ b/docs/guide-ru/concept-di-container.md @@ -98,7 +98,7 @@ $container = new \yii\di\Container; // регистрация имени класса, как есть. это может быть пропущено. $container->set('yii\db\Connection'); -// регистраци интерфейса +// регистрация интерфейса // Когда класс зависит от интерфейса, соответствующий класс // будет использован в качестве зависимости объекта $container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer'); @@ -172,7 +172,7 @@ $engine = $container->get('app\components\SearchEngine', [$apiKey], ['type' => 1 ``` За кулисами, контейнер внедрения зависимостей делает гораздо больше работы, чем просто создание нового объекта. -Прежде всего, контейнер, осмотрит конструктор класса, что бы узнать имя зависимого класса или интерфейса, а затем автоматически разрешит эти зависимости рекурсивно. +Прежде всего, контейнер, осмотрит конструктор класса, чтобы узнать имя зависимого класса или интерфейса, а затем автоматически разрешит эти зависимости рекурсивно. Следующий код демонстрирует более сложный пример. Класс `UserLister` зависит от объекта, реализующего интерфейс `UserFinderInterface`; класс `UserFinder` реализует этот интерфейс и зависит от объекта `Connection`. Все эти зависимости были объявлены через тип подсказки параметров конструктора класса. @@ -240,7 +240,7 @@ $lister = new UserLister($finder); Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md) вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]], -метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], что бы создать новый объект. +метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], чтобы создать новый объект. Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект. Поскольку Yii использует [[Yii::createObject()]] в большей части кода своего ядра для создания новых объектов, это означает, что вы можете настроить глобальные объекты, имея дело с [[Yii::$container]]. @@ -307,7 +307,7 @@ class HotelController extends Controller Итог ------- Как dependency injection, так и [service locator](concept-service-locator.md) являются популярными паттернами проектирования, которые позволяют -создавать программное обеспечение в слабосвязаной и более тестируемой манере. +создавать программное обеспечение в слабосвязанной и более тестируемой манере. Мы настоятельно рекомендуем к прочтению [статью Мартина Фаулера](http://martinfowler.com/articles/injection.html), для более глубокого понимания dependency injection и service locator. diff --git a/docs/guide-ru/intro-upgrade-from-v1.md b/docs/guide-ru/intro-upgrade-from-v1.md index e322d6f..dd7861e 100644 --- a/docs/guide-ru/intro-upgrade-from-v1.md +++ b/docs/guide-ru/intro-upgrade-from-v1.md @@ -445,7 +445,7 @@ Yii 2.0 осуществляет жадную загрузку связи не $customers = Customer::find()->asArray()->all(); ``` -Ещё одно изменение связано с тем, что вы больше не можете определять значения по-умолчанию через public свойства. +Ещё одно изменение связано с тем, что вы больше не можете определять значения по умолчанию через public свойства. Вы должны установить их в методе `init` вашего класса, если это требуется. ```php diff --git a/docs/guide-ru/intro-yii.md b/docs/guide-ru/intro-yii.md index dc0e046..0494c64 100644 --- a/docs/guide-ru/intro-yii.md +++ b/docs/guide-ru/intro-yii.md @@ -10,7 +10,7 @@ Yii – это высокопроизводительный компонентн ------------------------------------------ Yii – это универсальный фреймворк и может быть задействован во всех типах веб приложений. Благодаря его компонентной -структуре и отличной поддержке кеширования, фреймворк особенно подходит для разработки таких крупных проектов как +структуре и отличной поддержке кэширования, фреймворк особенно подходит для разработки таких крупных проектов как порталы, форумы, CMS, магазины или RESTful-приложения. @@ -23,7 +23,7 @@ Yii – это универсальный фреймворк и может бы - Yii придерживается философии простого и элегантного кода не пытаясь усложнять дизайн только ради следования каким-либо шаблонам проектирования. - Yii является full-stack фреймворком и включает в себя проверенные и хорошо зарекомендовавшие себя возможности, такие как - ActiveRecord для реляционных и NoSQL баз данных, поддержку REST API, многоуровневое кеширование и другие. + ActiveRecord для реляционных и NoSQL баз данных, поддержку REST API, многоуровневое кэширование и другие. - Yii отлично расширяем. Вы можете настроить или заменить практически любую часть основного кода. Используя архитектуру расширений легко делиться кодом или использовать код сообщества. - Одна из главных целей Yii – производительность. diff --git a/docs/guide-ru/rest-quick-start.md b/docs/guide-ru/rest-quick-start.md index c0b7a82..61e6202 100644 --- a/docs/guide-ru/rest-quick-start.md +++ b/docs/guide-ru/rest-quick-start.md @@ -5,7 +5,7 @@ Yii включает полноценный набор средств для у В частности это следующие возможности: * Быстрое создание прототипов с поддержкой распространенных API к [Active Record](db-active-record.md); -* Настройка формата ответа (JSON и XML реализованы по-умолчанию); +* Настройка формата ответа (JSON и XML реализованы по умолчанию); * Получение сериализованных объектов с нужной вам выборкой полей; * Надлежащее форматирование данных и ошибок при их валидации; * Поддержка [HATEOAS](http://en.wikipedia.org/wiki/HATEOAS); diff --git a/docs/guide-ru/rest-rate-limiting.md b/docs/guide-ru/rest-rate-limiting.md index c317767..7c4c900 100644 --- a/docs/guide-ru/rest-rate-limiting.md +++ b/docs/guide-ru/rest-rate-limiting.md @@ -18,7 +18,7 @@ Вы можете использовать два столбца в таблице user для хранения количества разрешённых запросов и времени последней проверки. В методах `loadAllowance()` и `saveAllowance()` можно реализовать чтение и сохранение значений этих столбцов в соответствии с данными текущего аутентифицированного пользователя. Для улучшения производительности можно попробовать хранить эту -информацию в кеше или NoSQL хранилище. +информацию в кэше или NoSQL хранилище. Как только соответствующий интерфейс будет реализован в классе identity, Yii начнёт автоматически проверять ограничения частоты запросов при помощи [[yii\filters\RateLimiter]], фильтра действий для [[yii\rest\Controller]]. При превышении diff --git a/docs/guide-ru/rest-resources.md b/docs/guide-ru/rest-resources.md index 5d8157e..c6a2e80 100644 --- a/docs/guide-ru/rest-resources.md +++ b/docs/guide-ru/rest-resources.md @@ -26,7 +26,7 @@ RESTful API строятся вокруг доступа к *ресурсам* Вы можете указать какие данные включать в представление ресурса в виде массива путём переопределения методов [[yii\base\Model::fields()|fields()]] и/или [[yii\base\Model::extraFields()|extraFields()]]. Разница между ними в том, -что первый определяет набор полей которые всегда будут включены в массив, а второй определяет дополнительные поля, которые +что первый определяет набор полей, которые всегда будут включены в массив, а второй определяет дополнительные поля, которые пользователь может запросить через параметр `expand`: ``` diff --git a/docs/guide-ru/runtime-url-handling.md b/docs/guide-ru/runtime-url-handling.md index 47ca361..6ae9a66 100644 --- a/docs/guide-ru/runtime-url-handling.md +++ b/docs/guide-ru/runtime-url-handling.md @@ -85,7 +85,7 @@ Url::previous(); // получить ранее сохраненный URL >**Совет**: чтобы сгенерировать URL с хэштэгом, например `/index.php?r=site/page&id=100#title`, укажите параметр `#` в хелпере таким образом: `Url::to(['post/read', 'id' => 100, '#' => 'title'])`. -Также существует метод `Url::canonical()` , который позволяет создать [канонический URL](https://en.wikipedia.org/wiki/Canonical_link_element) (статья на англ., перевода пока нет) для текущего действия. Этот метод при создании игнорирует все параметры действия кроме тех, которые были переданы как аргументы. +Также существует метод `Url::canonical()`, который позволяет создать [канонический URL](https://en.wikipedia.org/wiki/Canonical_link_element) (статья на англ., перевода пока нет) для текущего действия. Этот метод при создании игнорирует все параметры действия кроме тех, которые были переданы как аргументы. Пример: ```php diff --git a/docs/guide-ru/start-workflow.md b/docs/guide-ru/start-workflow.md index e89909c..b8241e7 100644 --- a/docs/guide-ru/start-workflow.md +++ b/docs/guide-ru/start-workflow.md @@ -34,7 +34,7 @@ basic/ корневой каталог приложения commands/ содержит классы консольных команд controllers/ контроллеры models/ модели - runtime/ файлы, которые генерирует Yii во время выполнения приложения (логи, кеш и т.п.) + runtime/ файлы, которые генерирует Yii во время выполнения приложения (логи, кэш и т.п.) vendor/ содержит пакеты Composer'а и, собственно, сам фреймворк Yii views/ виды приложения web/ корневая директория Web приложения. Содержит файлы, доступные через Web diff --git a/docs/guide-ru/structure-application-components.md b/docs/guide-ru/structure-application-components.md index 56332fb..aff1e99 100755 --- a/docs/guide-ru/structure-application-components.md +++ b/docs/guide-ru/structure-application-components.md @@ -50,14 +50,14 @@ ## Встроенные компоненты приложения -В Yii есть несколько *встроенных* компонентов приложения, с фиксированными ID и конфигурациями по-умолчанию. Например, +В Yii есть несколько *встроенных* компонентов приложения, с фиксированными ID и конфигурациями по умолчанию. Например, компонент [[yii\web\Application::request|request]] используется для сбора информации о запросе пользователя и разбора его в определенный [маршрут](runtime-routing.md); компонент [[yii\base\Application::db|db]] представляет собой соединение с базой данных, через которое вы можете выполнять запросы. Именно с помощью этих встроенных компонентов Yii приложения могут обработать запрос пользователя. Ниже представлен список встроенных компонентов приложения. Вы можете конфигурировать их также как и другие компоненты приложения. -Когда вы конфигурируете встроенный компонент приложения и не указываете класс этого компонента, то значение по-умолчанию будет использовано. +Когда вы конфигурируете встроенный компонент приложения и не указываете класс этого компонента, то значение по умолчанию будет использовано. * [[yii\web\AssetManager|assetManager]]: используется для управления и опубликования ресурсов приложения. Более детальная информация представлена в разделе [Ресурсы](output-assets.md); diff --git a/docs/guide-ru/structure-applications.md b/docs/guide-ru/structure-applications.md index cbe2306..5b9bcac 100644 --- a/docs/guide-ru/structure-applications.md +++ b/docs/guide-ru/structure-applications.md @@ -225,7 +225,7 @@ ID `post` будет соответствовать `app\controllers\PostControl #### [[yii\base\Application::controllerNamespace|controllerNamespace]] -Данное свойство указывает пространство имен, в котором по-умолчанию должны находится названия классов контроллеров. +Данное свойство указывает пространство имен, в котором по умолчанию должны находится названия классов контроллеров. По-умолчанию значение равно `app\controllers`. Если ID контроллера `post`, то согласно соглашению, соответствующий класс контроллера (без пространства имен) будет равен `PostController`, а полное название класса будет равно `app\controllers\PostController`. @@ -247,7 +247,7 @@ ID `post` будет соответствовать `app\controllers\PostControl Значение данного свойства определяется различными аспектами [интернационализации](tutorial-i18n.md), в том числе переводом сообщений, форматированием дат, форматированием чисел, и т. д. Например, виджет [[yii\jui\DatePicker]] -использует данное свойство для определения по-умолчанию языка, на котором должен быть отображен календарь и формат данных +использует данное свойство для определения по умолчанию языка, на котором должен быть отображен календарь и формат данных для календаря. Рекомендуется что вы будете указывать язык в рамках стандарта [IETF](http://en.wikipedia.org/wiki/IETF_language_tag). @@ -348,7 +348,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; ### Полезные свойства -Свойства, указанные в данном подразделе, не являются часто конфигурируемыми, т. к. их значения по-умолчанию +Свойства, указанные в данном подразделе, не являются часто конфигурируемыми, т. к. их значения по умолчанию соответствуют общепринятым соглашениям. Однако, вы можете их настроить, если вам нужно использовать другие соглашения. @@ -364,14 +364,14 @@ $width = \Yii::$app->params['thumbnail.size'][0]; Свойство указывает [маршрут](runtime-routing.md), который должно использовать приложение, когда он не указан во входящем запросе. Маршрут может состоять из ID модуля, ID контроллера и/или ID действия. Например, `help`, -`post/create`, `admin/post/create`. Если действие не указано, то будет использовано значение по-умолчанию +`post/create`, `admin/post/create`. Если действие не указано, то будет использовано значение по умолчанию указанное в [[yii\base\Controller::defaultAction]]. -Для [yii\web\Application|веб приложений], значение по-умолчанию для данного свойства равно `'site'`, что означает -контроллер `SiteController` и его действие по-умолчанию должно быть использовано. Таким образом, если вы попытаетесь +Для [yii\web\Application|веб приложений], значение по умолчанию для данного свойства равно `'site'`, что означает +контроллер `SiteController` и его действие по умолчанию должно быть использовано. Таким образом, если вы попытаетесь получить доступ к приложению не указав маршрут, оно покажет вам результат действия `app\controllers\SiteController::actionIndex()`. -Для [yii\console\Application|консольных приложений], значение по-умолчанию равно `'help'`, означающее, что встроенная +Для [yii\console\Application|консольных приложений], значение по умолчанию равно `'help'`, означающее, что встроенная команда [[yii\console\controllers\HelpController::actionIndex()]] должна быть использована. Таким образом, если вы выполните команду `yii` без аргументов, вам будет отображена справочная информация. @@ -412,19 +412,19 @@ $width = \Yii::$app->params['thumbnail.size'][0]; #### [[yii\base\Application::layout|layout]] -Данное свойство указывает имя шаблона по-умолчанию, который должен быть использовать при формировании [представлений](structure-views.md). -Значение по-умолчанию равно `'main'`, означающее, что должен быть использован шаблон `main.php` в [папке шаблонов](#layoutPath). -Если оба свойства [папка шаблонов](#layoutPath) и [папка представлений](#viewPath) имеют значение по-умолчаниею, -то файл шаблона по-умолчанию может быть представлен псевдонимом пути как `@app/views/layouts/main.php`. +Данное свойство указывает имя шаблона по умолчанию, который должен быть использовать при формировании [представлений](structure-views.md). +Значение по умолчанию равно `'main'`, означающее, что должен быть использован шаблон `main.php` в [папке шаблонов](#layoutPath). +Если оба свойства [папка шаблонов](#layoutPath) и [папка представлений](#viewPath) имеют значение по умолчанию, +то файл шаблона по умолчанию может быть представлен псевдонимом пути как `@app/views/layouts/main.php`. Для отключения использования шаблона, вы можете указать данное свойство как `false`, хотя это используется очень редко. #### [[yii\base\Application::layoutPath|layoutPath]] -Свойство указывает путь, по которому следует искать шаблоны. Значение по-умолчанию равно `layouts`, означающее подпапку -в [папке представлений](#viewPath). Если значение [папки представлений](#viewPath) является значением по-умолчанию, то -папка шаблонов по-умолчанию может быть представлена псевдонимом пути как `@app/views/layouts`. +Свойство указывает путь, по которому следует искать шаблоны. Значение по умолчанию равно `layouts`, означающее подпапку +в [папке представлений](#viewPath). Если значение [папки представлений](#viewPath) является значением по умолчанию, то +папка шаблонов по умолчанию может быть представлена псевдонимом пути как `@app/views/layouts`. Вы можете настроить данное свойство как папку так и как [псевдоним](concept-aliases.md). @@ -443,14 +443,14 @@ $width = \Yii::$app->params['thumbnail.size'][0]; #### [[yii\base\Application::viewPath|viewPath]] -Данное свойство указывает базовую папку,где содержаться все файлы представлений. Значение по-умолчанию представляет +Данное свойство указывает базовую папку,где содержаться все файлы представлений. Значение по умолчанию представляет собой псевдоним `@app/views`. Вы можете настроить данное свойство как папку так и как [псевдоним](concept-aliases.md). #### [[yii\base\Application::vendorPath|vendorPath]] Свойство указывает папку сторонних библиотек, которые используются и управляются [Composer](http://getcomposer.org). -Она содержит все сторонние библиотеки используемые приложением, включая Yii фреймворк. Значение по-умолчанию +Она содержит все сторонние библиотеки используемые приложением, включая Yii фреймворк. Значение по умолчанию представляет собой псевдоним `@app/vendor`. Вы можете настроить данное свойство как папку так и как [псевдоним](concept-aliases.md). При изменении данного свойства, @@ -462,7 +462,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; #### [[yii\console\Application::enableCoreCommands|enableCoreCommands]] Данное свойство поддерживается только [[yii\console\Application|консольными приложениями]]. Оно указывает -нужно ли использовать встроенные в Yii консольные команды. Значение по-умолчанию равно `true`. +нужно ли использовать встроенные в Yii консольные команды. Значение по умолчанию равно `true`. ## События приложения diff --git a/docs/guide-ru/structure-controllers.md b/docs/guide-ru/structure-controllers.md index 9c74ea9..c933fb7 100644 --- a/docs/guide-ru/structure-controllers.md +++ b/docs/guide-ru/structure-controllers.md @@ -130,7 +130,7 @@ ID контроллеров также могут содержать префи * Добавить в начало [[yii\base\Application::controllerNamespace|пространство имен контроллеров]]. Ниже приведены несколько примеров, с учетом того, что [[yii\base\Application::controllerNamespace|пространство имен контроллеров]] -имеет значение по-умолчанию равное `app\controllers`: +имеет значение по умолчанию равное `app\controllers`: * `article` соответствует `app\controllers\ArticleController`; * `post-comment` соответствует `app\controllers\PostCommentController`; @@ -172,14 +172,14 @@ ID контроллеров также могут содержать префи ] ``` -### Контроллер по-умолчанию +### Контроллер по умолчанию -Каждое приложение имеет контроллер по-умолчанию, указанный через свойство [[yii\base\Application::defaultRoute]]. +Каждое приложение имеет контроллер по умолчанию, указанный через свойство [[yii\base\Application::defaultRoute]]. Когда в запросе не указан [маршрут](#ids-routes), тогда будет использован маршрут указанный в данном свойстве. Для [[yii\web\Application|Веб приложений]], это значение `'site'`, в то время как для [[yii\console\Application|консольных приложений]], это `'help'`. Таким образом, если задан URL `http://hostname/index.php`, это означает, что контроллер `site` выполнит обработку запроса. -Вы можете изменить контроллер по-умолчанию следующим образом в [настройках приложения](structure-applications.md#application-configurations): +Вы можете изменить контроллер по умолчанию следующим образом в [настройках приложения](structure-applications.md#application-configurations): ```php [ @@ -375,10 +375,10 @@ public function actionView(array $id, $version = null) о параметрах консольных приложений представлено в секции [Консольные команды](tutorial-console.md). -### Действие по-умолчанию +### Действие по умолчанию Каждый контроллер имеет действие, указанное через свойство [[yii\base\Controller::defaultAction]]. -Когда [маршрут](#ids-routes) содержит только ID контроллера, то подразумевается, что действие контроллера по-умолчанию +Когда [маршрут](#ids-routes) содержит только ID контроллера, то подразумевается, что действие контроллера по умолчанию было запрошено. По-умолчанию, это действие имеет значение `index`. Если вы хотите изменить это значение, просто переопределите данное @@ -409,7 +409,7 @@ class SiteController extends Controller 1. Метод [[yii\base\Controller::init()]] будет вызван после того как контроллер будет создан и сконфигурирован; 2. Контроллер создает объект действия, основываясь на запрошенном ID действия: - * Если ID действия не указан, то будет использовано [[yii\base\Controller::defaultAction|ID действия по-умолчанию]]; + * Если ID действия не указан, то будет использовано [[yii\base\Controller::defaultAction|ID действия по умолчанию]]; * Если ID действия найдено в [[yii\base\Controller::actions()|карте действий]], то отдельное действие будет создано; * Если ID действия соответствует методу действия, то встроенное действие будет создано; * В противном случае, будет выброшено исключение [[yii\base\InvalidRouteException]]. diff --git a/docs/guide-ru/structure-views.md b/docs/guide-ru/structure-views.md index 65088de..05969be 100644 --- a/docs/guide-ru/structure-views.md +++ b/docs/guide-ru/structure-views.md @@ -239,7 +239,7 @@ ID контроллера: context->id ?> ### Передача данных между видами -[[yii\base\View|Компонент вида]] имеет свойство [[yii\base\View::params|params]] , которое вы можете использовать для обмена данными между видами. +[[yii\base\View|Компонент вида]] имеет свойство [[yii\base\View::params|params]], которое вы можете использовать для обмена данными между видами. Например, в виде `about` вы можете указать текущий сегмент хлебных крошек с помощью следующего кода. @@ -298,7 +298,7 @@ use yii\helpers\Html; Большинство шаблонов вызывают методы, аналогично тому, как это сделано в примере выше, чтобы скрипты и тэги, зарегистированные в других местах приложения могли быть правильно отображены в местах вызова (например, в шаблоне). - [[yii\base\View::beginPage()|beginPage()]]: Этот метод нужно вызывать в самом начале шаблона. - Он вызывает событие [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]] , которое происходит при начале обработки страницы. + Он вызывает событие [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]], которое происходит при начале обработки страницы. - [[yii\base\View::endPage()|endPage()]]: Этот метод нужно вызывать в конце страницы. Он вызывает событие [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] . Оно указывает на обработку конца страницы. - [[yii\web\View::head()|head()]]: Этот метод нужно вызывать в `` секции страницы html. @@ -320,7 +320,7 @@ use yii\helpers\Html; ### Использование шаблонов -Как было описано в секции [Рендеринг в контроллерах](#rendering-in-controllers) , когда вы рендерите вид, вызывая метод [[yii\base\Controller::render()|render()]] из контроллера, к результату рендеринга будет применен шаблон. По умолчанию будет использован шаблон `@app/views/layouts/main.php` . +Как было описано в секции [Рендеринг в контроллерах](#rendering-in-controllers), когда вы рендерите вид, вызывая метод [[yii\base\Controller::render()|render()]] из контроллера, к результату рендеринга будет применен шаблон. По умолчанию будет использован шаблон `@app/views/layouts/main.php` . Вы можете использовать разные шаблоны, конфигурируя [[yii\base\Application::layout]] или [[yii\base\Controller::layout]]. Первый переопределяет шаблон, который используется по умолчанию всеми контроллерами, а второй переопределяет шаблон в отдельном контроллере. @@ -391,7 +391,7 @@ Yii определяет какой шаблон использовать для Например, вы определяете (записываете) блок в виде и отображаете его в шаблоне. Для определения блока вызываются методы [[yii\base\View::beginBlock()|beginBlock()]] и [[yii\base\View::endBlock()|endBlock()]]. -После определения, блок доступен через `$view->blocks[$blockID]` , где `$blockID` - это уникальный ID, который вы присваиваете блоку +После определения, блок доступен через `$view->blocks[$blockID]`, где `$blockID` - это уникальный ID, который вы присваиваете блоку в начале определения. В примере ниже показано, как можно использовать блоки, определенные в виде, чтобы динамически изменять фрагменты шаблона. diff --git a/docs/guide-ru/structure-widgets.md b/docs/guide-ru/structure-widgets.md index 2a55c50..4d251b8 100644 --- a/docs/guide-ru/structure-widgets.md +++ b/docs/guide-ru/structure-widgets.md @@ -108,7 +108,7 @@ class HelloWidget extends Widget } ``` -Для того, что бы использовать этот виджет, достаточно добавить в представление следующий код: +Для того, чтобы использовать этот виджет, достаточно добавить в представление следующий код: ```php Date: Sat, 1 Nov 2014 01:35:30 +0700 Subject: [PATCH 024/144] cleaning some extra space. close #5838 --- framework/messages/id/yii.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/messages/id/yii.php b/framework/messages/id/yii.php index efbc342..21c7b5c 100644 --- a/framework/messages/id/yii.php +++ b/framework/messages/id/yii.php @@ -94,10 +94,10 @@ return [ '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{satu jam} other{# jam}} yang lalu', '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, =1{# bita} other{# bita}}', '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, =1{# gigabita} other{# gigabita}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, =1{# kilobita } other{# kilobita }}', + '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, =1{# kilobita} other{# kilobita}}', '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, =1{# megabita} other{# megabita}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, =1{# petabita } other{# petabita }}', - '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, =1{# petabita } other{# petabita }}', + '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, =1{# petabita} other{# petabita}}', + '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, =1{# petabita} other{# petabita}}', '{n} B' => '{n} B', '{n} GB' => '{n} GB', '{n} KB' => '{n} KB', From 3d49a95b5d5dfe34f7e2282fd4afbf3855e709fa Mon Sep 17 00:00:00 2001 From: janeko-github Date: Wed, 22 Oct 2014 22:49:26 +0200 Subject: [PATCH 025/144] spanish guide translation close #5840 --- docs/guide-es/rest-authentication.md | 101 +++++++ docs/guide-es/rest-error-handling.md | 85 ++++++ docs/guide-es/rest-rate-limiting.md | 34 +++ docs/guide-es/rest-resources.md | 188 +++++++++++++ docs/guide-es/rest-response-formatting.md | 136 +++++++++ docs/guide-es/rest-routing.md | 72 +++++ docs/guide-es/rest-versioning.md | 95 +++++++ docs/guide-es/tutorial-core-validators.md | 445 ++++++++++++++++++++++++++++++ docs/guide-es/tutorial-yii-integration.md | 142 ++++++++++ docs/guide-es/widget-bootstrap.md | 63 +++++ docs/guide-es/widget-jui.md | 27 ++ 11 files changed, 1388 insertions(+) create mode 100644 docs/guide-es/rest-authentication.md create mode 100644 docs/guide-es/rest-error-handling.md create mode 100644 docs/guide-es/rest-rate-limiting.md create mode 100644 docs/guide-es/rest-resources.md create mode 100644 docs/guide-es/rest-response-formatting.md create mode 100644 docs/guide-es/rest-routing.md create mode 100644 docs/guide-es/rest-versioning.md create mode 100644 docs/guide-es/tutorial-core-validators.md create mode 100644 docs/guide-es/tutorial-yii-integration.md create mode 100644 docs/guide-es/widget-bootstrap.md create mode 100644 docs/guide-es/widget-jui.md diff --git a/docs/guide-es/rest-authentication.md b/docs/guide-es/rest-authentication.md new file mode 100644 index 0000000..4bb4579 --- /dev/null +++ b/docs/guide-es/rest-authentication.md @@ -0,0 +1,101 @@ +Autenticación +============== + +A diferencia de las aplicaciones Web, las API RESTful son usualmente sin estado (stateless), lo que permite que las sesiones o las cookies no sean usadas. Por lo tanto, cada petición debe llevar alguna suerte de credenciales de autenticación, porque la autenticación del usuario no puede ser mantenida por las sesiones o las cookies. Una práctica común es enviar una pieza (token) secreta de acceso con cada petición para autenticar al usuario. Dado que una pieza de autenticación puede ser usada para identificar y autenticar solamente a un usuario, **el API de peticiones tiene que ser siempre enviado vía HTTPS para prevenir ataques que intervengan en la transmisión "man-in-the-middle" (MitM) **. +> Tip: Sin estado (stateless) se refiere a un protocolo en el que cada petición es una transacción independiente del resto de peticiones y la comunicación consiste en pares de peticion y respuesta, por lo que no es necesario retener información en la sesión. + +Hay muchas maneras de enviar una pieza (token) de acceso: + +* [Autorización Básica HTTP (HTTP Basic Auth)](http://en.wikipedia.org/wiki/Basic_access_authentication): la pieza de acceso es enviada como nombre de usuario. Esto sólo debe de ser usado cuando la pieza de acceso puede ser guardada de forma segura en la parte del API del consumidor. Por ejemplo, el API del consumidor es un programa ejecutándose en un servidor. +* Parámetro de la consulta: la pieza de acceso es enviada como un parámetro de la consulta en la URL de la API, p.e., + `https://example.com/users?access-token=xxxxxxxx`. Debido que muchos servidores dejan los parámetros de consulta en los logs del servidor esta aproximación suele ser usada principalmente para servir peticiones `JSONP` que no usen las cabeceras HTTP para enviar piezas de acceso. +* [OAuth 2](http://oauth.net/2/): la pieza de acceso es obtenida por el consumidor por medio de una autorización del servidor y enviada al API del servidor según el protocolo OAuth 2 [Piezas HTTP de la portadora (HTTP Bearer Tokens)](http://tools.ietf.org/html/rfc6750). + +Yii soporta todos los métodos anteriores de autenticación. Puedes crear nuevos métodos de autenticación de una forma fácil. + +Para activar la autenticación para tus APIs, sigue los pasos siguientes: + +1. Configura la propiedad [[yii\web\User::enableSession|enableSession]] de el componente `user` de la aplicación a false. +2. Especifica cuál método de autenticación planeas usar configurando la funcionalidad `authenticator` en las clases de la controladora REST. +3. Implementa [[yii\web\IdentityInterface::findIdentityByAccessToken()]] en tu [[yii\web\User::identityClass|clase de identidad de usuario]]. + +El paso 1 no es necesario pero sí recomendable para las APIs RESTful, pues son sin estado (stateless). Cuando [[yii\web\User::enableSession|enableSession]] +es false, el estado de autenticación del usuario puede NO ser mantenido (persisted) durante varias peticiones usando sesiones. Si embargo, la autenticación puede ser realizada para cada petición, la cual es realizada por los pasos 2 y 3. + +> Tip: Puede configurar [[yii\web\User::enableSession|enableSession]] del componente de la aplicación `user` en la configuración de las aplicaciones si estás desarrollando APIs RESTful en términos de un aplicación. Si desarrollas un módulo de las APIs RESTful, puedes poner la siguiente línea en el método del módulo `init()`, tal y como sigue: +> ```php +public function init() +{ + parent::init(); + \Yii::$app->user->enableSession = false; +} +``` + +Por ejemplo, para usar HTTP Basic Auth, puedes configurar `authenticator` como sigue, + +```php +use yii\filters\auth\HttpBasicAuth; + +public function behaviors() +{ + $behaviors = parent::behaviors(); + $behaviors['authenticator'] = [ + 'class' => HttpBasicAuth::className(), + ]; + return $behaviors; +} +``` + +Si quires implementar las tres autenticaciones explicadas antes, puedes usar `CompositeAuth` de la siguiente manera, + +```php +use yii\filters\auth\CompositeAuth; +use yii\filters\auth\HttpBasicAuth; +use yii\filters\auth\HttpBearerAuth; +use yii\filters\auth\QueryParamAuth; + +public function behaviors() +{ + $behaviors = parent::behaviors(); + $behaviors['authenticator'] = [ + 'class' => CompositeAuth::className(), + 'authMethods' => [ + HttpBasicAuth::className(), + HttpBearerAuth::className(), + QueryParamAuth::className(), + ], + ]; + return $behaviors; +} +``` + +Cada elemento en `authMethods` debe de ser el nombre de un método de autenticación de una clase o un array de configuración. + + +La implementación de `findIdentityByAccessToken()` es específico de la aplicación. Por ejemplo, en escenarios simples cuando cada usuario sólo puede terner una pieza (token) de acceso, puedes almacenar la pieza de acceso en la columna `access_token` en la tabla de usuario. El método debe de ser inmediatamente implementado en la clase `User` como sigue, + +```php +use yii\db\ActiveRecord; +use yii\web\IdentityInterface; + +class User extends ActiveRecord implements IdentityInterface +{ + public static function findIdentityByAccessToken($token, $type = null) + { + return static::findOne(['access_token' => $token]); + } +} +``` + +Después que la autenticación es activada, tal y como se describe arriba, para cada petición de la API, la controladora solicitada puede intentar autenticar al usuario en su paso `beforeAction()`. + +Si la autenticación ocurre, la controladora puede realizar otras comprobaciones (como son límite del ratio, autorización) y entonces ejecutar la acción. La identidad del usuario autenticado puede ser recogida via `Yii::$app->user->identity`. + +Si la autenticación falla, una respuesta con estado HTTP 401 puede ser devuelta junto con otras cabeceras apropiadas (como son la cabecera para autenticación básica HTTP `WWW-Authenticate` ). + + +## Autorización + +Después de que un usuario se ha autenticado, probablementer querrás comprobar si él o ella tiene los permisos para realizar la acción pedida para el recurso pedido. Este proceso es llamado *autorización (authorization)* y está cubierto en detalle en la [Sección de Autorización](security-authorization.md). + +Si tus controladoras extienden de [[yii\rest\ActiveController]], puedes sobreescribir (override) el método [[yii\rest\Controller::checkAccess()|checkAccess()]] para realizar la comprobación de la autorización. El método será llamado por las acciones contenidas en [[yii\rest\ActiveController]]. diff --git a/docs/guide-es/rest-error-handling.md b/docs/guide-es/rest-error-handling.md new file mode 100644 index 0000000..409c7b5 --- /dev/null +++ b/docs/guide-es/rest-error-handling.md @@ -0,0 +1,85 @@ +Manejo de errores +============== + +Cuando se maneja una petición del API RESTful, si ocurre un error en la petición del usuario o si algo inesperado ocurre en el servidor, simplemente puedes lanzar una excepción para notificar al usuario que algo erróneo ocurrió. +Si puedes identificar la causa del error (p.e., el recurso pedido no existe), debes considerar lanzar una excepción con el apropiado códig HTTP de estado (p.e., [[yii\web\NotFoundHttpException]] representa un código de estado 404). Yii enviará la respuesta a continuación con el correspondiente código de estado HTTP y el texto. Yii puede incluir también la representación serializada de la excepción en el cuerpo de la respuesta. Por ejemplo: + +``` +HTTP/1.1 404 Not Found +Date: Sun, 02 Mar 2014 05:31:43 GMT +Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y +Transfer-Encoding: chunked +Content-Type: application/json; charset=UTF-8 + +{ + "name": "Not Found Exception", + "message": "El recurso solicitado no ha sido encontrado.", + "code": 0, + "status": 404 +} +``` + +La siguiente lista sumariza los códigos de estado HTTP que son usados por el framework REST: + +* `200`: OK. Todo ha funcionado como se esperaba. +* `201`: El recurso ha creado con éxito en respuesta a la petición `POST`. La cabecera de situación `Location` contiene la URL apuntando al nuevo recurso creado. +* `204`: La petición ha sido manejada con éxito y el cuerpo de la respuesta no tiene contenido (como una petición `DELETE`). +* `304`: El recurso no ha sido modificado. Puede usar la versión en caché. +* `400`: Petición errónea. Esto puede estar causado por varias acciones de el usuario, como proveer un JSON no válido en el cuerpo de la petición, proveyendo parámetros de acción no válidos, etc. +* `401`: Autenticación fallida. +* `403`: El usuario autenticado no tiene permitido acceder a la API final. +* `404`: El recurso pedido no existe. +* `405`: Método no permitido. Por favor comprueba la cabecera `Allow` por los métodos HTTP permitidos. +* `415`: Tipo de medio no soportado. El tipo de contenido pedido o el número de versión no es válido. +* `422`: La validación de datos ha fallado (en respuesta a una petición `POST` , por ejemplo). Por favor, comprobad en el cuerpo de la respuesta el mensaje detallado. +* `429`: Demasiadas peticiones. La petición ha sido rechazada debido a un limitación de rango. +* `500`: Error interno del servidor. Esto puede estar causado por errores internos del programa. + + +## Personalizando la Respuesta al Error + +A veces puedes querer personalizar el formato de la respuesta del error por defecto . Por ejemplo, en lugar de depender del uso de diferentes estados HTTP para indicar los diferentes errores, puedes querer usar siempre el estado HTTP 200 y encajonar el código de estado HTTP en la respuesta, tal y como se ve en lo que sigue, + +``` +HTTP/1.1 200 OK +Date: Sun, 02 Mar 2014 05:31:43 GMT +Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y +Transfer-Encoding: chunked +Content-Type: application/json; charset=UTF-8 + +{ + "success": false, + "data": { + "name": "Not Found Exception", + "message": "The requested resource was not found.", + "code": 0, + "status": 404 + } +} +``` + +Para lograr este objetivo, puedes responder al evento `beforeSend` de el componente `response` en la configuración de la aplicación: + +```php +return [ + // ... + 'components' => [ + 'response' => [ + 'class' => 'yii\web\Response', + 'on beforeSend' => function ($event) { + $response = $event->sender; + if ($response->data !== null && !empty(Yii::$app->request->get['suppress_response_code'])) { + $response->data = [ + 'success' => $response->isSuccessful, + 'data' => $response->data, + ]; + $response->statusCode = 200; + } + }, + ], + ], +]; +``` + +El anterior código puede reformatear la respuesta (para ambas respuestas, exitosa o fallida) de forma aclaratoria cuando +`suppress_response_code` es pasado como un parámetro `GET`. diff --git a/docs/guide-es/rest-rate-limiting.md b/docs/guide-es/rest-rate-limiting.md new file mode 100644 index 0000000..803e39f --- /dev/null +++ b/docs/guide-es/rest-rate-limiting.md @@ -0,0 +1,34 @@ +Limitando el ratio (rate) +============= + +Para prevenir el abuso, puedes considerar añadir un *límitación del ratio* (*rate limiting*) para tus APIs. Por ejemplo, puedes querer limitar el uso del API de cada usuario que no sea como mucho 100 llamadas al API dentro de un periodo de 10 minutos. Si demasiadas peticiones son recibidas de un usuario dentro del periodo de tiempo declarado , una respuesta con código de estado 429 (significa "Demasiadas peticiones") puede ser devuelto. + +Para activar la limitación de ratio, la clase [[yii\web\User::identityClass|user identity class]] debe implementar [[yii\filters\RateLimitInterface]]. +Este interface requiere la implementación de tres métodos: + +* `getRateLimit()`: devuelve el número máximo de peticiones permitidas y el periodo de tiempo (p.e., `[100, 600]` significa que como mucho puede haber 100 llamadas al API dentro de 600 segundos). +* `loadAllowance()`: devuelve el número de peticiones que quedan permitidas y el tiempo (fecha/hora) UNIX con el último límite del ratio que ha sido comprobado. +* `saveAllowance()`: guarda ambos, el número que quedan de peticiones permitidas y el actual tiempo (fecha/hora) UNIX . + +Tu puedes usar dos columnas en la tabla de usuario para guardar la información de lo permitido y la fecha/hora (timestamp). Con ambas definidas, entonces `loadAllowance()` y `saveAllowance()` pueden ser implementadas para leer y guardar los valores de las dos columnas correspondientes al actual usuario autenticado. Para mejorar el desempeño, también puedes considerar almacenar esas piezas de información en caché o almacenamiento NoSQL. + +Una vez que la clase de identidad implementa el requerido interface, Yii puede usar automáticamente [[yii\filters\RateLimiter]] configurado como una acción de filtrado para [[yii\rest\Controller]] y mejorar la comprobación del limitador de ratio. El limitador de ratio puede lanzar una [[yii\web\TooManyRequestsHttpException]] cuando el límite del ratio es excedido. + +Puedes configurar el limitador de ratio en tu clase REST de la controladora como sigue: + +```php +public function behaviors() +{ + $behaviors = parent::behaviors(); + $behaviors['rateLimiter']['enableRateLimitHeaders'] = false; + return $behaviors; +} +``` + +Cuando la limitación de ratio está activada, por defecto cada respuesta puede ser enviada con las siguientes cabeceras de HTTP conteniendo la información actual del límite de ratio: + +* `X-Rate-Limit-Limit`, el máximo número de peticiones permitidas en un periodo de tiempo +* `X-Rate-Limit-Remaining`, el número de peticiones restantes en el periodo de tiempo actual +* `X-Rate-Limit-Reset`, el número de segundos a esperar para pedir el máximo número de peticiones permitidas + +Puedes desactivar estas cabeceras configurando [[yii\filters\RateLimiter::enableRateLimitHeaders]] a false, tal y como en el anterior ejemplo. diff --git a/docs/guide-es/rest-resources.md b/docs/guide-es/rest-resources.md new file mode 100644 index 0000000..a0785ce --- /dev/null +++ b/docs/guide-es/rest-resources.md @@ -0,0 +1,188 @@ +Recursos +========= + +Las APIs RESTful lo son todos para acceder y manipular *recursos (resources)*. Puedes observar los recursos en el paradigma MVC en [Modelos (models)](structure-models.md) . + +Mientras que no hay restricción a cómo representar un recurso, en YII usualmente, puedes representar recursos como objetos de la clase [[yii\base\Model]] o sus clases hijas (p.e. [[yii\db\ActiveRecord]]), por las siguientes razones: + +* [[yii\base\Model]] implementa el interface [[yii\base\Arrayable]] , el cual te permite personalizar como exponer los datos de los recursos a travès de las APIs RESTful. +* [[yii\base\Model]] soporta [Validación de entrada (input validation)](input-validation.md), lo cual es muy usado en las APIs RESTful para soportar la entrada de datos. +* [[yii\db\ActiveRecord]] provee un poderoso soporte para el acceso a datos en bases de datos y su manipulación, lo que lo le hace servir perfectamente si sus recursos de datos están en bases de datos. + +En esta sección, vamos principalmente a describir como la clase con recursos que extiende de [[yii\base\Model]] (o sus clases hijas) puede especificar qué datos puede ser devueltos vía las APIs RESTful. Si la clase de los recursos no extiende de [[yii\base\Model]], entonces todas las variables públicas miembro serán devueltas. + + +## Campos (fields) + +Cuando incluimos un recurso en una respuesta de la API RESTful, el recurso necesita ser serializado en una cadena. +Yii divide este proceso en dos pasos. Primero, el recurso es convertido en un array por [[yii\rest\Serializer]]. +Segundo, el array es serializado en una cadena en el formato requerido (p.e. JSON, XML) por [[yii\web\ResponseFormatterInterface|response formatters]]. El primer paso es en el que debes de concentrarte principalmente cuando desarrolles una clase de un recurso. + +Sobreescribiendo [[yii\base\Model::fields()|fields()]] y/o [[yii\base\Model::extraFields()|extraFields()]], +puedes especificar qué datos, llamados *fields*, en el recursos, pueden ser colocados en el array que le representa. +La diferencia entre estos dos métodos es que el primero especifica el conjunto de campos por defecto que deben ser incluidos en el array que los representa, mientras que el último especifica campos adicionales que deben de ser incluidos en el array si una petición del usuario final para ellos vía el parámetro de consulta `expand`. Por ejemplo, + +``` +// devuelve todos los campos declarados en fields() +http://localhost/users + +// sólo devuelve los campos id y email, provistos por su declaración en fields() +http://localhost/users?fields=id,email + +// devuelve todos los campos en fields() y el campo profile siempre y cuando esté declarado en extraFields() +http://localhost/users?expand=profile + +// sólo devuelve los campos id, email y profile, siempre y cuando ellos estén declarados en fields() y extraFields() +http://localhost/users?fields=id,email&expand=profile +``` + + +### Sobreescribiendo `fields()` + +Por defecto, [[yii\base\Model::fields()]] devuelve todos los atributos de los modelos como si fueran campos, mientras [[yii\db\ActiveRecord::fields()]] sólo devuelve los atributos que tengan datos en la base de datos. + +Puedes sobreescribir `fields()` para añadir, quitar, renombrar o redefinir campos. El valor de retorno de `fields()` ha de estar en un array. Las claves del array son los nombres de los campos y los valores del array son las correspondientes definiciones de los campos que pueden ser tanto nombres de propiedades/atributos o funciones anónimas que devuelven los correspondientes valores del los campos. En el caso especial de que el nombre de un campo sea el mismo que su definición puedes omitir la clave en el array. Por ejemplo, + +```php +// explícitamente lista cada campo, siendo mejor usarlo cuando quieras asegurarte que los cambios +// en una tabla de la base de datos o en un atributo del modelo no provoque el cambio de tu campo (para mantener la compatibilidad anterior). +public function fields() +{ + return [ + // el nombre de campo es el mismo nombre del atributo + 'id', + // el nombre del campo es "email", su atributo se denomina "email_address" + 'email' => 'email_address', + // el nombre del campo es "name", su valor es definido está definido por una función anónima de retrollamada (callback) + 'name' => function () { + return $this->first_name . ' ' . $this->last_name; + }, + ]; +} + +// el ignorar algunos campos, es mejor usarlo cuando heredas de una implementación padre +// y pones en la lista negra (blacklist) algunos campos sensibles +public function fields() +{ + $fields = parent::fields(); + + // quita los campos con información sensible + unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']); + + return $fields; +} +``` + +> Atención: Dado que, por defecto, todos los atributos de un modelo pueden ser incluidos en la devolución del API, debes +> examinar tus datos para estar seguro de que no contiene información sensible. Si se da este tipo de información, +> debes sobreescribir `fields()` para filtrarlos. En el ejemplo anterior, escogemos +> quitar `auth_key`, `password_hash` y `password_reset_token`. + + +### Sobreescribiendo `extraFields()` + +Por defecto, [[yii\base\Model::extraFields()]] no devuelve nada, mientras que [[yii\db\ActiveRecord::extraFields()]] devuelve los nombres de las relaciones que tienen datos (populated) obtenidos de la base de datos. + +El formato de devolución de los datos de `extraFields()` es el mismo que el de `fields()`. Usualmente, `extraFields()` es principalmente usado para especificar campos cuyos valores sean objetos. Por ejemplo, dado la siguiente declaración de campo, + +```php +public function fields() +{ + return ['id', 'email']; +} + +public function extraFields() +{ + return ['profile']; +} +``` + +la petición `http://localhost/users?fields=id,email&expand=profile` puede devolver los siguientes datos en formato JSON : + +```php +[ + { + "id": 100, + "email": "100@example.com", + "profile": { + "id": 100, + "age": 30, + } + }, + ... +] +``` + + +## Enlaces (Links) + +[HATEOAS](http://en.wikipedia.org/wiki/HATEOAS), es una abreviación de Hipermedia es el Motor del Estado de la Aplicación (Hypermedia as the Engine of Application State), promueve que las APIs RESTfull devuelvan información que permita a los clientes descubrir las acciones que soportan los recursos devueltos. El sentido de HATEOAS es devolver un conjunto de hiperenlaces con relación a la información, cuando los datos de los recursos son servidos por las APIs. + +Las clases con recursos pueden soportar HATEOAS implementando el interfaz [[yii\web\Linkable]] . El interfaz contiene sólo un método [[yii\web\Linkable::getLinks()|getLinks()]] el cual debe de de devolver una lista de [[yii\web\Link|links]]. +Típicamente, debes devolver al menos un enlace `self` representando la URL al mismo recurso objeto. Por ejemplo, + +```php +use yii\db\ActiveRecord; +use yii\web\Link; +use yii\web\Linkable; +use yii\helpers\Url; + +class User extends ActiveRecord implements Linkable +{ + public function getLinks() + { + return [ + Link::REL_SELF => Url::to(['user/view', 'id' => $this->id], true), + ]; + } +} +``` + +Cuando un objeto `User` es devuelto en una respuesta, puede contener un elemento `_links` representando los enlaces relacionados con el usuario, por ejemplo, + +``` +{ + "id": 100, + "email": "user@example.com", + // ... + "_links" => [ + "self": "https://example.com/users/100" + ] +} +``` + + +## Colecciones + +Los objetos de los recursos pueden ser agrupados en *collections*. Cada colección contiene una lista de recursos objeto del mismo tipo. + +Las colecciones pueden ser representadas como arrays pero, es usualmente más deseable representarlas como [proveedores de datos (data providers)](output-data-providers.md). Esto es así porque los proveedores de datos soportan paginación y ordenación de los recursos, lo cual es comunmente necesario en las colecciones devueltas con las APIs RESTful. Por ejemplo, la siguiente acción devuelve un proveedor de datos sobre los recursos post: + +```php +namespace app\controllers; + +use yii\rest\Controller; +use yii\data\ActiveDataProvider; +use app\models\Post; + +class PostController extends Controller +{ + public function actionIndex() + { + return new ActiveDataProvider([ + 'query' => Post::find(), + ]); + } +} +``` + +Cuando un proveedor de datos está enviando una respuesta con el API RESTful, [[yii\rest\Serializer]] llevará la actual página de los recursos y los serializa como un array de recursos objeto. Adicionalmente, [[yii\rest\Serializer]] +puede incluir también la información de paginación a través de las cabeceras HTTP siguientes: + +* `X-Pagination-Total-Count`: Número total de recursos; +* `X-Pagination-Page-Count`: Número de páginas; +* `X-Pagination-Current-Page`: Página actual (iniciando en 1); +* `X-Pagination-Per-Page`: Número de recursos por página; +* `Link`: Un conjunto de enlaces de navegación permitiendo al cliente recorrer los recursos página a página. + +Un ejemplo se puede ver en la sección [Inicio rápido (Quick Start)](rest-quick-start.md#trying-it-out). diff --git a/docs/guide-es/rest-response-formatting.md b/docs/guide-es/rest-response-formatting.md new file mode 100644 index 0000000..d632334 --- /dev/null +++ b/docs/guide-es/rest-response-formatting.md @@ -0,0 +1,136 @@ +Dando Formato a la Respuesta +=================== + +Cuando se maneja una petición al API RESTful, una aplicación realiza usualmente los siguientes pasos que están relacionados con el formato de la respuesta: + +1. Determinar varios factores que pueden afectar al formato de la respuesta, como son el tipo de medio, lenguaje, versión, etc. + Este proceso es también conocido como [Negociación de contenido (content negotiation)](http://en.wikipedia.org/wiki/Content_negotiation). +2. La conversión de objetos recursos en arrays, está descrito en la sección [Recursos (Resources)](rest-resources.md). + Esto es realizado por el serializador [[yii\rest\Serializer]]. +> Tip: Serializar es convertir un elemento a un formato que nos permita guardardarlo de forma permanente, de modo que posteriormente, al recuperarlo, nos de una copia igual a la del elemento antes de ser inicialmente serializado. +3. La conversión de arrays en cadenas con el formato determinado por el paso de negociación de contenido. Esto es realizado por [[yii\web\ResponseFormatterInterface|response formatters]] registrado con el componente de la aplicación [[yii\web\Response::formatters|response]]. + + +## Negociación de contenido (Content Negotiation) + +Yii soporta la negoiciación de contenido a través del filtro [[yii\filters\ContentNegotiator]]. La clase controladora base del API RESTful [[yii\rest\Controller]] está equipada con este filtro bajo el nombre `contentNegotiator`. +El filtro provee tanto un formato de respuesta de negociación como una negociación de lenguaje. Por ejemplo, si la petición API RESTful contiene la siguiente cabecera, + +``` +Accept: application/json; q=1.0, */*; q=0.1 +``` + +puede obtener una respuesta en formato JSON, como lo que sigue: + +``` +$ curl -i -H "Accept: application/json; q=1.0, */*; q=0.1" "http://localhost/users" + +HTTP/1.1 200 OK +Date: Sun, 02 Mar 2014 05:31:43 GMT +Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y +X-Powered-By: PHP/5.4.20 +X-Pagination-Total-Count: 1000 +X-Pagination-Page-Count: 50 +X-Pagination-Current-Page: 1 +X-Pagination-Per-Page: 20 +Link: ; rel=self, + ; rel=next, + ; rel=last +Transfer-Encoding: chunked +Content-Type: application/json; charset=UTF-8 + +[ + { + "id": 1, + ... + }, + { + "id": 2, + ... + }, + ... +] +``` + +En la parte de atrás, antes de que sea ejecutada una acción de la controladora del API RESTful, el filtro [[yii\filters\ContentNegotiator]] comprobará en la cabecera HTTP el `Accept` de la petición y pondrá como `'json'` [[yii\web\Response::format|response format]]. Después de que la acción sea ejecutada y devuelva el recurso objeto resultante o una colección resultante, +[[yii\rest\Serializer]] convertirá el resultado en un array. Y finalmente, [[yii\web\JsonResponseFormatter]] serializará el array en una cadena JSON incluyéndola en el cuerpo de la respuesta. + +Por defecto, el API RESTful soporta tanto el formato JSON como el XML. Para soportar un nuevo formato, debes configurar la propiedad [[yii\filters\ContentNegotiator::formats|formats]] del filtro `contentNegotiator` tal y como sigue, en las clases de la controladora del API: + + +```php +use yii\web\Response; + +public function behaviors() +{ + $behaviors = parent::behaviors(); + $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_HTML; + return $behaviors; +} +``` + +Las claves de la propiedad `formats` son los tipos MIME soportados, mientras que los valores son los nombre de formato de respuesta correspondientes, los cuales han de estar soportados en [[yii\web\Response::formatters]]. + + +## Serialización de Datos + +Como hemos descrito antes, [[yii\rest\Serializer]] es la pieza central para convertir recursos objeto o colecciones en arrays. Reconoce objetos tanto implementando [[yii\base\ArrayableInterface]] como [[yii\data\DataProviderInterface]]. El primer formateador es implementado principalmente para recursos objeto, mientras que el segundo para recursos collección. + +Puedes configurar el serializador poniendo la propiedad [[yii\rest\Controller::serializer]] con un array de configuración. +Por ejemplo, a veces puedes querer simplificar la ayuda al trabajo de desarrollo del cliente incluyendo información de la paginación directamente en el cuerpo de la respuesta. Para hacer esto, configura la propiedad [[yii\rest\Serializer::collectionEnvelope]] como sigue: + +```php +use yii\rest\ActiveController; + +class UserController extends ActiveController +{ + public $modelClass = 'app\models\User'; + public $serializer = [ + 'class' => 'yii\rest\Serializer', + 'collectionEnvelope' => 'items', + ]; +} +``` + +Puedes obtener la respuesta que sigue para la petición `http://localhost/users`: + +``` +HTTP/1.1 200 OK +Date: Sun, 02 Mar 2014 05:31:43 GMT +Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y +X-Powered-By: PHP/5.4.20 +X-Pagination-Total-Count: 1000 +X-Pagination-Page-Count: 50 +X-Pagination-Current-Page: 1 +X-Pagination-Per-Page: 20 +Link: ; rel=self, + ; rel=next, + ; rel=last +Transfer-Encoding: chunked +Content-Type: application/json; charset=UTF-8 + +{ + "items": [ + { + "id": 1, + ... + }, + { + "id": 2, + ... + }, + ... + ], + "_links": { + "self": "http://localhost/users?page=1", + "next": "http://localhost/users?page=2", + "last": "http://localhost/users?page=50" + }, + "_meta": { + "totalCount": 1000, + "pageCount": 50, + "currentPage": 1, + "perPage": 20 + } +} +``` diff --git a/docs/guide-es/rest-routing.md b/docs/guide-es/rest-routing.md new file mode 100644 index 0000000..a371100 --- /dev/null +++ b/docs/guide-es/rest-routing.md @@ -0,0 +1,72 @@ +Enrutado +======= + +Con los recursos y las clases controladoras preparadas, puedes acceder a los recursos usando una URL como `http://localhost/index.php?r=user/create`, parecida a la que usas con aplicaciones Web normales. + +En la práctica, querrás usualmente usar URLs más bonitas y obtener ventajas de los comandos de acciones (verbos) HTTP. +Por ejemplo, una petición `POST /users` puede permitir el acceso a la acción `user/create`. +Esto puede realizarse fácilmente configurando el componente de la aplicación `urlManager` en la configuración tal y como sigue: + +```php +'urlManager' => [ + 'enablePrettyUrl' => true, + 'enableStrictParsing' => true, + 'showScriptName' => false, + 'rules' => [ + ['class' => 'yii\rest\UrlRule', 'controller' => 'user'], + ], +] +``` + +En comparación con la gestión de URL en las aplicaciones Web, lo nuevo de lo anterior es el uso de [[yii\rest\UrlRule]] para el enrutado de las peticiones con el API RESTful. Esta clase especial que contiene la norma para gestionar las URLs puede crear todo un conjunto de URLs hijas para mantener el enrutado y la creación de URLs para la/s especificada/s controlador/as. +Por ejemplo, el código anterior es aproximadamente equivalente a las siguientes reglas: + +```php +[ + 'PUT,PATCH users/' => 'user/update', + 'DELETE users/' => 'user/delete', + 'GET,HEAD users/' => 'user/view', + 'POST users' => 'user/create', + 'GET,HEAD users' => 'user/index', + 'users/' => 'user/options', + 'users' => 'user/options', +] +``` + +Y los siguientes puntos finales del API son mantenidos por la siguiente regla: + +* `GET /users`: listado de todos los usuarios página a página; +* `HEAD /users`: enseña ĺa información resumén del usuario listado; +* `POST /users`: crea un nuevo usuario; +* `GET /users/123`: devuelve los detalles del usuario 123; +* `HEAD /users/123`: enseña la información resúmen del usuario 123; +* `PATCH /users/123` y `PUT /users/123`: actualizan al usuario 123; +* `DELETE /users/123`: borra el usuario 123; +* `OPTIONS /users`: presenta las acciones finales soportadas por `/users`; +* `OPTIONS /users/123`: presenta las acciones finales que soporta `/users/123`. + +Puedes configurar las opciones `only` y `except` para explícitamente listar las acciones a soportar y cuales desabilitar, respectivamente. Por ejemplo, + +```php +[ + 'class' => 'yii\rest\UrlRule', + 'controller' => 'user', + 'except' => ['delete', 'create', 'update'], +], +``` + +También puedes configurar `patterns` o `extraPatterns` para redifinir patrones existentes o añadir nuevos patrones que soportan esta regla. +Por ejemplo, para soportar la nueva acción `search` por `GET /users/search`, configura la opción `extraPatterns` como sigue, + +```php +[ + 'class' => 'yii\rest\UrlRule', + 'controller' => 'user', + 'extraPatterns' => [ + 'GET search' => 'search', + ], +``` + +Queda advertido que la ID de la controladora `user` aparece finalmente en plural tal que`users`. +Esto es debido a que [[yii\rest\UrlRule]] pluraliza de forma automáticalos IDs de las controladoras para ser usadas en los puntos finales. +Puedes desactivar este comportamiento poniendo a false [[yii\rest\UrlRule::pluralize]] , o si quieres usar algunos nombres especiales, debes configurar la propiedad [[yii\rest\UrlRule::controller]]. Dése cuenta que la pluralización de puntos finales del RESTful no siempre añade simplemente una "s" l final de la id de la controladora. Una controladora cuyo ID termina en "x", por ejemplo "BoxController" (con ID `box`), tiene el punto final del RESTful pluralizada a `boxes` por [[yii\rest\UrlRule]]. diff --git a/docs/guide-es/rest-versioning.md b/docs/guide-es/rest-versioning.md new file mode 100644 index 0000000..04aa7ef --- /dev/null +++ b/docs/guide-es/rest-versioning.md @@ -0,0 +1,95 @@ +Versionado +========== + +Una buena API ha de ser *versionada*: los cambios y las nuevas características son implementadas en las nuevas versiones del API, en vez de estar continuamente modificando sólo una versión. Al contrario que en las aplicaciones Web, en las cuales tienes total control del código de ambas partes lado del cliente y lado del servidor, las APIs están destinadas a ser usadas por los clientes fuera de tu control. Por esta razón, compatibilidades hacia atrás (BC Backward compatibility) de las APIs ha de ser mantenida siempre que sea posible. Si es necesario un cambio que puede romper la BC, debes de introducirla en la nueva versión del API, e incrementar el número de versión. Los clientes que la usan pueden continuar usando la antigua versión de trabajo del API; los nuevos y actualizados clientes pueden obtener la nueva funcionalidad de la nueva versión del API. + +> Tip: referirse a [Semántica del versionado](http://semver.org/) para más información en el diseño del número de versión del API. + +Una manera común de implementar el versionado de la API es embeber el número de versión en las URLs del AP. +Por ejemplo, `http://example.com/v1/users` se inicia por la versión 1 de la API del la parte final `/users`. + +Otro método de versionado de la API , la cual está ganando predominancia recientemente, es poner el número de versión en las cabeceras de la petición HTTP. Esto se suele hacer típicamente a través la cabecera `Accept` : + +``` +// vía parámetros +Accept: application/json; version=v1 +// vía de el tipo de contenido del vendedor +Accept: application/vnd.company.myapp-v1+json +``` + +Ambos métodos tienen sus pros y sus contras, y hay gran cantidad de debates sobre cada uno. Debajo puedes ver una estrategia práctica para el versionado de la API que es una mezcla de estos dos métodos: + +* Pon cada versión superior del API en un módulo separado cuya ID es el número de la versión principal. (p.e. `v1`, `v2`). + Naturalmente, las URLs del API pueden contener números de versión superiores. +* Dentro de cada versión superior (y por tanto, dentro del correspondiente módulo), usa la cabecera de HTTP `Accept` para determinar el número de la menor versión y escribe código condicional para responder a la menor versión en consecuencia. + +Para cada módulo sirviendo una versión superior, el módulo debe incluir los recursos y la clase controladora que especifican la versión. Para mejor separar la responsabilidad del código, puedes conservar un conjunto de recursos base y clases de controladores comunes, y hacer subclases de ellas en cada uno de los módulos de versión individual. Dentro de las subclases, impementa el código concreto como es `Model::fields()`. + +Tu código puede estar organizado como lo que sigue: + +``` +api/ + common/ + controllers/ + UserController.php + PostController.php + models/ + User.php + Post.php + modules/ + v1/ + controllers/ + UserController.php + PostController.php + models/ + User.php + Post.php + v2/ + controllers/ + UserController.php + PostController.php + models/ + User.php + Post.php +``` + +La configuración de su aplicación puede tener este aspecto: + +```php +return [ + 'modules' => [ + 'v1' => [ + 'basePath' => '@app/modules/v1', + 'controllerNamespace' => 'app\modules\v1\controllers', + ], + 'v2' => [ + 'basePath' => '@app/modules/v2', + 'controllerNamespace' => 'app\modules\v2\controllers', + ], + ], + 'components' => [ + 'urlManager' => [ + 'enablePrettyUrl' => true, + 'enableStrictParsing' => true, + 'showScriptName' => false, + 'rules' => [ + ['class' => 'yii\rest\UrlRule', 'controller' => ['v1/user', 'v1/post']], + ['class' => 'yii\rest\UrlRule', 'controller' => ['v2/user', 'v2/post']], + ], + ], + ], +]; +``` + +Como consecuencia de el anterior código, `http://example.com/v1/users` puede devolver la lista de usuarios de la versión 1, mientras +`http://example.com/v2/users` puede devolver la versión 2 de los usuarios. + +Gracias a los módulos, el código de las diferentes principales versiónes puede ser aislado. Pero, los módulos, hacen posible reusar el código a través de los módulos vía clases base comunes y otros recursos compartidos. + +Para traficar con los números de versión menores, puede obtener las ventajas de el contenido de las capacidades de las conductas de negociación provistas por el [[yii\filters\ContentNegotiator|contentNegotiator]]. La conducta `contentNegotiator` puede poner la propiead [[yii\web\Response::acceptParams]] cuando determina cuál tipo de contenido a soportar. + +Por ejemplo, si una peticiónes enviada con la cabecera HTTP `Accept: application/json; version=v1`, entonces la conducta de negociación, [[yii\web\Response::acceptParams]] puede contener el valor `['version' => 'v1']`. + +Basado en la información de versión contenida en `acceptParams`, puedes escribir código condicional en lugares como acciones, clases de recursos, serializadores, etc. para proveer la funcionalidad apropiada. + +Desde la menor versión, por definición, es necesario mantener la compatibilidad hacia atrás, con suerte no tendrás demasiadas versiones a comporbar en tu código. De otra manera, probablemente puede ocurrir que necesites crear una versión principal. diff --git a/docs/guide-es/tutorial-core-validators.md b/docs/guide-es/tutorial-core-validators.md new file mode 100644 index 0000000..b67c545 --- /dev/null +++ b/docs/guide-es/tutorial-core-validators.md @@ -0,0 +1,445 @@ +Validadores del núcleo +====================== + +Yii provee en el núcleo un conjunto de validadores de uso común, que se pueden encontrar principalmente bajo el espacio de nombres (namespace) `yii\validators`. +En vez de utilizar interminables nombres de clases para los validadores, puedes usar *alias* para especificar el uso de esos validadores del núcleo. Por ejemplo, puedes usar el alias `required` para referirte a la clase [[yii\validators\RequiredValidator]] : + +```php +public function rules() +{ + return [ + [['email', 'password'], 'required'], + ]; +} +``` + +La propiedad [[yii\validators\Validator::builtInValidators]] declara todos los aliases de los validadores soportados. + +A continuación, vamos a describir el uso principal y las propiedades de cada validador del núcleo. + + +## [[yii\validators\BooleanValidator|boolean]] + +```php +[ + // comprueba si "selected" es 0 o 1, sin mirar el tipo de dato + ['selected', 'boolean'], + + // comprueba si "deleted" es del tipo booleano, alguno entre true o false + ['deleted', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true], +] +``` + +Este validador comprueba si el valor de la entrada (input) es booleano. + +- `trueValue`: El valor representando *true*. Valor por defecto a `'1'`. +- `falseValue`: El valor representando *false*. Valor por defecto a `'0'`. +- `strict`: Si el tipo del valor de la entrada (input) debe corresponder con `trueValue` y `falseValue`. Valor por defecto a `false`. + + +> Nota: Ya que los datos enviados con la entrada, vía formularios HTML,son todos cadenas (strings), usted debe normalmente dejar la propiedad [[yii\validators\BooleanValidator::strict|strict]] a false. + + +## [[yii\captcha\CaptchaValidator|captcha]] + +```php +[ + ['verificationCode', 'captcha'], +] +``` + +Este validador es usualmente usado junto con [[yii\captcha\CaptchaAction]] y [[yii\captcha\Captcha]] para asegurarse que una entrada es la misma que lo es el código de verificación que enseña el widget [[yii\captcha\Captcha|CAPTCHA]]. + +- `caseSensitive`: cuando la comparación del código de verificación depende de que sean mayúsculas y minúsculas (case sensitive). Por defecto a false. +- `captchaAction`: la [ruta](structure-controllers.md#routes) correspondiente a + [[yii\captcha\CaptchaAction|CAPTCHA action]] que representa (render) la imagen CAPTCHA. Por defecto`'site/captcha'`. +- `skipOnEmpty`: cuando la validación puede saltarse si la entrada está vacía. Por defecto a false, lo caul permite que la entrada sea necesaria (required). + + +## [[yii\validators\CompareValidator|compare]] + +```php +[ + // valida si el valor del atributo "password" es igual al "password_repeat" + ['password', 'compare'], + + // valida si la edad es mayor que o igual que 30 + ['age', 'compare', 'compareValue' => 30, 'operator' => '>='], +] +``` + +Este validador compara el valor especificado por la entrada con otro valor y, se asegura si su relación es la especificada por la propiedad `operator`. + +- `compareAttribute`: El nombre del valor del atributo con el cual debe compararse. Cuando el validador está siendo usado para validar un atributo, el valor por defecto de esta propiedad debe de ser el nombre de el atributo con el sufijo `_repeat`. Por ejemplo, si el atributo a ser validado es `password`, entonces esta propiedad contiene por defecto `password_repeat`. +- `compareValue`: un valor constante con el que el valor de entrada debe ser comparado. Cuando ambos, esta propiedad y `compareAttribute` son especificados, esta preferencia tiene precedencia. +- `operator`: el operador de comparación. Por defecto vale `==`, permitiendo comprobar si el valor de entrada es igual al de `compareAttribute` o `compareValue`. Los siguientes operadores son soportados: + * `==`: comprueba si dos valores son iguales. La comparación se realiza en modo no estricto. + * `===`: comprueba si dos valores son iguales. La comparación se realiza en modo estricto. + * `!=`: comprueba si dos valores NO son iguales. La comparación se realiza en modo no estricto. + * `!==`: comprueba si dos valores NO son iguales. La comparación se realiza en modo estricto. + * `>`: comprueba si el valor siendo validado es mayor que el valor con el que se compara. + * `>=`: comprueba si el valor siendo validado es mayor o igual que el valor con el que se compara + * `<`: comprueba si el valor siendo validado es menor que el valor con el que se compara + * `<=`: comprueba si el valor siendo validado es menor o igual que el valor con el que se compara + + +## [[yii\validators\DateValidator|date]] + +```php +[ + [['from', 'to'], 'date'], +] +``` + +Este validador comprueba si el valor de entrada es una fecha, tiempo or fecha/tiempo y tiempo en el formato correcto. +Opcionalmente, puede convertir el valor de entrada en una fecha/tiempo UNIX y almacenarla en un atributo especificado vía [[yii\validators\DateValidator::timestampAttribute|timestampAttribute]]. + +- `format`: el formato fecha/tiempo en el que debe estar el valor a ser validado. + Esto tiene que ser un patrón fecha/tiempo descrito en [manual ICU](http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax). + Alternativamente tiene que ser una cadena con el prefijo `php:` representando un formato que ha de ser reconocido por la clase `Datetime` de PHP. Por favor, refiérase a sobre los formatos soportados. + Si no tiene ningún valor, ha de coger el valor de `Yii::$app->formatter->dateFormat`. +- `timestampAttribute`: el nombre del atributo al cual este validador puede asignar el fecha/hora UNIX convertida desde la entrada fecha/hora. + + +## [[yii\validators\DefaultValueValidator|default]] + +```php +[ + // pone el valor de "age" a null si está vacío + ['age', 'default', 'value' => null], + + // pone el valor de "country" a "USA" si está vacío + ['country', 'default', 'value' => 'USA'], + + // asigna "from" y "to" con una fecha 3 días y 6 días a partir de hoy, si está vacía + [['from', 'to'], 'default', 'value' => function ($model, $attribute) { + return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' : '+6 days')); + }], +] +``` + +Este validador no valida datos. En cambio, asigna un valor por defecto a los atributos siendo validados, si los atributos están vacíos. + +- `value`: el valor por defecto o un elemento llamable de PHP que devuelva el valor por defecto, el cual, va a ser asignado a los atributos siendo validados, si estos están vacíos. La signatura de la función PHP tiene que ser como sigue, + +```php +function foo($model, $attribute) { + // ... calcula $value ... + return $value; +} +``` + +> Info: Cómo determinar si un valor está vacío o no, es un tópico separado cubierto en la sección [Valores Vacíos](input-validation.md#handling-empty-inputs) . + + +## [[yii\validators\NumberValidator|double]] + +```php +[ + // comprueba si "salary" es un número de tipo doble + ['salary', 'double'], +] +``` + +Esta validador comprueba si el valor de entrada es un número de tipo doble. Es equivalente a el validador [Número](#number) . + +- `max`: el valor límite superior (incluido) de el valor. Si no tiene valor, significa que no se comprueba el valor superior. +- `min`: el valor límite inferior (incluido) de el valor. Si no tiene valor, significa que no se comprueba el valor inferior. + + +## [[yii\validators\EmailValidator|email]] + +```php +[ + // comprueba si "email" es una dirección válida de email + ['email', 'email'], +] +``` + +Este validador comprueba si el valor de entrada es una dirección válida de email. + +- `allowName`: indica cuando permitir el nombre en la dirección de email (p.e. `John Smith `). Por defecto a false. +- `checkDNS`, comprobar cuando el dominio del email existe y tiene cualquier registro A o MX. + Es necesario ser consciente que esta comprobación puede fallar debido a problemas temporales de DNS, incluso si el la dirección es válida actualmente. + Por defecto a false. +- `enableIDN`, indica cuando el proceso de validación debe tener en cuenta el informe de IDN (internationalized domain names). + Por defecto a false. Dese cuenta que para poder usar la validación de IDN has de instalar y activar la extensión de PHP `intl`, o será lanzada una excepción. + + +## [[yii\validators\ExistValidator|exist]] + +```php +[ + // a1 necesita que exista una columna con el atributo "a1" + ['a1', 'exist'], + + // a1 necesita existir,pero su valor puede usar a2 para comprobar la existencia + ['a1', 'exist', 'targetAttribute' => 'a2'], + + // a1 y a2 necesitan existir ambos, y ambos pueden recibir un mensaje de error + [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1', 'a2']], + + // a1 y a2 necesitan existir ambos, sólo a1 puede recibir el mensaje de error + ['a1', 'exist', 'targetAttribute' => ['a1', 'a2']], + + // a1 necesita existir comprobando la existencia ambos a2 y a3 (usando el valor a1) + ['a1', 'exist', 'targetAttribute' => ['a2', 'a1' => 'a3']], + + // a1 necesita existir. Si a1 es un array, cada elemento de él tiene que existir. + ['a1', 'exist', 'allowArray' => true], +] +``` + +Este validador comprueba si el valor de entrada puede ser encontrado en una columna de una tabla. Sólo funciona con los atributos del modelo [Registro Activo (Active Record)](db-active-record.md). Soporta validación tanto con una simple columna o múltiples columnas. + +- `targetClass`: el nombre de la clase [Registro Activo (Active Record)](db-active-record.md) debe de ser usada para mirar por el valor de entrada siendo validado. Si no tiene valor, la clase del modelo actualmente siendo validado puede ser usada. +- `targetAttribute`: el nombre del atributo en `targetClass` que debe de ser usado para validar la existencia del valor de entrada. Si no tiene valor, puede usar el nombra del atributoactualmente siendo validado. + Puede usar una array para validar la existencia de múltiples columnas al mismo tiempo. El array de valores son los atributos que pueden ser usados para validar la existencia, mientras que las claves del array son los atributos a ser validados. Si la clave y el valor son los mismos, solo en ese momento puedes especificar el valor. +- `filter`: filtro adicional a aplicar a la consulta de la base de datos usado para comprobar la existencia de una valor de entrada. + Esto puede ser una cadena o un array representando la condición de la consulta (referirse a [[yii\db\Query::where()]] sobre el formato de la condición de consulta), o una función anónima con la signatura `function ($query)`, donde `$query` es el objeto [[yii\db\Query|Query]] que puedes modificar en la función. +- `allowArray`: indica cuando permitir que el valor de entrada sea un array. Por defecto a false.Si la propiedad es true y la entrada es un array, cada elemento del array debe existir en la columna destino. Nota que esta propiedad no puede ser true si estás validando, por el contrario, múltiple columnas poniendo el valor del atributo `targetAttribute` como que es un array. + + +## [[yii\validators\FileValidator|file]] + +```php +[ + // comprueba si "primaryImage" es un fichero mde imagen en formato PNG, JPG o GIF. + // el tamaño del fichero ha de ser menor de 1MB + ['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024*1024], +] +``` + +Este validador comprueba que el fichero subido es el adecuado. + +- `extensions`: una lista de extensiones de ficheros que pueden ser subidos. Esto puede ser tanto un array o una cadena conteniendo nombres de extensiones de ficheros separados por un espacio o coma (p.e. "gif, jpg"). + Los nombres de las extensiones no diferencian mayúsculas de minúsculas (case-insensitive). Por defecto a null, permitiendo todas los nombres de extensiones de fichero. +- `mimeTypes`: una lista de tipos de ficheros MIME que están permitidos subir. Esto puede ser tanto un array como una cadena conteniendo tipos de fichero MIME separados por un espacio o una coma (p.e. "image/jpeg, image/png"). + Los tipos Mime no diferencian mayúsculas de minúsculas (case-insensitive). Por defecto a null, permitiendo todos los tipos MIME. +- `minSize`: el número de bytes mínimo requerido para el fichero subido. El tamaño del fichero ha de ser superior a este valor. Por defecto a null, lo que significa sin límite inferior. +- `maxSize`: El número máximo de bytes del fichero a subir. El tamaño del fichero ha de ser inferior a este valor. Por defecto a null, significando no tener límite superior. +- `maxFiles`: el máximo número de ficheros que determinado atributo puede manejar. Por defecto a 1, lo que significa que la entrada debe de ser sólo un fichero. Si es mayor que 1, entonces la entrada tiene que ser un array conteniendo como máximo el número `maxFiles` de elementos que representan los ficheros a subir. +- `checkExtensionByMimeType`: cuando comprobar la extensión del fichero por el tipo MIME. Si la extensión producida por la comprobación del tipo MIME difiere la extensión del fichero subido, el fichero será considerado como no válido. Por defecto a true, significando que realiza este tipo de comprobación. + +`FileValidator` es usado con [[yii\web\UploadedFile]]. Por favor, refiérase a la sección [Subida de ficheros](input-file-upload.md) para una completa cobertura sobre la subida de ficheros y llevar a cabo la validación de los ficheros subidos. + + +## [[yii\validators\FilterValidator|filter]] + +```php +[ + // recorta (trim) las entradas "username" y "email" + [['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true], + + // normaliza la entrada de "phone" + ['phone', 'filter', 'filter' => function ($value) { + // normaliza la entrada del teléfono aquí + return $value; + }], +] +``` + +Este validador no valida datos. En su lugar, aplica un filtro sobre el valor de entrada y le asigna de nuevo el atributo siendo validado. + +- `filter`: una retrollamada (callback) de PHP que define un filtro. Tiene que ser un nombre de función global, una función anónima, etc. + La forma de la función ha de ser `function ($value) { return $newValue; }`. Tiene que contener un valor esta propiedad. +- `skipOnArray`: cuando evitar el filtro si el valor de la entrada es un array. Por defecto a false. + A tener en cuenta que si el filtro no puede manejar una entrada de un array, debes poner esta propiedad a true. En otro caso algún error PHP puede ocurrir. + +> Consejo (Tip): Si quieres recortar los valores de entrada, puedes usar directamente el validador [Recorte (trim)](#trim). + + +## [[yii\validators\ImageValidator|image]] + +```php +[ + // comprueba si "primaryImage" es una imágen vaĺida con el tamaño adecuado + ['primaryImage', 'image', 'extensions' => 'png, jpg', + 'minWidth' => 100, 'maxWidth' => 1000, + 'minHeight' => 100, 'maxHeight' => 1000, + ], +] +``` + +Este validador comprueba si el valor de entrada representa un fichero de imagen válido. Extiende al validador [Fichero (file)](#file) y, por lo tanto, hereda todas sus propiedades. Además, soporta las siguientes propiedades adicionales específicas para la validación de imágenes: + +- `minWidth`: el mínimo ancho de la imagen. Por defecto a null, indicando que no hay límite inferior. +- `maxWidth`: el máximo ancho de la imagen. Por defecto a null, indicando que no hay límite superior. +- `minHeight`: el mínimo alto de la imagen. Por defecto a null, indicando que no hay límite inferior. +- `maxHeight`: el máximo alto de la imagen. Por defecto a null, indicando que no hay límite superior. + + +## [[yii\validators\RangeValidator|in]] + +```php +[ + // comprueba si "level" es 1, 2 o 3 + ['level', 'in', 'range' => [1, 2, 3]], +] +``` + +Este validador comprueba si el valor de entrada puede encontrarse entre determinada lista de valores. + +- `range`: una lista de determinados valores dentro de los cuales el valor de entrada debe de ser mirado. +- `strict`: cuando la comparación entre el valor de entrada y los valores determinados debe de ser estricta (ambos el tipo y el valor han de ser iguales). Por defecto a false. +- `not`: cuando el resultado de la validación debe de ser invertido. Por defecto a false. Cuando esta propiedad está a true, el validador comprueba que el valor de entrada NO ESTÁ en la determinada lista de valores. +- `allowArray`: si se permite que el valor de entrada sea un array. Cuando es true y el valor de entrada es un array, cada elemento en el array debe de ser encontrado en la lista de valores determinada,o la validación fallará. + + +## [[yii\validators\NumberValidator|integer]] + +```php +[ + // comrpueba si "age" es un entero + ['age', 'integer'], +] +``` + +Esta validador comprueba si el valor de entrada es un entero. + +- `max`: el valor superior (incluido) . Si no tiene valor, significa que el validador no comprueba el límite superior. +- `min`: el valor inferior (incluido). Si no tiene valor, significa que el validador no comprueba el límite inferior. + + +## [[yii\validators\RegularExpressionValidator|match]] + +```php +[ + // comprueba si "username" comienza con una letra y contiene solamente caracteres en sus palabras + ['username', 'match', 'pattern' => '/^[a-z]\w*$/i'] +] +``` + +Este validador comprueba si el valor de entrada coincide con la expresión regular especificada. + +- `pattern`: la expresión regular conla que el valor de entrada debe coincidir. Esta propiedad no puede estar vacía, o se lanzará una excepción. +- `not`: indica cuando invertir el resultado de la validación. Por defecto a false, significando que la validación es exitosa solamente si el valor de entrada coincide con el patrón. Si esta propiedad está a true, la validación es exitosa solamente si el valor de entrada NO coincide con el patrón. + + +## [[yii\validators\NumberValidator|number]] + +```php +[ + // comprueba si "salary" es un número + ['salary', 'number'], +] +``` + +Este validador comprueba si el valor de entrada es un número. Es equivalente al validador [Doble precisión (double)](#double). + +- `max`: el valor superior límite (incluido) . Si no tiene valor, significa que el validador no comprueba el valor límite superior. +- `min`: el valor inferior límite (incluido) . Si no tiene valor, significa que el validador no comprueba el valor límite inferior. + + +## [[yii\validators\RequiredValidator|required]] + +```php +[ + // comprueba si ambos "username" y "password" no están vacíos + [['username', 'password'], 'required'], +] +``` + +El validador comprueba si el valor de entrada es provisto y no está vacío. + +- `requiredValue`: el valor deseado que la entrada debería tener. Si no tiene valor, significa que la entrada no puede estar vacía. +- `strict`: indica como comprobar los tipos de los datos al validar un valor. Por defecto a false. + Cuando `requiredValue` no tiene valor, si esta propiedad es true, el validador comprueba si el valor de entrada no es estrictamente null; si la propiedad es false, el validador puede usar una regla suelta para determinar si el valor está vacío o no. + Cuando `requiredValue` tiene valor, la comparación entre la entrada y `requiredValue` comprobará tambien los tipos de los datos si esta propiedad es true. + +> Info: Como determinar si un valor está vacío o no es un tópico separado cubierto en la sección [Valores vacíos](input-validation.md#handling-empty-inputs). + + +## [[yii\validators\SafeValidator|safe]] + +```php +[ + // marca "description" como un atributo seguro + ['description', 'safe'], +] +``` + +Este validador no realiza validación de datos. En lugar de ello, es usado para marcar un atributo como seguro [atributos seguros](structure-models.md#safe-attributes). + + +## [[yii\validators\StringValidator|string]] + +```php +[ + // comprueba si "username" es una cadena cuya longitud está entre 4 Y 24 + ['username', 'string', 'length' => [4, 24]], +] +``` + +Este validador comprueba si el valor de entrada es una cadena válida con determinada longitud. + +- `length`: especifica la longitud límite de la cadena de entrada a validar. Esto tiene que ser especificado del las siguientes formas: + * un entero: la longitud exacta que la cadena debe de tener; + * un array de un elemento: la longitud mínima de la cadena de entrada (p.e.`[8]`). Esto puede sobre escribir `min`. + * un array de dos elementos: las longitudes mínima y mmáxima de la cadena de entrada (p.e. `[8, 128]`). + Esto sobreescribe ambos valores de `min` y `max`. +- `min`: el mínimo valor de longitud de la cadena de entrada. Si no tiene valor, significa que no hay límite para longitud mínima. +- `max`: el máximo valor de longitud de la cadena de entrada. Si no tiene valor, significa que no hay límite para longitud máxima. +- `encoding`: la codificación de la cadena de entrada a ser validada. Si no tiene valor, usará el valor de la aplicación [[yii\base\Application::charset|charset]] que por defecto es `UTF-8`. + + +## [[yii\validators\FilterValidator|trim]] + +```php +[ + // recorta (trim) los espacios en blanco que rodean a "username" y "email" + [['username', 'email'], 'trim'], +] +``` + +Este validador no realiza validación de datos. En cambio, recorta los espacios que rodean el valor de entrada. Nota que si el valor de entrada es un array, se ignorará este validador. + + +## [[yii\validators\UniqueValidator|unique]] + +```php +[ + // a1 necesita ser único en la columna representada por el atributo "a1" + ['a1', 'unique'], + + // a1 necesita ser único, pero la columna a2 puede ser usado para comprobar la unicidad del valor a1 + ['a1', 'unique', 'targetAttribute' => 'a2'], + + // a1 y a2 necesitan ambos ser únicos, y ambospueden recibir el mensaje de error + [['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']], + + // a1 y a2 necesitan ser unicos ambos, solamente uno recibirá el mensaje de error + ['a1', 'unique', 'targetAttribute' => ['a1', 'a2']], + + // a1 necesita ser único comprobando la unicidad de ambos a2 y a3 (usando el valor) + ['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']], +] +``` + +Este validador comprueba si el valor de entrada es único en una columna de una tabla. Solo funciona con los atributos del modelo [Registro Activo (Active Record)](db-active-record.md). Soporta validación contra cualquiera de los casos, una columna o múltiples columnas. + +- `targetClass`: el nombre de la clase [Registro Activo (Active Record)](db-active-record.md) que debe de ser usada para mirar por el valor de entrada que está siendo validado. Si no tiene valor, la clase del modelo actualmente validado será usada. +- `targetAttribute`: el nombre de el atributo en `targetClass`que debe de ser usado para validar la unicidad de el valor de entrada. Si no tiene valor, puede usar el nombre del atributo actualmente siendo validado. + Puedes usar un array para validar la unicidad de múltiples columnas al mismo tiempo. Los valores del array son atributos que pueden ser usados para validar la unicidad, mientras que las claves del array son los atributos que cuyos valores van a ser validados. Si la clave y el valor son el mismo, entonces puedes especificar el valor. +- `filter`: filtro adicional puede ser aplicado a la consulta de la base de datos usado para comprobar la unicidad del valor de entrada. + Esto puede ser una cadena o un array representando la condición adicional a la consulta (Referirse a [[yii\db\Query::where()]] para el formato de la condición de la consulta), o una función anónima de la forma `function ($query)`, donde `$query` es el objeto [[yii\db\Query|Query]] que puedes modificar en la función. + + +## [[yii\validators\UrlValidator|url]] + +```php +[ + // comprueba si "website" es una URL válida. Prefija con "http://" al atributo "website" + // si no tiene un esquema URI + ['website', 'url', 'defaultScheme' => 'http'], +] +``` + +Este validador comprueba si el valor de entrada es una URL válida. + +- `validSchemes`: un array especificando el esquema URI que debe ser considerado válido. Por defecto contiene `['http', 'https']`, significando que ambas URLS `http` y `https` son consideradas válidas. +- `defaultScheme`: el esquema de URI a poner como prefijo a la entrada si no tiene la parte del esquema. + Por defecto a null, significando que no modifica el valor de entrada. +- `enableIDN`: Si el validador debe formar parte del registro IDN (internationalized domain names). + Por defecto a false. Nota que para usar la validación IDN tienes que instalar y activar la extensión PHP `intl`, en otro caso una excepción será lanzada. + diff --git a/docs/guide-es/tutorial-yii-integration.md b/docs/guide-es/tutorial-yii-integration.md new file mode 100644 index 0000000..9cb2dda --- /dev/null +++ b/docs/guide-es/tutorial-yii-integration.md @@ -0,0 +1,142 @@ +Trabajando con código de terceros +================================= + +De tiempo en tiempo, puede necesitar usar algún código de terceros en sus aplicaciones Yii. O puedes querer usar Yii como una librería en otros sistemas de terceros. En esta sección, te enseñaremos cómo conseguir estos objetivos. + + +## Usando librerías de terceros en Yii + +Para usar una librería en una aplicación Yii, primeramente debes de asegurarte que las clases een la librería son incluidas adecuadamente o pueden ser cargadas de forma automática. + + +### Usando Paquetes de Composer + +Muchas librerías de terceros son liberadas en términos de paquetes [Composer](https://getcomposer.org/). +Puedes instalar este tipo de librerias siguiendo dos sencillos pasos: + +1. modificar el fichero `composer.json` de tu aplicación y especificar que paquetes Composer quieres instalar. +2. ejecuta `composer install` para instalar los paquetes específicados. + +Las clases en los paquetes Composer instalados pueden ser autocargados usando el cargador automatizado de Composer autoloader. Asegúrate que el fichero [script de entrada](structure-entry-scripts.md) de tu aplicación contiene las siguientes líneas para instalar el cargador automático de Composer: + +```php +// instalar el cargador automático de Composer +require(__DIR__ . '/../vendor/autoload.php'); + +// incluir rl fichero de la clase Yii +require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); +``` + + +### Usando librerías Descargadas + +Si la librería no es liberada como un paquete de Composer, debes de seguir sus instrucciones de instalación para instalarla. +En muchos casos, puedes necesitar descargar manualmente el fichero de la versión y desempaquetarlo en el directorio `BasePath/vendor` , donde `BasePath` representa el [camino base (base path)](structure-applications.md#basePath) de tu aplicación. + +Si la librería lleva su propio cargador automático (autoloader), puedes instalarlo en [script de entrada](structure-entry-scripts.md) de tu aplicación. Es recomendable que la instalación se termine antes de incluir el fichero `Yii.php` de forma que el cargador automático tenga precedencia al cargar de forma automática las clases. + +Si la librería no provee un cargador automático de clases, pero la denominación de sus clases sigue el [PSR-4](http://www.php-fig.org/psr/psr-4/), puedes usar el cargador automático de Yii para cargar de forma automática las clases. Todo lo que necesitas es declarar un [alias raiz](concept-aliases.md#defining-aliases) para cada espacio de nombres (namespace) raiz usado en sus clases. Por ejemplo, asume que has instalado una librería en el directorio `vendor/foo/bar`, y que las clases de la librería están bajo el espacio de nombres raiz `xyz`. Puedes incluir el siguiente código en la configuración de tu aplicación: + +```php +[ + 'aliases' => [ + '@xyz' => '@vendor/foo/bar', + ], +] +``` + +Si ninguno de lo anterior es el caso, estaría bien que la librería dependa del camino de inclusión (include path) de configuración de PHP para localizar correctamente e incluir los ficheros de las clases. Simplemente siguiendo estas instrucciones de cómo configurar el camino de inclusión de PHP. + +En el caso más grave en el que la librería necesite incluir cada uno de sus ficheros de clases, puedes usar el siguiente método para incluir las clases según se pidan: + +* Identificar que clases contiene la librería. +* Listar las clases y el camino a los ficheros correspondientes en `Yii::$classMap` en el script de entrada [script de entrada](structure-entry-scripts.md) de la aplicación. Por ejemplo, +```php +Yii::$classMap['Class1'] = 'path/to/Class1.php'; +Yii::$classMap['Class2'] = 'path/to/Class2.php'; +``` + + +## Usando Yii en Sistemas de Terceros + +Debido a que Yii provee muchas posibilidades excelentes, a veces puedes querer usar alguna de sus características para permitir el desarrollo o mejora de sistemas de terceros, como es WordPress, Joomla, o aplicaciones desarrolladas usando otros frameworks de PHP. Por ejemplo, puedes queres usar la clase [[yii\helpers\ArrayHelper]] o usar la característica [Active Record](db-active-record.md) en un sistema de terceros. Para lograr este objetivo, principalmente necesitas realizar dos pasos: instalar Yii , e iniciar Yii. + +Si el sistema de terceros usa Composer para manejar sus dependencias, simplemente ejecuta estos comandos para instalar Yii: + +``` +composer require "yiisoft/yii2:*" +composer install +``` + +En otro caso, puedes [descargar](http://www.yiiframework.com/download/) el fichero de la edición de Yii y desempaquetarla en el directorio `BasePath/vendor`. + +Después, debes de modificar el script de entrada de sistema de terceros para incluir el siguiente código al principio: + +```php +require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); + +$yiiConfig = require(__DIR__ . '/../config/yii/web.php'); +new yii\web\Application($yiiConfig); // No ejecutes run() aquí +``` + +Como puedes ver, el código anterior es muy similar al que puedes ver en [script de entrada](structure-entry-scripts.md) de una aplicación típica. La única diferencia es que después de que se crea la instancia de la aplicación, el método `run()` no es llamado. Esto es así porque llamando a `run()`, Yii se haría cargo del control del flujo de trabajo del manejo de las peticiones, lo cual no es necesario en este caso por estar ya es manejado por la aplicación existente. + +Como en una aplicación Yii, debes configurar la instancia de la aplicación basándose en el entorno que se está ejecutando del sistema de terceros. Por ejemplo, para usar la característica [Active Record](db-active-record.md) , necesitas configurar `db` [componente de la aplicación](structure-application-components.md) con los parámetros de la conexión de base de datos usados por el sistema de terceros. + +Ahora puedes usar muchas características provistas por Yii. Por ejemplo, puedes crear clases Active Record y usarlas para trabajar con bases de datos. + + +## Usando Yii 2 con Yii 1 + +Si estaba usando Yii 1 previamente, es como si tuvieras una aplicación Yii 1 funcionando. En vez de reescribir toda la aplicación en Yii 2, puedes solamente mejorarla usando alguna de las características sólo disponibles en Yii 2. + +Esto se puede lograr tal y como se describe abajo. + +> Nota: Yii 2 requiere PHP 5.4 o superior. Debes de estar seguro que tanto tu servidor como la aplicación existente lo soportan. + +Primero, instala Yii 2 en tu aplicación siguiendo las instrucciones descritas en la [última subsección](#using-yii-in-others). + +Segundo,modifica el script de entrada de la aplicación como sigue, + +```php +// incluir la clase Yii personalizada descrita debajo +require(__DIR__ . '/../components/Yii.php'); + +// configuración para la aplicación Yii 2 +$yii2Config = require(__DIR__ . '/../config/yii2/web.php'); +new yii\web\Application($yii2Config); // No llamar a run() + +// configuración para la aplicación Yii 1 +$yii1Config = require(__DIR__ . '/../config/yii1/main.php'); +Yii::createWebApplication($yii1Config)->run(); +``` + +Debido a que ambos Yii 1 y Yii 2 tiene la clase `Yii` , debes crear una versión personalizada para combinarlas. + +El código anterior incluye el fichero con la clase `Yii` personalizada, que tiene que ser creada como sigue. + +```php +$yii2path = '/path/to/yii2'; +require($yii2path . '/BaseYii.php'); // Yii 2.x + +$yii1path = '/path/to/yii1'; +require($yii1path . '/YiiBase.php'); // Yii 1.x + +class Yii extends \yii\BaseYii +{ + // copy-paste the code from YiiBase (1.x) here +} + +Yii::$classMap = include($yii2path . '/classes.php'); +// registrar el autoloader de Yii2 autoloader via Yii1 +Yii::registerAutoloader(['Yii', 'autoload']); +// crear el contenedor de inyección de dependencia +Yii::$container = new yii\di\Container; +``` + +¡Esto es todo!. Ahora, en cualquier parte de tu código, puedes usar `Yii::$app` para acceder a la instancia de la aplicación de Yii 2, mientras `Yii::app()` proporciona la instancia de la aplicación de Yii 1 : + +```php +echo get_class(Yii::app()); // genera 'CWebApplication' +echo get_class(Yii::$app); // genera 'yii\web\Application' +``` diff --git a/docs/guide-es/widget-bootstrap.md b/docs/guide-es/widget-bootstrap.md new file mode 100644 index 0000000..35cf0cd --- /dev/null +++ b/docs/guide-es/widget-bootstrap.md @@ -0,0 +1,63 @@ +Widgets de Bootstrap +==================== + +> Nota: Esta sección está bajo desarrollo. + +Yii incluye soporta las marcas y componentes del framework [Bootstrap 3](http://getbootstrap.com/) (también conocido como "Twitter Bootstrap"). Bootstrap es un excelente, adaptable framework que puede aumentar la velocidad de desarrollo de los procesos del lado del cliente. + +El núcleo de Bootstrap está represntado en dos partes: + +- Elementos básicos de CSS, como son un sistema de diseño en formato cuadrícula , tipografía, clases de ayuda (helpers), y utilidades adapatables(responsive). + +- Componentes preparados para su uso, tales como formularios, menús, paginación, cajas modales, pestañas, etc + +Elementos básicos +------ + +Yii no hace uso de elementos básicos de boostrap en el código PHP ya que HTML es muy simple por sí mismo, en este caso. Puedes encontrar detalle del uso de estos elementos básicos en [sitio web de la documentación de bootstrap](http://getbootstrap.com/css/). Aún así Yii provee una manera conveniente de incluir los elementos básicos de los recursos de bootstrap en tus páginas con una simple línea añadida a `AppAsset.php` localizada en tu directorio `@app/assets` : + +```php +public $depends = [ + 'yii\web\YiiAsset', + 'yii\bootstrap\BootstrapAsset', // Esta línea +]; +``` + +Usar bootstrap a través de el gestor de recursos Yii te permite minimizar estos recursos y combinar con tus propios recursos cuando sea necesario.. + +Widgets de Yii +----------- + +Componentes más complejos de bootstrap components están envueltos dentro de widgets de Yii para permitir una sintaxis más robusta e integrar con las posibilidades y características del framework. Todos los widgets pertenecen al espacio de nombres `\yii\bootstrap` : + +- [[yii\bootstrap\ActiveForm|ActiveForm]] +- [[yii\bootstrap\Alert|Alert]] +- [[yii\bootstrap\Button|Button]] +- [[yii\bootstrap\ButtonDropdown|ButtonDropdown]] +- [[yii\bootstrap\ButtonGroup|ButtonGroup]] +- [[yii\bootstrap\Carousel|Carousel]] +- [[yii\bootstrap\Collapse|Collapse]] +- [[yii\bootstrap\Dropdown|Dropdown]] +- [[yii\bootstrap\Modal|Modal]] +- [[yii\bootstrap\Nav|Nav]] +- [[yii\bootstrap\NavBar|NavBar]] +- [[yii\bootstrap\Progress|Progress]] +- [[yii\bootstrap\Tabs|Tabs]] + + +Usando los ficheros .less de Bootstrap directamente +------------------------------------------- + +Si quieres incluir el [Css Bootstrap directamente en tus ficheros less](http://getbootstrap.com/getting-started/#customizing) puedes necesitar desactivar la carga los ficheros css originales de bootstrap. +Esto lo puedes hacer poniendo la propiedad css de [[yii\bootstrap\BootstrapAsset|BootstrapAsset]] vacía. +Para esto necesitas configurar el `assetManager` [componente de la aplicación](structure-application-components.md) como sigue: + +```php + 'assetManager' => [ + 'bundles' => [ + 'yii\bootstrap\BootstrapAsset' => [ + 'css' => [], + ] + ] + ] +``` diff --git a/docs/guide-es/widget-jui.md b/docs/guide-es/widget-jui.md new file mode 100644 index 0000000..d42bf1f --- /dev/null +++ b/docs/guide-es/widget-jui.md @@ -0,0 +1,27 @@ +Widgets de Jquery UI +==================== + +> Nota: Esta sección está en desarrollo. + +Además de lo anterior, Yii incluye soporte para la librería jquery [jQuery UI](http://api.jqueryui.com/). jQuery UI es un probado conjunto de interacciones con el interface de usuario, efectos, widgets, y temas sobre la librería JavaScript de jquery. + +widgets de Yii +-------------- + +Los componentes más complejos de jQuery UI están envueltos dentro de los widgets de Yii para permitir una sintaxis más robusta e integralas con las características del framework. Todos los widgets pertenecen al espacio de nombre `\yii\jui` : + +- [[yii\jui\Accordion|Accordion]] +- [[yii\jui\AutoComplete|AutoComplete]] +- [[yii\jui\DatePicker|DatePicker]] +- [[yii\jui\Dialog|Dialog]] +- [[yii\jui\Draggable|Draggable]] +- [[yii\jui\Droppable|Droppable]] +- [[yii\jui\Menu|Menu]] +- [[yii\jui\ProgressBar|ProgressBar]] +- [[yii\jui\Resizable|Resizable]] +- [[yii\jui\Selectable|Selectable]] +- [[yii\jui\Slider|Slider]] +- [[yii\jui\SliderInput|SliderInput]] +- [[yii\jui\Sortable|Sortable]] +- [[yii\jui\Spinner|Spinner]] +- [[yii\jui\Tabs|Tabs]] \ No newline at end of file From 46b1281483ee66a5b1f6fcb121a2a288cb0bc74e Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sat, 1 Nov 2014 08:22:48 +0900 Subject: [PATCH 026/144] docs/guide-ja/structure-controllers.md added [ci skip] --- docs/guide-ja/structure-controllers.md | 453 +++++++++++++++++++++++++++++++++ 1 file changed, 453 insertions(+) create mode 100644 docs/guide-ja/structure-controllers.md diff --git a/docs/guide-ja/structure-controllers.md b/docs/guide-ja/structure-controllers.md new file mode 100644 index 0000000..8c2d666 --- /dev/null +++ b/docs/guide-ja/structure-controllers.md @@ -0,0 +1,453 @@ +コントローラ +============ + +コントローラは [MVC](http://ja.wikipedia.org/wiki/Model_View_Controller) アーキテクチャの一部を成すものです。 +これは [[yii\base\Controller]] を拡張したクラスのオブジェクトであり、リクエストの処理とレスポンスの生成について責任を負うものです。 +具体的には、[アプリケーション](structure-applications.md) から制御を引き継いだ後、コントローラは入ってきたリクエストのデータを分析し、 +それを [モデル](structure-models.md) に引き渡して、モデルが生成した結果を [ビュー](structure-views.md) に投入し、 +最終的に外に出て行くレスポンスを生成します。 + + +## アクション + +コントローラは *アクション* から構成されます。 +アクションは、エンドユーザがアドレスを指定して実行をリクエストできる最も基本的な構成単位です。 +コントローラは一つまたは複数のアクションを持ち得ます。 + +次の例は、`view` と `create` という二つのアクションを持つ `post` コントローラを示すものです: + +```php +namespace app\controllers; + +use Yii; +use app\models\Post; +use yii\web\Controller; +use yii\web\NotFoundHttpException; + +class PostController extends Controller +{ + public function actionView($id) + { + $model = Post::findOne($id); + if ($model === null) { + throw new NotFoundHttpException; + } + + return $this->render('view', [ + 'model' => $model, + ]); + } + + public function actionCreate() + { + $model = new Post; + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', 'id' => $model->id]); + } else { + return $this->render('create', [ + 'model' => $model, + ]); + } + } +} +``` + +`view` アクション (`actionView()` メソッドで定義されます) において、 +コードは最初に、リクエストされたモデルの ID に従って [モデル](structure-models.md) を読み出します。 +モデルの読み出しが成功したときは、`view` という名前の [ビュー](structure-views.md) を使ってモデルを表示します。 +失敗したときは例外を投げます。 + +`create` アクション (`actionCreate()` メソッドで定義されます) においても、コードは似たようなものです。 +最初にリクエストデータを使って [モデル](structure-models.md) にデータを投入して、モデルを保存することを試みます。 +両方が成功したときは、新しく作成されたモデルの ID を使って `view` アクションにブラウザをリダイレクトします。 +どちらかが失敗したときは、ユーザが必要なデータを入力できるようにするための `create` ビューを表示します。 + + +## ルート + +エンドユーザは、いわゆる *ルート* によって、アクションのアドレスを指定します。 +ルートは、次の部分からなる文字列です。 + +* モジュール ID: この部分は、コントローラがアプリケーションではなく [モジュール](structure-modules.md) に属する場合にのみ存在します; +* コントローラ ID: 同じアプリケーション (または、コントローラがモジュールに属する場合は、同じモジュール) + に属する全てのコントローラの中から、特定のコントローラを指定するユニークな文字列; +* アクション ID: 同じコントローラに属する全てのアクションの中から、特定のアクションを指定するユニークな文字列。 + +ルートは次の形式を取ります: + +``` +ControllerID/ActionID +``` + +または、コントローラがモジュールに属する場合は、次の形式を取ります: + +```php +ModuleID/ControllerID/ActionID +``` + +ですから、ユーザが `http://hostname/index.php?r=site/index` という URL でリクエストをした場合は、`site` コントローラの中の `index` アクションが実行されます。 +どのようにしてルートがアクションとして解決されるかについて、更なる詳細は [ルーティング](runtime-routing.md) の節を参照してください。 + + +## コントローラを作成する + +[[yii\web\Application|ウェブアプリケーション]] では、コントローラは [[yii\web\Controller]] またはその子クラスから派生させるべきです。 +同様に、[[yii\console\Application|コンソールアプリケーション]] では、コントローラは [[yii\console\Controller]] またはその子クラスから派生させるべきです。 +次のコードは `site` コントローラを定義するものです: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ +} +``` + + +### コントローラの ID + +通常、コントローラは特定の型のリソースに関するリクエストを処理するように設計されます。 +この理由により、たいていはコントローラが処理するリソースの型を示す名詞をコントローラの ID として使います。 +例えば、記事データを処理するコントローラの ID としては、`article` を使うことが出来ます。 + +既定では、コントローラの ID は、以下の文字のみを含むべきものです: すなわち、小文字の英字、数字、アンダースコア、ダッシュ、 +および、フォワードスラッシュ。 +例えば、`article` と `post-comment` はともに有効なコントローラの ID ですが、`article?`、`PostComment`、`admin\post` は有効ではありません。 + +コントローラの ID は、サブディレクトリの接頭辞を含んでも構いません。例えば、`admin/article` は、 +[[yii\base\Application::controllerNamespace|コントローラ名前空間]] の下の `admin` サブディレクトリにある `article` コントローラを表します。 +サブディレクトリの接頭辞として有効な文字は以下を含みます: 小文字または大文字の英字、数字、アンダースコア、そして、 +フォワードスラッシュ。フォワードスラッシュは、複数レベルのサブディレクトリの区切り文字として使われます (例えば、`panels/admin`)。 + + +### コントローラクラスの命名規則 + +コントローラクラスの名前は下記の規則に従ってコントローラの ID から導出することが出来ます: + +* ダッシュで区切られた各単語の最初の文字を大文字に変える。コントローラ ID がスラッシュを含む場合、 + この規則は ID の最後のスラッシュの後ろの部分にのみ適用されることに注意。 +* ダッシュを削除し、フォワードスラッシュを全てバックワードスラッシュに置き換える。 +* 接尾辞 `Controller` を追加する。 +* そして、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] を頭に付ける。 + +以下は、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] がデフォルト値 `app\controllers` を取っていると +仮定したときの、いくつかの例です: + +* `article` から `app\controllers\ArticleController` が導出される; +* `post-comment` から `app\controllers\PostCommentController` が導出される; +* `admin/post-comment` から `app\controllers\admin\PostCommentController` が導出される; +* `adminPanels/post-comment` から `app\controllers\adminPanels\PostCommentController` が導出される。 + +コントローラクラスは [オートロード可能](concept-autoloading.md) でなければなりません。この理由により、 +上記の例の `aritcle` コントローラクラスは [エイリアス](concept-aliases.md) が `@app/controllers/ArticleController.php` である +ファイルに保存されるべきものとなります。一方、`admin/post2-comment` コントローラは `@app/controllers/admin/Post2CommentController.php` +というエイリアスのファイルに保存されるべきものとなります。 + +> Info|情報: 最後の例である `admin/post2-comment` は、どうすれば [[yii\base\Application::controllerNamespace|コントローラ名前空間]] の + サブディレクトリにコントローラを置くことが出来るかを示しています。 + この方法は、コントローラをいくつかのカテゴリに分けて組織したい、けれども [モジュール](structure-modules.md) は使いたくない、 + という場合に役立ちます。 + + +### コントローラマップ + +[[yii\base\Application::controllerMap|コントローラマップ]] を構成すると、上で述べたコントローラの ID とクラス名の制約を乗り越えることが出来ます。 +これは、主として、クラス名に対する制御が及ばないサードパーティのコントローラを使おうとする場合に有用です。 + +[[yii\base\Application::controllerMap|コントローラマップ]] は [アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の中で、次のように構成することが出来ます: + +```php +[ + 'controllerMap' => [ + // クラス名を使って "account" コントローラを宣言する + 'account' => 'app\controllers\UserController', + + // コンフィギュレーション配列を使って "article" コントローラを宣言する + 'article' => [ + 'class' => 'app\controllers\PostController', + 'enableCsrfValidation' => false, + ], + ], +] +``` + + +### デフォルトコントローラ + +全てのアプリケーションは、それぞれ、[[yii\base\Application::defaultRoute]] プロパティを通じて規定されるデフォルトコントローラを持ちます。 +リクエストが [ルート](#ids-routes) を指定しない場合、このプロパティによって指定されたルートが使われます。 +[[yii\web\Application|ウェブアプリケーション]] では、この値は `'site'` であり、一方、[[yii\console\Application|コンソールアプリケーション]] では、`help` です。 +従って、URL が `http://hostname/index.php` である場合は、`site` コントローラがリクエストを処理することになります。 + +次のように [アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) を構成して、デフォルトコントローラを変更することが出来ます: + +```php +[ + 'defaultRoute' => 'main', +] +``` + + +## アクションを作成する + +アクションの作成は、コントローラクラスの中にいわゆる *アクションメソッド* を定義するだけの簡単なことです。 +アクションメソッドとは、`action` という語で始まる名前を持つ *public* メソッドのことです。 +アクションメソッドの返り値がエンドユーザに送信されるレスポンスデータを表します。 +次のコードは、`index` と `hello-world` という二つのアクションを定義するものです: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public function actionIndex() + { + return $this->render('index'); + } + + public function actionHelloWorld() + { + return 'Hello World'; + } +} +``` + + +### アクション ID + +アクションは、たいてい、あるリソースについて特定の操作を実行するように設計されます。この理由により、 +アクション ID は、通常、`view`、`update` などのような動詞になります。 + +既定では、アクション ID は次の文字のみを含むべきものです: すなわち、小文字の英字、数字、アンダースコア、そして、ダッシュ。 +アクション ID の中のダッシュは単語を分けるために使われます。例えば、 +`view`、`update2`、`comment-post` は全て有効なアクション ID ですが、`view?`、`Update` は有効ではありません。 + +アクションは二つの方法で作成することが出来ます: すなわち、インラインアクションとスタンドアロンアクションです。 +インラインアクションはコントローラクラスのメソッドとして定義されるものであり、一方、スタンドアロンアクションは +[[yii\base\Action]] またはその子クラスから派生させたクラスです。 +インラインアクションは作成するのにより少ない労力を要し、アクションを再利用する意図がない場合によく推奨されます。 +もう一方で、スタンドアロンアクションは、主として、さまざまなコントローラの中で使われることや、 +[エクステンション](structure-extensions.md) として再配布されることを意図して作成されます。 + + +### インラインアクション + +インラインアクションは、たった今説明したように、アクションメソッドとして定義されるアクションを指します。 + +アクションメソッドの名前は、次の基準に従って、アクション ID から導出されます: + +* アクション ID に含まれる各単語の最初の文字を大文字に変換する; +* ダッシュを削除する; +* 前置辞 `action` を前に付ける。 + +例えば、`index` は `actionIndex` となり、`hello-world` は `actionHelloWorld` となります。 + +> Note|注意: アクションメソッドの名前は、*大文字と小文字を区別* します。`ActionIndex` という名前のメソッドがあっても、 + それはアクションメソッドとは見なされず、結果として、`index` アクションに対するリクエストは例外に帰結します。 + アクションメソッドが public でなければならない事にも注意してください。private や protected なメソッドが + インラインアクションを定義することはありません。 + + +アクションは、作成するのにほとんど労力を要さないため、たいていの場合、インラインアクションとして定義されます。 +しかしながら、同じアクションを別の場所で再利用する計画があったり、また、アクションを再配布したいと思ったりする場合は、 +*スタンドアロンアクション* として定義することを考慮すべきです。 + + +### スタンドアロンアクション + +スタンドアロンアクションは、[[yii\base\Action]] またはその子クラスを拡張したクラスとして定義されるものです。 +例えば、Yii のリリースに [[yii\web\ViewAction]] と [[yii\web\ErrorAction]] が含まれていますが、これらは両方とも +スタンドアロンアクションです。 + +スタンドアロンアクションを使用するためには、下記のように、コントローラの [[yii\base\Controller::actions()]] メソッドを +オーバーライドして、スタンドアロンアクションを *アクションマップ* の中で宣言します: + +```php +public function actions() +{ + return [ + // クラス名を使って "error" アクションを宣言する + 'error' => 'yii\web\ErrorAction', + + // コンフィギュレーション配列を使って "view" アクションを宣言する + 'view' => [ + 'class' => 'yii\web\ViewAction', + 'viewPrefix' => '', + ], + ]; +} +``` + +見ると分かるように、`actions()` メソッドは、キーがアクション ID であり、値が対応するアクションのクラス名または +[コンフィギュレーション](concept-configurations.md) である配列を返すべきものです。 +インラインアクションと違って、スタンドアロンアクションのアクション ID は、`actions()` メソッドにおいて宣言される +限りにおいて、任意の文字を含むことが出来ます。 + + +スタンドアロンアクションクラスを作成するためには、[[yii\base\Action]] またはその子クラスを拡張して、 +`run()` という名前の public メソッドを実装しなければなりません。 +`run()` メソッドの役割はアクションメソッドのそれと似たようなものです。例えば、 + +```php + + +アクションメソッド、または、スタンドアロンアクションの `run()` メソッドの返り値は、重要な意味を持ちます。 +それは、対応するアクションの結果を表すものです。 + +返り値は、エンドユーザにレスポンスとして送信される [レスポンス](runtime-responses.md) オブジェクトとすることが出来ます。 + +* [[yii\web\Application|ウェブアプリケーション]] では、返り値を、[[yii\web\Response::data]] に割り当てられ、 + さらにレスポンスの本文を表す文字列へと変換される任意のデータとすることも出来ます。 +* [[yii\console\Application|コンソールアプリケーション]] では、返り値をコマンド実行の [[yii\console\Response::exitStatus|終了ステータス]] + を示す整数とすることも出来ます。 + +これまでに示した例においては、アクションの結果はすべて文字列であり、エンドユーザに送信されるレスポンスの本文として扱われるものでした。 +次の例では、アクションがレスポンスオブジェクトを返すことによって、ユーザのブラウザを新しい URL にリダイレクトすることが出来る様子が示されています +([[yii\web\Controller::redirect()|redirect()]] メソッドの返り値はレスポンスオブジェクトです): + +```php +public function actionForward() +{ + // ユーザのブラウザを http://example.com にリダイレクトする + return $this->redirect('http://example.com'); +} +``` + + +### アクションパラメータ + +インラインアクションのアクションメソッドと、スタンドアロンアクションの `run()` メソッドは、 +*アクションパラメータ* と呼ばれる引数を取ることが出来ます。 +パラメータの値はリクエストから取得されます。 +[[yii\web\Application|ウェブアプリケーション]] では、各アクションパラメータの値は `$_GET` からパラメータ名をキーとして読み出されます。 +[[yii\console\Application|コンソールアプリケーション]] では、アクションパラメータはコマンドライン引数に対応します。 + +次の例では、`view` アクション (インラインアクションです) は、二つのパラメータを宣言しています: すなわち、`$id` と `$version` です。 + +```php +namespace app\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + public function actionView($id, $version = null) + { + // ... + } +} +``` + +アクションパラメータは、次のように、さまざまなリクエストに応じて値を投入されます: + +* `http://hostname/index.php?r=post/view&id=123`: `$id` パラメータには `'123'` という値が入れられますが、 + `version` というクエリパラメータが無いので、`$version` は null のままになります。 +* `http://hostname/index.php?r=post/view&id=123&version=2`: `$id` および `$version` パラメータに、それぞれ、 + `'123'` と `'2'` が入ります。 +* `http://hostname/index.php?r=post/view`: 必須の `$id` パラメータがリクエストで提供されていないため、 + [[yii\web\BadRequestHttpException]] 例外が投げられます。 +* `http://hostname/index.php?r=post/view&id[]=123`: `$id` パラメータが予期しない配列値 `['123']` を受け取ろうとするため、 + [[yii\web\BadRequestHttpException]] 例外が投げられます。 + +アクションパラメータに配列値を受け取らせたい場合は、以下のように、パラメータに `array` の型ヒントを付けなければなりません: + +```php +public function actionView(array $id, $version = null) +{ + // ... +} +``` + +このようにすると、リクエストが `http://hostname/index.php?r=post/view&id[]=123` である場合、`$id` パラメータは +`['123']` という値を受け取るようになります。 +リクエストが `http://hostname/index.php?r=post/view&id=123` である場合も、スカラ値 `'123'` が自動的に配列に変換されるため、 +`$id` パラメータは引き続き同じ配列値を受け取ります。 + +上記の例は主としてウェブアプリケーションでのアクションパラメータの動作を示すものです。 +コンソールアプリケーションについては、[コンソールコマンド](tutorial-console.md) の節で更なる詳細を参照してください。 + + +### デフォルトアクション + +すべてのコントローラは、それぞれ、[[yii\base\Controller::defaultAction]] によって規定されるデフォルトアクションを持ちます。 +[ルート](#ids-routes) がコントローラ ID のみを含む場合は、指定されたコントローラのデフォルトアクションがリクエストされたことを意味します。 + +既定では、デフォルトアクションは `index` と設定されます。 +このデフォルト値を変更したい場合は、以下のように、コントローラクラスでこのプロパティをオーバーライドするだけです: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public $defaultAction = 'home'; + + public function actionHome() + { + return $this->render('home'); + } +} +``` + + +## コントローラのライフサイクル + +リクエストを処理するときに、[アプリケーション](structure-applications.md) はリクエストされた [ルート](#routes)に基いてコントローラを作成します。 +そして、次に、コントローラはリクエストに応じるために以下のライフサイクルを経過します: + +1. コントローラが作成され構成された後、[[yii\base\Controller::init()]] メソッドが呼ばれる。 +2. コントローラは、リクエストされたアクション ID に基いて、アクションオブジェクトを作成する: + * アクション ID が指定されていないときは、[[yii\base\Controller::defaultAction|デフォルトアクション ID]] が使われる。 + * アクション ID が [[yii\base\Controller::actions()|アクションマップ]] の中に見つかった場合は、 + スタンドアロンアクションが作成される。 + * アクション ID に合致するアクションメソッドが見つかった場合は、インラインアクションが作成される。 + * アクションが見つからないと、[[yii\base\InvalidRouteException]] 例外が投げられる。 +3. コントローラは、アプリケーション、(コントローラがモジュールに属する場合は) モジュール、そしてコントローラの + `beforeAction()` メソッドをこの順で呼び出す: + * どれか一つの呼び出しが false を返した場合は、残りのまだ呼ばれていない `beforeAction()` はスキップされ、 + アクションの実行はキャンセルされる。 + * 既定では、それぞれの `beforeAction()` メソッドは、ハンドラを取り付けることが出来る `beforeAction` イベントをトリガする。 +4. コントローラがアクションを走らせる: + * リクエストデータが解析されて、アクションパラメータにデータが投入される。 +5. コントローラは、コントローラ、(コントローラがモジュールに属する場合は) モジュール、そしてアプリケーションの + `afterAction()` メソッドをこの順で呼び出す。 + * 既定では、それぞれの `afterAction()` メソッドは、ハンドラを取り付けることが出来る `afterAction` イベントをトリガする。 +6. アプリケーションはアクションの結果を受け取り、それを [レスポンス](runtime-responses.md) に割り当てる。 + + +## 最善の慣行 + +良く設計されたアプリケーションでは、コントローラはたいてい非常に軽いものになり、 +それぞれのアクションは数行のコードしか含まないものになります。 +あなたのコントローラが少々複雑になっている場合、そのことは、通常、コントローラをリファクタして、 +コードの一部を他のクラスに移動すべきことを示すものです。 + +要約すると、コントローラは、 + +* [リクエスト](runtime-requests.md) データにアクセスすることが出来る; +* リクエストデータを使って [モデル](structure-models.md) や他のサービスコンポーネントのメソッドを呼ぶことが出来る; +* [ビュー](structure-views.md) を使ってレスポンスを構成することが出来る; +* リクエストデータを処理するべきではない - それは [モデル](structure-models.md) において処理されるべきである; +* HTML を埋め込むなどの表示に関わるコードは避けるべきである - それは [views](structure-views.md) で行う方が良い。 From c298f980592d08cc1a7c321905b0752655078e53 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sat, 1 Nov 2014 08:23:37 +0900 Subject: [PATCH 027/144] docs/guide-ja/README.md fixed [ci skip] --- docs/guide-ja/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index 2f6db51..97442b4 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -122,9 +122,9 @@ All Rights Reserved. * [概要](caching-overview.md) * [データキャッシュ](caching-data.md) -* [断片キャッシュ](caching-fragment.md) +* [フラグメントキャッシュ](caching-fragment.md) * [ページキャッシュ](caching-page.md) -* [HTTP Caching](caching-http.md) +* [HTTP キャッシュ](caching-http.md) RESTful ウェブサービス From 447808d527ce15c524f8b1be5e5d7f6af2e89b93 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sat, 1 Nov 2014 08:24:02 +0900 Subject: [PATCH 028/144] docs/guide-ja/structure-applications.md fixed [ci skip] --- docs/guide-ja/structure-applications.md | 44 +++++++++++++++------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index f15dd73..d78138b 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -470,8 +470,6 @@ Yii フレームワークを含めて、あなたのアプリケーションに このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。 このプロパティを修正するときは、必ず、Composer の構成もそれに合せて調整してください。 -You may configure this property as a directory or a path [alias](concept-aliases.md). When you modify -this property, make sure you also adjust the Composer configuration accordingly. このパスに簡単にアクセスできるように、Yii は `@vendor` というパスエイリアスを事前に定義しています。 @@ -484,10 +482,8 @@ Yii リリースに含まれているコアコマンドを有効にすべきか ## アプリケーションのイベント -アプリケーションはリクエストを処理するライフサイクルの中でいくつかのイベントを発生させます。 -これらのイベントに対して、下記のようにして、アプリケーションのコンフィギュレーションの中でイベントハンドラを付けることが出来ます。 -An application triggers several events during the lifecycle of handling an request. You may attach event -handlers to these events in application configurations like the following, +アプリケーションはリクエストを処理するライフサイクルの中でいくつかのイベントをトリガします。 +これらのイベントに対して、下記のようにして、アプリケーションのコンフィギュレーションの中でイベントハンドラを取り付けることが出来ます。 ```php [ @@ -499,7 +495,7 @@ handlers to these events in application configurations like the following, `on eventName` という構文の使い方については、[コンフィギュレーション](concept-configurations.md#configuration-format) の節で説明されています。 -別の方法として、アプリケーションのインスタンスが生成された後、[ブートストラップの過程](runtime-bootstrapping.md) の中でイベントハンドラを付けることも出来ます。 +別の方法として、アプリケーションのインスタンスが生成された後、[ブートストラップの過程](runtime-bootstrapping.md) の中でイベントハンドラを取り付けることも出来ます。 例えば、 ```php @@ -510,28 +506,28 @@ handlers to these events in application configurations like the following, ### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] -このイベントは、アプリケーションがリクエストを処理する *前* に発生します。 +このイベントは、アプリケーションがリクエストを処理する *前* にトリガされます。 実際のイベント名は `beforeRequest` です。 -このイベントが発生するときには、アプリケーションのインスタンスは既に構成されて初期化されています。 -ですから、イベントメカニズムを使って、リクエスト処理のプロセスに横槍を入れるカスタムコードを挿入するのには、ちょうど良い場所です。 +このイベントがトリガされるときには、アプリケーションのインスタンスは既に構成されて初期化されています。 +ですから、イベントメカニズムを使って、リクエスト処理のプロセスに干渉するカスタムコードを挿入するのには、ちょうど良い場所です。 例えば、このイベントハンドラの中で、何らかのパラメータに基いて [[yii\base\Application::language]] プロパティを動的にセットすることが出来ます。 ### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] -このイベントは、アプリケーションがリクエストの処理を完了した *後*、レスポンスを送信する *前* に発生します。 +このイベントは、アプリケーションがリクエストの処理を完了した *後*、レスポンスを送信する *前* にトリガされます。 実際のイベント名は `afterRequest` です。 -このイベントが発生するときにはリクエストの処理は完了していますので、この機をとらえて、リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。 +このイベントがトリガされるときにはリクエストの処理は完了していますので、この機をとらえて、リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。 -[[yii\web\Response|response]] コンポーネントも、エンドユーザにレスポンスのコンテンツを送出する間にいくつかのイベントを発生させることに注意してください。 -それらのイベントは、このイベントの *後* に発生します。 +[[yii\web\Response|response]] コンポーネントも、エンドユーザにレスポンスのコンテンツを送出する間にいくつかのイベントをトリガすることに注意してください。 +それらのイベントは、このイベントの *後* にトリガされます。 ### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] -このイベントは、[コントローラアクション](structure-controllers.md) を走らせる *前* に毎回発生します。 +このイベントは、[コントローラアクション](structure-controllers.md) を走らせる *前* に毎回トリガされます。 実際のイベント名は `beforeAction` です。 イベントのパラメータは [[yii\base\ActionEvent]] のインスタンスです。 @@ -550,14 +546,14 @@ handlers to these events in application configurations like the following, ``` 同じ `beforeAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) -からも発生することに注意してください。 -アプリケーションオブジェクトが最初にこのイベントを発生させ、次に (もし有れば) モジュールが、そして最後にコントローラがこのイベントを発生させます。 -イベントハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントは発生しません。 +からもトリガされることに注意してください。 +アプリケーションオブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にコントローラがこのイベントをトリガします。 +イベントハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントはトリガされません。 ### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] -このイベントは、[コントローラアクション](structure-controllers.md) が走った *後* に毎回発生します。 +このイベントは、[コントローラアクション](structure-controllers.md) が走った *後* に毎回トリガされます。 実際のイベント名は `afterAction` です。 イベントのパラメータは [[yii\base\ActionEvent]] のインスタンスです。 @@ -576,9 +572,9 @@ handlers to these events in application configurations like the following, ``` 同じ `afterAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) -からも発生することに注意してください。 -これらのオブジェクトは、`beforeAction` の場合とは逆の順でイベントを発生させます。 -すなわち、コントローラオブジェクトが最初にこのイベントを発生させ、次に (もし有れば) モジュールが、そして最後にアプリケーションがこのイベントを発生させます。 +からもトリガされることに注意してください。 +これらのオブジェクトは、`beforeAction` の場合とは逆の順でイベントをトリガします。 +すなわち、コントローラオブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にアプリケーションがこのイベントをトリガします。 ## アプリケーションのライフサイクル @@ -595,9 +591,9 @@ handlers to these events in application configurations like the following, * [[yii\base\Application::init()|init()]] が呼ばれ、そこから更に、ブートストラップコンポーネントを 走らせるために、[[yii\base\Application::bootstrap()|bootstrap()]] が呼ばれる。 3. エントリスクリプトが [[yii\base\Application::run()]] を呼んで、アプリケーションを走らせる: - * [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] イベントを発生させる。 + * [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] イベントをトリガする。 * リクエストを処理する: リクエストを [ルート](runtime-routing.md) とそれに結び付くパラメータとして解決する; ルートによって指定されたモジュール、コントローラ、および、アクションを作成する; そしてアクションを走らせる。 - * [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] イベントを発生させる。 + * [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] イベントをトリガする。 * エンドユーザにレスポンスを送信する。 4. エントリスクリプトがアプリケーションから終了ステータスを受け取り、リクエストの処理を完了する。 From 30d34155c4f19755c98b1b2b1f5daeb1f9116833 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sat, 1 Nov 2014 08:22:48 +0900 Subject: [PATCH 029/144] Docs guide ja 2014 11 01 docs/guide-ja/structure-controllers.md added [ci skip] docs/guide-ja/README.md fixed [ci skip] docs/guide-ja/structure-applications.md fixed [ci skip] close #5844 --- docs/guide-ja/README.md | 4 +- docs/guide-ja/structure-applications.md | 44 ++-- docs/guide-ja/structure-controllers.md | 453 ++++++++++++++++++++++++++++++++ 3 files changed, 475 insertions(+), 26 deletions(-) create mode 100644 docs/guide-ja/structure-controllers.md diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index 2f6db51..97442b4 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -122,9 +122,9 @@ All Rights Reserved. * [概要](caching-overview.md) * [データキャッシュ](caching-data.md) -* [断片キャッシュ](caching-fragment.md) +* [フラグメントキャッシュ](caching-fragment.md) * [ページキャッシュ](caching-page.md) -* [HTTP Caching](caching-http.md) +* [HTTP キャッシュ](caching-http.md) RESTful ウェブサービス diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index f15dd73..d78138b 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -470,8 +470,6 @@ Yii フレームワークを含めて、あなたのアプリケーションに このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。 このプロパティを修正するときは、必ず、Composer の構成もそれに合せて調整してください。 -You may configure this property as a directory or a path [alias](concept-aliases.md). When you modify -this property, make sure you also adjust the Composer configuration accordingly. このパスに簡単にアクセスできるように、Yii は `@vendor` というパスエイリアスを事前に定義しています。 @@ -484,10 +482,8 @@ Yii リリースに含まれているコアコマンドを有効にすべきか ## アプリケーションのイベント -アプリケーションはリクエストを処理するライフサイクルの中でいくつかのイベントを発生させます。 -これらのイベントに対して、下記のようにして、アプリケーションのコンフィギュレーションの中でイベントハンドラを付けることが出来ます。 -An application triggers several events during the lifecycle of handling an request. You may attach event -handlers to these events in application configurations like the following, +アプリケーションはリクエストを処理するライフサイクルの中でいくつかのイベントをトリガします。 +これらのイベントに対して、下記のようにして、アプリケーションのコンフィギュレーションの中でイベントハンドラを取り付けることが出来ます。 ```php [ @@ -499,7 +495,7 @@ handlers to these events in application configurations like the following, `on eventName` という構文の使い方については、[コンフィギュレーション](concept-configurations.md#configuration-format) の節で説明されています。 -別の方法として、アプリケーションのインスタンスが生成された後、[ブートストラップの過程](runtime-bootstrapping.md) の中でイベントハンドラを付けることも出来ます。 +別の方法として、アプリケーションのインスタンスが生成された後、[ブートストラップの過程](runtime-bootstrapping.md) の中でイベントハンドラを取り付けることも出来ます。 例えば、 ```php @@ -510,28 +506,28 @@ handlers to these events in application configurations like the following, ### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] -このイベントは、アプリケーションがリクエストを処理する *前* に発生します。 +このイベントは、アプリケーションがリクエストを処理する *前* にトリガされます。 実際のイベント名は `beforeRequest` です。 -このイベントが発生するときには、アプリケーションのインスタンスは既に構成されて初期化されています。 -ですから、イベントメカニズムを使って、リクエスト処理のプロセスに横槍を入れるカスタムコードを挿入するのには、ちょうど良い場所です。 +このイベントがトリガされるときには、アプリケーションのインスタンスは既に構成されて初期化されています。 +ですから、イベントメカニズムを使って、リクエスト処理のプロセスに干渉するカスタムコードを挿入するのには、ちょうど良い場所です。 例えば、このイベントハンドラの中で、何らかのパラメータに基いて [[yii\base\Application::language]] プロパティを動的にセットすることが出来ます。 ### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] -このイベントは、アプリケーションがリクエストの処理を完了した *後*、レスポンスを送信する *前* に発生します。 +このイベントは、アプリケーションがリクエストの処理を完了した *後*、レスポンスを送信する *前* にトリガされます。 実際のイベント名は `afterRequest` です。 -このイベントが発生するときにはリクエストの処理は完了していますので、この機をとらえて、リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。 +このイベントがトリガされるときにはリクエストの処理は完了していますので、この機をとらえて、リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。 -[[yii\web\Response|response]] コンポーネントも、エンドユーザにレスポンスのコンテンツを送出する間にいくつかのイベントを発生させることに注意してください。 -それらのイベントは、このイベントの *後* に発生します。 +[[yii\web\Response|response]] コンポーネントも、エンドユーザにレスポンスのコンテンツを送出する間にいくつかのイベントをトリガすることに注意してください。 +それらのイベントは、このイベントの *後* にトリガされます。 ### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] -このイベントは、[コントローラアクション](structure-controllers.md) を走らせる *前* に毎回発生します。 +このイベントは、[コントローラアクション](structure-controllers.md) を走らせる *前* に毎回トリガされます。 実際のイベント名は `beforeAction` です。 イベントのパラメータは [[yii\base\ActionEvent]] のインスタンスです。 @@ -550,14 +546,14 @@ handlers to these events in application configurations like the following, ``` 同じ `beforeAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) -からも発生することに注意してください。 -アプリケーションオブジェクトが最初にこのイベントを発生させ、次に (もし有れば) モジュールが、そして最後にコントローラがこのイベントを発生させます。 -イベントハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントは発生しません。 +からもトリガされることに注意してください。 +アプリケーションオブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にコントローラがこのイベントをトリガします。 +イベントハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントはトリガされません。 ### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] -このイベントは、[コントローラアクション](structure-controllers.md) が走った *後* に毎回発生します。 +このイベントは、[コントローラアクション](structure-controllers.md) が走った *後* に毎回トリガされます。 実際のイベント名は `afterAction` です。 イベントのパラメータは [[yii\base\ActionEvent]] のインスタンスです。 @@ -576,9 +572,9 @@ handlers to these events in application configurations like the following, ``` 同じ `afterAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) -からも発生することに注意してください。 -これらのオブジェクトは、`beforeAction` の場合とは逆の順でイベントを発生させます。 -すなわち、コントローラオブジェクトが最初にこのイベントを発生させ、次に (もし有れば) モジュールが、そして最後にアプリケーションがこのイベントを発生させます。 +からもトリガされることに注意してください。 +これらのオブジェクトは、`beforeAction` の場合とは逆の順でイベントをトリガします。 +すなわち、コントローラオブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にアプリケーションがこのイベントをトリガします。 ## アプリケーションのライフサイクル @@ -595,9 +591,9 @@ handlers to these events in application configurations like the following, * [[yii\base\Application::init()|init()]] が呼ばれ、そこから更に、ブートストラップコンポーネントを 走らせるために、[[yii\base\Application::bootstrap()|bootstrap()]] が呼ばれる。 3. エントリスクリプトが [[yii\base\Application::run()]] を呼んで、アプリケーションを走らせる: - * [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] イベントを発生させる。 + * [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] イベントをトリガする。 * リクエストを処理する: リクエストを [ルート](runtime-routing.md) とそれに結び付くパラメータとして解決する; ルートによって指定されたモジュール、コントローラ、および、アクションを作成する; そしてアクションを走らせる。 - * [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] イベントを発生させる。 + * [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] イベントをトリガする。 * エンドユーザにレスポンスを送信する。 4. エントリスクリプトがアプリケーションから終了ステータスを受け取り、リクエストの処理を完了する。 diff --git a/docs/guide-ja/structure-controllers.md b/docs/guide-ja/structure-controllers.md new file mode 100644 index 0000000..8c2d666 --- /dev/null +++ b/docs/guide-ja/structure-controllers.md @@ -0,0 +1,453 @@ +コントローラ +============ + +コントローラは [MVC](http://ja.wikipedia.org/wiki/Model_View_Controller) アーキテクチャの一部を成すものです。 +これは [[yii\base\Controller]] を拡張したクラスのオブジェクトであり、リクエストの処理とレスポンスの生成について責任を負うものです。 +具体的には、[アプリケーション](structure-applications.md) から制御を引き継いだ後、コントローラは入ってきたリクエストのデータを分析し、 +それを [モデル](structure-models.md) に引き渡して、モデルが生成した結果を [ビュー](structure-views.md) に投入し、 +最終的に外に出て行くレスポンスを生成します。 + + +## アクション + +コントローラは *アクション* から構成されます。 +アクションは、エンドユーザがアドレスを指定して実行をリクエストできる最も基本的な構成単位です。 +コントローラは一つまたは複数のアクションを持ち得ます。 + +次の例は、`view` と `create` という二つのアクションを持つ `post` コントローラを示すものです: + +```php +namespace app\controllers; + +use Yii; +use app\models\Post; +use yii\web\Controller; +use yii\web\NotFoundHttpException; + +class PostController extends Controller +{ + public function actionView($id) + { + $model = Post::findOne($id); + if ($model === null) { + throw new NotFoundHttpException; + } + + return $this->render('view', [ + 'model' => $model, + ]); + } + + public function actionCreate() + { + $model = new Post; + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', 'id' => $model->id]); + } else { + return $this->render('create', [ + 'model' => $model, + ]); + } + } +} +``` + +`view` アクション (`actionView()` メソッドで定義されます) において、 +コードは最初に、リクエストされたモデルの ID に従って [モデル](structure-models.md) を読み出します。 +モデルの読み出しが成功したときは、`view` という名前の [ビュー](structure-views.md) を使ってモデルを表示します。 +失敗したときは例外を投げます。 + +`create` アクション (`actionCreate()` メソッドで定義されます) においても、コードは似たようなものです。 +最初にリクエストデータを使って [モデル](structure-models.md) にデータを投入して、モデルを保存することを試みます。 +両方が成功したときは、新しく作成されたモデルの ID を使って `view` アクションにブラウザをリダイレクトします。 +どちらかが失敗したときは、ユーザが必要なデータを入力できるようにするための `create` ビューを表示します。 + + +## ルート + +エンドユーザは、いわゆる *ルート* によって、アクションのアドレスを指定します。 +ルートは、次の部分からなる文字列です。 + +* モジュール ID: この部分は、コントローラがアプリケーションではなく [モジュール](structure-modules.md) に属する場合にのみ存在します; +* コントローラ ID: 同じアプリケーション (または、コントローラがモジュールに属する場合は、同じモジュール) + に属する全てのコントローラの中から、特定のコントローラを指定するユニークな文字列; +* アクション ID: 同じコントローラに属する全てのアクションの中から、特定のアクションを指定するユニークな文字列。 + +ルートは次の形式を取ります: + +``` +ControllerID/ActionID +``` + +または、コントローラがモジュールに属する場合は、次の形式を取ります: + +```php +ModuleID/ControllerID/ActionID +``` + +ですから、ユーザが `http://hostname/index.php?r=site/index` という URL でリクエストをした場合は、`site` コントローラの中の `index` アクションが実行されます。 +どのようにしてルートがアクションとして解決されるかについて、更なる詳細は [ルーティング](runtime-routing.md) の節を参照してください。 + + +## コントローラを作成する + +[[yii\web\Application|ウェブアプリケーション]] では、コントローラは [[yii\web\Controller]] またはその子クラスから派生させるべきです。 +同様に、[[yii\console\Application|コンソールアプリケーション]] では、コントローラは [[yii\console\Controller]] またはその子クラスから派生させるべきです。 +次のコードは `site` コントローラを定義するものです: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ +} +``` + + +### コントローラの ID + +通常、コントローラは特定の型のリソースに関するリクエストを処理するように設計されます。 +この理由により、たいていはコントローラが処理するリソースの型を示す名詞をコントローラの ID として使います。 +例えば、記事データを処理するコントローラの ID としては、`article` を使うことが出来ます。 + +既定では、コントローラの ID は、以下の文字のみを含むべきものです: すなわち、小文字の英字、数字、アンダースコア、ダッシュ、 +および、フォワードスラッシュ。 +例えば、`article` と `post-comment` はともに有効なコントローラの ID ですが、`article?`、`PostComment`、`admin\post` は有効ではありません。 + +コントローラの ID は、サブディレクトリの接頭辞を含んでも構いません。例えば、`admin/article` は、 +[[yii\base\Application::controllerNamespace|コントローラ名前空間]] の下の `admin` サブディレクトリにある `article` コントローラを表します。 +サブディレクトリの接頭辞として有効な文字は以下を含みます: 小文字または大文字の英字、数字、アンダースコア、そして、 +フォワードスラッシュ。フォワードスラッシュは、複数レベルのサブディレクトリの区切り文字として使われます (例えば、`panels/admin`)。 + + +### コントローラクラスの命名規則 + +コントローラクラスの名前は下記の規則に従ってコントローラの ID から導出することが出来ます: + +* ダッシュで区切られた各単語の最初の文字を大文字に変える。コントローラ ID がスラッシュを含む場合、 + この規則は ID の最後のスラッシュの後ろの部分にのみ適用されることに注意。 +* ダッシュを削除し、フォワードスラッシュを全てバックワードスラッシュに置き換える。 +* 接尾辞 `Controller` を追加する。 +* そして、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] を頭に付ける。 + +以下は、[[yii\base\Application::controllerNamespace|コントローラ名前空間]] がデフォルト値 `app\controllers` を取っていると +仮定したときの、いくつかの例です: + +* `article` から `app\controllers\ArticleController` が導出される; +* `post-comment` から `app\controllers\PostCommentController` が導出される; +* `admin/post-comment` から `app\controllers\admin\PostCommentController` が導出される; +* `adminPanels/post-comment` から `app\controllers\adminPanels\PostCommentController` が導出される。 + +コントローラクラスは [オートロード可能](concept-autoloading.md) でなければなりません。この理由により、 +上記の例の `aritcle` コントローラクラスは [エイリアス](concept-aliases.md) が `@app/controllers/ArticleController.php` である +ファイルに保存されるべきものとなります。一方、`admin/post2-comment` コントローラは `@app/controllers/admin/Post2CommentController.php` +というエイリアスのファイルに保存されるべきものとなります。 + +> Info|情報: 最後の例である `admin/post2-comment` は、どうすれば [[yii\base\Application::controllerNamespace|コントローラ名前空間]] の + サブディレクトリにコントローラを置くことが出来るかを示しています。 + この方法は、コントローラをいくつかのカテゴリに分けて組織したい、けれども [モジュール](structure-modules.md) は使いたくない、 + という場合に役立ちます。 + + +### コントローラマップ + +[[yii\base\Application::controllerMap|コントローラマップ]] を構成すると、上で述べたコントローラの ID とクラス名の制約を乗り越えることが出来ます。 +これは、主として、クラス名に対する制御が及ばないサードパーティのコントローラを使おうとする場合に有用です。 + +[[yii\base\Application::controllerMap|コントローラマップ]] は [アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の中で、次のように構成することが出来ます: + +```php +[ + 'controllerMap' => [ + // クラス名を使って "account" コントローラを宣言する + 'account' => 'app\controllers\UserController', + + // コンフィギュレーション配列を使って "article" コントローラを宣言する + 'article' => [ + 'class' => 'app\controllers\PostController', + 'enableCsrfValidation' => false, + ], + ], +] +``` + + +### デフォルトコントローラ + +全てのアプリケーションは、それぞれ、[[yii\base\Application::defaultRoute]] プロパティを通じて規定されるデフォルトコントローラを持ちます。 +リクエストが [ルート](#ids-routes) を指定しない場合、このプロパティによって指定されたルートが使われます。 +[[yii\web\Application|ウェブアプリケーション]] では、この値は `'site'` であり、一方、[[yii\console\Application|コンソールアプリケーション]] では、`help` です。 +従って、URL が `http://hostname/index.php` である場合は、`site` コントローラがリクエストを処理することになります。 + +次のように [アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) を構成して、デフォルトコントローラを変更することが出来ます: + +```php +[ + 'defaultRoute' => 'main', +] +``` + + +## アクションを作成する + +アクションの作成は、コントローラクラスの中にいわゆる *アクションメソッド* を定義するだけの簡単なことです。 +アクションメソッドとは、`action` という語で始まる名前を持つ *public* メソッドのことです。 +アクションメソッドの返り値がエンドユーザに送信されるレスポンスデータを表します。 +次のコードは、`index` と `hello-world` という二つのアクションを定義するものです: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public function actionIndex() + { + return $this->render('index'); + } + + public function actionHelloWorld() + { + return 'Hello World'; + } +} +``` + + +### アクション ID + +アクションは、たいてい、あるリソースについて特定の操作を実行するように設計されます。この理由により、 +アクション ID は、通常、`view`、`update` などのような動詞になります。 + +既定では、アクション ID は次の文字のみを含むべきものです: すなわち、小文字の英字、数字、アンダースコア、そして、ダッシュ。 +アクション ID の中のダッシュは単語を分けるために使われます。例えば、 +`view`、`update2`、`comment-post` は全て有効なアクション ID ですが、`view?`、`Update` は有効ではありません。 + +アクションは二つの方法で作成することが出来ます: すなわち、インラインアクションとスタンドアロンアクションです。 +インラインアクションはコントローラクラスのメソッドとして定義されるものであり、一方、スタンドアロンアクションは +[[yii\base\Action]] またはその子クラスから派生させたクラスです。 +インラインアクションは作成するのにより少ない労力を要し、アクションを再利用する意図がない場合によく推奨されます。 +もう一方で、スタンドアロンアクションは、主として、さまざまなコントローラの中で使われることや、 +[エクステンション](structure-extensions.md) として再配布されることを意図して作成されます。 + + +### インラインアクション + +インラインアクションは、たった今説明したように、アクションメソッドとして定義されるアクションを指します。 + +アクションメソッドの名前は、次の基準に従って、アクション ID から導出されます: + +* アクション ID に含まれる各単語の最初の文字を大文字に変換する; +* ダッシュを削除する; +* 前置辞 `action` を前に付ける。 + +例えば、`index` は `actionIndex` となり、`hello-world` は `actionHelloWorld` となります。 + +> Note|注意: アクションメソッドの名前は、*大文字と小文字を区別* します。`ActionIndex` という名前のメソッドがあっても、 + それはアクションメソッドとは見なされず、結果として、`index` アクションに対するリクエストは例外に帰結します。 + アクションメソッドが public でなければならない事にも注意してください。private や protected なメソッドが + インラインアクションを定義することはありません。 + + +アクションは、作成するのにほとんど労力を要さないため、たいていの場合、インラインアクションとして定義されます。 +しかしながら、同じアクションを別の場所で再利用する計画があったり、また、アクションを再配布したいと思ったりする場合は、 +*スタンドアロンアクション* として定義することを考慮すべきです。 + + +### スタンドアロンアクション + +スタンドアロンアクションは、[[yii\base\Action]] またはその子クラスを拡張したクラスとして定義されるものです。 +例えば、Yii のリリースに [[yii\web\ViewAction]] と [[yii\web\ErrorAction]] が含まれていますが、これらは両方とも +スタンドアロンアクションです。 + +スタンドアロンアクションを使用するためには、下記のように、コントローラの [[yii\base\Controller::actions()]] メソッドを +オーバーライドして、スタンドアロンアクションを *アクションマップ* の中で宣言します: + +```php +public function actions() +{ + return [ + // クラス名を使って "error" アクションを宣言する + 'error' => 'yii\web\ErrorAction', + + // コンフィギュレーション配列を使って "view" アクションを宣言する + 'view' => [ + 'class' => 'yii\web\ViewAction', + 'viewPrefix' => '', + ], + ]; +} +``` + +見ると分かるように、`actions()` メソッドは、キーがアクション ID であり、値が対応するアクションのクラス名または +[コンフィギュレーション](concept-configurations.md) である配列を返すべきものです。 +インラインアクションと違って、スタンドアロンアクションのアクション ID は、`actions()` メソッドにおいて宣言される +限りにおいて、任意の文字を含むことが出来ます。 + + +スタンドアロンアクションクラスを作成するためには、[[yii\base\Action]] またはその子クラスを拡張して、 +`run()` という名前の public メソッドを実装しなければなりません。 +`run()` メソッドの役割はアクションメソッドのそれと似たようなものです。例えば、 + +```php + + +アクションメソッド、または、スタンドアロンアクションの `run()` メソッドの返り値は、重要な意味を持ちます。 +それは、対応するアクションの結果を表すものです。 + +返り値は、エンドユーザにレスポンスとして送信される [レスポンス](runtime-responses.md) オブジェクトとすることが出来ます。 + +* [[yii\web\Application|ウェブアプリケーション]] では、返り値を、[[yii\web\Response::data]] に割り当てられ、 + さらにレスポンスの本文を表す文字列へと変換される任意のデータとすることも出来ます。 +* [[yii\console\Application|コンソールアプリケーション]] では、返り値をコマンド実行の [[yii\console\Response::exitStatus|終了ステータス]] + を示す整数とすることも出来ます。 + +これまでに示した例においては、アクションの結果はすべて文字列であり、エンドユーザに送信されるレスポンスの本文として扱われるものでした。 +次の例では、アクションがレスポンスオブジェクトを返すことによって、ユーザのブラウザを新しい URL にリダイレクトすることが出来る様子が示されています +([[yii\web\Controller::redirect()|redirect()]] メソッドの返り値はレスポンスオブジェクトです): + +```php +public function actionForward() +{ + // ユーザのブラウザを http://example.com にリダイレクトする + return $this->redirect('http://example.com'); +} +``` + + +### アクションパラメータ + +インラインアクションのアクションメソッドと、スタンドアロンアクションの `run()` メソッドは、 +*アクションパラメータ* と呼ばれる引数を取ることが出来ます。 +パラメータの値はリクエストから取得されます。 +[[yii\web\Application|ウェブアプリケーション]] では、各アクションパラメータの値は `$_GET` からパラメータ名をキーとして読み出されます。 +[[yii\console\Application|コンソールアプリケーション]] では、アクションパラメータはコマンドライン引数に対応します。 + +次の例では、`view` アクション (インラインアクションです) は、二つのパラメータを宣言しています: すなわち、`$id` と `$version` です。 + +```php +namespace app\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + public function actionView($id, $version = null) + { + // ... + } +} +``` + +アクションパラメータは、次のように、さまざまなリクエストに応じて値を投入されます: + +* `http://hostname/index.php?r=post/view&id=123`: `$id` パラメータには `'123'` という値が入れられますが、 + `version` というクエリパラメータが無いので、`$version` は null のままになります。 +* `http://hostname/index.php?r=post/view&id=123&version=2`: `$id` および `$version` パラメータに、それぞれ、 + `'123'` と `'2'` が入ります。 +* `http://hostname/index.php?r=post/view`: 必須の `$id` パラメータがリクエストで提供されていないため、 + [[yii\web\BadRequestHttpException]] 例外が投げられます。 +* `http://hostname/index.php?r=post/view&id[]=123`: `$id` パラメータが予期しない配列値 `['123']` を受け取ろうとするため、 + [[yii\web\BadRequestHttpException]] 例外が投げられます。 + +アクションパラメータに配列値を受け取らせたい場合は、以下のように、パラメータに `array` の型ヒントを付けなければなりません: + +```php +public function actionView(array $id, $version = null) +{ + // ... +} +``` + +このようにすると、リクエストが `http://hostname/index.php?r=post/view&id[]=123` である場合、`$id` パラメータは +`['123']` という値を受け取るようになります。 +リクエストが `http://hostname/index.php?r=post/view&id=123` である場合も、スカラ値 `'123'` が自動的に配列に変換されるため、 +`$id` パラメータは引き続き同じ配列値を受け取ります。 + +上記の例は主としてウェブアプリケーションでのアクションパラメータの動作を示すものです。 +コンソールアプリケーションについては、[コンソールコマンド](tutorial-console.md) の節で更なる詳細を参照してください。 + + +### デフォルトアクション + +すべてのコントローラは、それぞれ、[[yii\base\Controller::defaultAction]] によって規定されるデフォルトアクションを持ちます。 +[ルート](#ids-routes) がコントローラ ID のみを含む場合は、指定されたコントローラのデフォルトアクションがリクエストされたことを意味します。 + +既定では、デフォルトアクションは `index` と設定されます。 +このデフォルト値を変更したい場合は、以下のように、コントローラクラスでこのプロパティをオーバーライドするだけです: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public $defaultAction = 'home'; + + public function actionHome() + { + return $this->render('home'); + } +} +``` + + +## コントローラのライフサイクル + +リクエストを処理するときに、[アプリケーション](structure-applications.md) はリクエストされた [ルート](#routes)に基いてコントローラを作成します。 +そして、次に、コントローラはリクエストに応じるために以下のライフサイクルを経過します: + +1. コントローラが作成され構成された後、[[yii\base\Controller::init()]] メソッドが呼ばれる。 +2. コントローラは、リクエストされたアクション ID に基いて、アクションオブジェクトを作成する: + * アクション ID が指定されていないときは、[[yii\base\Controller::defaultAction|デフォルトアクション ID]] が使われる。 + * アクション ID が [[yii\base\Controller::actions()|アクションマップ]] の中に見つかった場合は、 + スタンドアロンアクションが作成される。 + * アクション ID に合致するアクションメソッドが見つかった場合は、インラインアクションが作成される。 + * アクションが見つからないと、[[yii\base\InvalidRouteException]] 例外が投げられる。 +3. コントローラは、アプリケーション、(コントローラがモジュールに属する場合は) モジュール、そしてコントローラの + `beforeAction()` メソッドをこの順で呼び出す: + * どれか一つの呼び出しが false を返した場合は、残りのまだ呼ばれていない `beforeAction()` はスキップされ、 + アクションの実行はキャンセルされる。 + * 既定では、それぞれの `beforeAction()` メソッドは、ハンドラを取り付けることが出来る `beforeAction` イベントをトリガする。 +4. コントローラがアクションを走らせる: + * リクエストデータが解析されて、アクションパラメータにデータが投入される。 +5. コントローラは、コントローラ、(コントローラがモジュールに属する場合は) モジュール、そしてアプリケーションの + `afterAction()` メソッドをこの順で呼び出す。 + * 既定では、それぞれの `afterAction()` メソッドは、ハンドラを取り付けることが出来る `afterAction` イベントをトリガする。 +6. アプリケーションはアクションの結果を受け取り、それを [レスポンス](runtime-responses.md) に割り当てる。 + + +## 最善の慣行 + +良く設計されたアプリケーションでは、コントローラはたいてい非常に軽いものになり、 +それぞれのアクションは数行のコードしか含まないものになります。 +あなたのコントローラが少々複雑になっている場合、そのことは、通常、コントローラをリファクタして、 +コードの一部を他のクラスに移動すべきことを示すものです。 + +要約すると、コントローラは、 + +* [リクエスト](runtime-requests.md) データにアクセスすることが出来る; +* リクエストデータを使って [モデル](structure-models.md) や他のサービスコンポーネントのメソッドを呼ぶことが出来る; +* [ビュー](structure-views.md) を使ってレスポンスを構成することが出来る; +* リクエストデータを処理するべきではない - それは [モデル](structure-models.md) において処理されるべきである; +* HTML を埋め込むなどの表示に関わるコードは避けるべきである - それは [views](structure-views.md) で行う方が良い。 From a094c739c8c27a86e0e40fbe67228b675495358c Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 31 Oct 2014 23:01:38 -0400 Subject: [PATCH 030/144] minor doc fix [skip ci] --- docs/guide/rest-routing.md | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/docs/guide/rest-routing.md b/docs/guide/rest-routing.md index 93852a4..95e134a 100644 --- a/docs/guide/rest-routing.md +++ b/docs/guide/rest-routing.md @@ -70,9 +70,23 @@ For example, to support a new action `search` by the endpoint `GET /users/search 'extraPatterns' => [ 'GET search' => 'search', ], +] ``` -You may have noticed that the controller ID `user` appears in plural form as `users` in the endpoints. -This is because [[yii\rest\UrlRule]] automatically pluralizes controller IDs for them to use in endpoints. -You may disable this behavior by setting [[yii\rest\UrlRule::pluralize]] to be false, or if you want -to use some special names you may configure the [[yii\rest\UrlRule::controller]] property. Note that the pluralization of RESTful endpoints does not always simply add an "s" to the end of the controller id. A controller whose ID ends in "x", for example "BoxController" (with ID `box`), has RESTful endpoints pluralized to `boxes` by [[yii\rest\UrlRule]]. +You may have noticed that the controller ID `user` appears in plural form as `users` in the endpoint URLs. +This is because [[yii\rest\UrlRule]] automatically pluralizes controller IDs when creating child URL rules. +You may disable this behavior by setting [[yii\rest\UrlRule::pluralize]] to be false. + +> Info: The pluralization of controller IDs is done by [[yii\helpers\Inflector::pluralize()]]. The method respects + special pluralization rules. For example, the word `box` will be pluralized as `boxes` instead of `boxs`. + +In case when the automatic pluralization does not meet your requirement, you may also configure the +[[yii\rest\UrlRule::controller]] property to explicitly specify how to map a name used in endpoint URLs to +a controller ID. For example, the following code maps the name `u` to the controller ID `user`. + +```php +[ + 'class' => 'yii\rest\UrlRule', + 'controller' => ['u' => 'user'], +] +``` From 9dcfd350ee3781561d9c1ff35be1a44fb16b867d Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sat, 1 Nov 2014 18:51:11 +0900 Subject: [PATCH 031/144] guide-ja MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs/guide-ja/* word fixed - 「基いて」を「基づいて」に修正 [ci skip] docs/guide-ja/structure-models.md added [ci skip] close #5848 --- docs/guide-ja/intro-yii.md | 2 +- docs/guide-ja/structure-applications.md | 4 +- docs/guide-ja/structure-controllers.md | 2 +- docs/guide-ja/structure-models.md | 504 ++++++++++++++++++++++++++++++++ 4 files changed, 508 insertions(+), 4 deletions(-) create mode 100644 docs/guide-ja/structure-models.md diff --git a/docs/guide-ja/intro-yii.md b/docs/guide-ja/intro-yii.md index fd1adc8..800d859 100644 --- a/docs/guide-ja/intro-yii.md +++ b/docs/guide-ja/intro-yii.md @@ -19,7 +19,7 @@ Yii を他のフレームワークと比べるとどうか? あなたが既に他のフレームワークに親しんでいる場合は、Yii を比較するとどうなるのかを知りたいと思うでしょう: -- ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) デザインパターンを実装し、このパターンに基いたコードの組織化を促進しています。 +- ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) デザインパターンを実装し、このパターンに基づいたコードの組織化を促進しています。 - Yii は、コードはシンプルかつエレガントに書かれるべきである、という哲学を採用しています。 Yii は、何らかのデザインパターンを厳密に守ることを主たる目的として大袈裟な設計をすることは、決してしようとしません。 - Yii は、検証済みで直ちに使える多数の機能を提供するフル装備のフレームワークです: diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index d78138b..6e4d525 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -215,7 +215,7 @@ if (YII_ENV_DEV) { #### [[yii\base\Application::controllerMap|controllerMap]] このプロパティは、コントローラ ID を任意のコントローラクラスに割り付けることを可能にするものです。 -既定では、Yii は [規約](#controllerNamespace) に基いてコントローラ ID をコントローラクラスに割り付けます +既定では、Yii は [規約](#controllerNamespace) に基づいてコントローラ ID をコントローラクラスに割り付けます (例えば、`post` という ID は `app\controllers\PostController` に割り付けられます)。 このプロパティを構成することによって、特定のコントローラに対する規約を破ることが出来ます。 下記の例では、`account` は `app\controllers\UserController` に割り付けられ、 @@ -511,7 +511,7 @@ Yii リリースに含まれているコアコマンドを有効にすべきか このイベントがトリガされるときには、アプリケーションのインスタンスは既に構成されて初期化されています。 ですから、イベントメカニズムを使って、リクエスト処理のプロセスに干渉するカスタムコードを挿入するのには、ちょうど良い場所です。 -例えば、このイベントハンドラの中で、何らかのパラメータに基いて [[yii\base\Application::language]] プロパティを動的にセットすることが出来ます。 +例えば、このイベントハンドラの中で、何らかのパラメータに基づいて [[yii\base\Application::language]] プロパティを動的にセットすることが出来ます。 ### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] diff --git a/docs/guide-ja/structure-controllers.md b/docs/guide-ja/structure-controllers.md index 8c2d666..c199b67 100644 --- a/docs/guide-ja/structure-controllers.md +++ b/docs/guide-ja/structure-controllers.md @@ -450,4 +450,4 @@ class SiteController extends Controller * リクエストデータを使って [モデル](structure-models.md) や他のサービスコンポーネントのメソッドを呼ぶことが出来る; * [ビュー](structure-views.md) を使ってレスポンスを構成することが出来る; * リクエストデータを処理するべきではない - それは [モデル](structure-models.md) において処理されるべきである; -* HTML を埋め込むなどの表示に関わるコードは避けるべきである - それは [views](structure-views.md) で行う方が良い。 +* HTML を埋め込むなどの表示に関わるコードは避けるべきである - それは [ビュー](structure-views.md) で行う方が良い。 diff --git a/docs/guide-ja/structure-models.md b/docs/guide-ja/structure-models.md new file mode 100644 index 0000000..5b62910 --- /dev/null +++ b/docs/guide-ja/structure-models.md @@ -0,0 +1,504 @@ +モデル +====== + +モデルは [MVC](http://ja.wikipedia.org/wiki/Model_View_Controller) アーキテクチャの一部を成すものです。 +これは、業務のデータ、規則、ロジックを表現するオブジェクトです。 + +モデルクラスは、[[yii\base\Model]] またはその子クラスを拡張することによって作成することが出来ます。 +基底クラス [[yii\base\Model]] は数多くの有用な機能をサポートしています。 + +* [属性](#attributes): 業務のデータを表現し、通常のオブジェクトプロパティや配列要素のようにアクセス出来る。 +* [属性のラベル](#attribute-labels): 属性の表示ラベルを規定する。 +* [一括代入](#massive-assignment): 一回のステップで複数の属性にデータを投入することをサポートしている。 +* [検証規則](#validation-rules): 宣言された検証規則に基いて入力されたデータを確認する。 +* [データのエクスポート](#data-exporting): カスタマイズ可能な書式を使ってモデルのデータを配列の形式にエクスポートすることが出来る。 + +`Model` クラスは、[アクティブレコード](db-active-record.md) のような、更に高度なモデルの基底クラスでもあります。 +そういう高度なモデルについての詳細は、関連するドキュメントを参照してください。 + +> Info|情報: あなたのモデルクラスの基底クラスとして [[yii\base\Model]] を使うことは必須の条件ではありません。 + しかしながら、Yii のコンポーネントの多くが [[yii\base\Model]] をサポートするように作られていますので、 + 通常は [[yii\base\Model]] がモデルの基底クラスとして推奨されます。 + + +## 属性 + +モデルは業務のデータを *属性* の形式で表現します。 +全ての属性はそれぞれパブリックにアクセス可能なモデルのプロパティと同様なものです。 +メソッド [[yii\base\Model::attributes()]] が、モデルがどのような属性を持つかを規定します。 + +属性に対しては、通常のオブジェクトプロパティにアクセスするのと同じようにして、アクセスすることが出来ます。 + +```php +$model = new \app\models\ContactForm; + +// "name" は ContactForm の属性 +$model->name = 'example'; +echo $model->name; +``` + +また、配列の要素にアクセスするようして、属性にアクセスすることも出来ます。 +これは、[[yii\base\Model]] が [ArrayAccess インターフェイス](http://php.net/manual/ja/class.arrayaccess.php) と [ArrayIterator クラス](http://jp2.php.net/manual/ja/class.arrayiterator.php) をサポートしているおかげです。 + +```php +$model = new \app\models\ContactForm; + +// 配列要素のように属性にアクセスする +$model['name'] = 'example'; +echo $model['name']; + +// 属性に反復アクセスする +foreach ($model as $name => $value) { + echo "$name: $value\n"; +} +``` + + +### 属性を定義する + +あなたのモデルが [[yii\base\Model]] を直接に拡張するものである場合、既定によって、全ての *static でない public な* メンバ変数は属性となります。 +例えば、次に示す `ContactForm` モデルは4つの属性を持ちます: すなわち、`name`、`email`、`subject`、そして、`body` です。 +この `ContactForm` モデルは、HTML フォームから受け取る入力データを表現するために使われます。 + +```php +namespace app\models; + +use yii\base\Model; + +class ContactForm extends Model +{ + public $name; + public $email; + public $subject; + public $body; +} +``` + + +[[yii\base\Model::attributes()]] をオーバーライドして、属性を異なる方法で定義することが出来ます。 +このメソッドはモデルの中の属性の名前を返さなくてはなりません。 +例えば、[[yii\db\ActiveRecord]] はそのようにして、関連付けられたデータベーステーブルのコラム名を属性の名前として返しています。 +これと同時に `__get()` や `__set()` などのマジックメソッドをオーバーライドして、 +属性が通常のオブジェクトプロパティと同じようにアクセス出来るようにする必要があるかもしれないことに注意してください。 + + +### 属性のラベル + +属性の値を表示したり、入力してもらったりするときに、属性と関連付けられたラベルを表示する必要があることがよくあります。 +例えば、`firstName` という名前の属性を考えたとき、入力フォームやエラーメッセージのような箇所でエンドユーザに表示するときは、もっとユーザフレンドリーな `First Name` というラベルを表示したいと思うでしょう。 + +[[yii\base\Model::getAttributeLabel()]] を呼ぶことによって属性のラベルを得ることが出来ます。例えば、 + +```php +$model = new \app\models\ContactForm; + +// "Name" を表示する +echo $model->getAttributeLabel('name'); +``` + +既定では、属性のラベルは属性の名前から自動的に生成されます。 +ラベルの生成は [[yii\base\Model::generateAttributeLabel()]] というメソッドによって行われます。 +このメソッドは、キャメルケースの変数名を複数の単語に分割し、各単語の最初の文字を大文字にします。 +例えば、`username` は `Username` となり、`firstName` は `First Name` となります。 + +自動的に生成されるラベルを使用したくない場合は、[[yii\base\Model::attributeLabels()]] をオーバーライドして、 +属性のラベルを明示的に宣言することが出来ます。例えば、 + +```php +namespace app\models; + +use yii\base\Model; + +class ContactForm extends Model +{ + public $name; + public $email; + public $subject; + public $body; + + public function attributeLabels() + { + return [ + 'name' => 'Your name', + 'email' => 'Your email address', + 'subject' => 'Subject', + 'body' => 'Content', + ]; + } +} +``` + +複数の言語をサポートするアプリケーションでは、属性のラベルを翻訳したいと思うでしょう。 +これも、以下のように、[[yii\base\Model::attributeLabels()|attributeLabels()]] の中で行うことが出来ます: + +```php +public function attributeLabels() +{ + return [ + 'name' => \Yii::t('app', 'Your name'), + 'email' => \Yii::t('app', 'Your email address'), + 'subject' => \Yii::t('app', 'Subject'), + 'body' => \Yii::t('app', 'Content'), + ]; +} +``` + +さらに進んで、条件に従って属性のラベルを定義しても構いません。例えば、モデルが使用される +[シナリオ](#scenarios) に基づいて、同じ属性に対して違うラベルを返すことことが出来ます。 + +> Info|情報: 厳密に言えば、属性のラベルは [ビュー](structure-views.md) の一部を成すものです。 + しかし、たいていの場合、モデルの中でラベルを宣言する方が便利が良く、 + 結果としてクリーンで再利用可能なコードになります。 + + +## シナリオ + +モデルはさまざまに異なる *シナリオ* で使用されます。 +例えば、`User` モデルはユーザログインの入力を収集するために使われますが、同時に、ユーザ登録の目的でも使われます。 +異なるシナリオの下では、モデルが使用する業務のルールとロジックも異なるでしょう。 +例えば、`email` 属性はユーザ登録の際には必須とされるかも知れませんが、ログインの際にはそうではないでしょう。 + +モデルは [[yii\base\Model::scenario]] プロパティを使って、自身が使われているシナリオを追跡します。 +既定では、モデルは `default` という単一のシナリオのみをサポートします。 +次のコードは、モデルのシナリオを設定する二つの方法を示すものです: + +```php +// プロパティとしてシナリオをセットする +$model = new User; +$model->scenario = 'login'; + +// シナリオはコンフィギュレーションでセットされる +$model = new User(['scenario' => 'login']); +``` + +既定では、モデルによってサポートされるシナリオは、モデルで宣言されている [検証規則](#validation-rules) によって決定されます。 +しかし、次のように、[[yii\base\Model::scenarios()]] メソッドをオーバーライドして、この動作をカスタマイズすることが出来ます: + +```php +namespace app\models; + +use yii\db\ActiveRecord; + +class User extends ActiveRecord +{ + public function scenarios() + { + return [ + 'login' => ['username', 'password'], + 'register' => ['username', 'email', 'password'], + ]; + } +} +``` + +> Info|情報: 上記の例と後続の例では、モデルクラスは [[yii\db\ActiveRecord]] を拡張するものとなっています。 + というのは、複数のシナリオの使用は、通常、[アクティブレコード](db-active-record.md) クラスで発生するからです。 + +`seanarios()` メソッドは、キーがシナリオの名前であり、値が対応する *アクティブな属性* である配列を返します。 +アクティブな属性とは、[一括代入](#massive-assignment) することが出来て、[検証](#validation-rules) の対象になる属性です。 +上記の例では、`login` シナリオにおいては `username` と `password` の属性がアクティブであり、一方、 +`register` シナリオにおいては、`username` と `password` に加えて `email` もアクティブです。 + +`scenarios()` の既定の実装は、検証規則の宣言メソッドである [[yii\base\Model::rules()]] に現れる全てのシナリオを返すものです。 +`scenarios()` をオーバーライドするときに、デフォルトのシナリオに加えて新しいシナリオを導入したい場合は、 +次のようなコードを書きます: + +```php +namespace app\models; + +use yii\db\ActiveRecord; + +class User extends ActiveRecord +{ + public function scenarios() + { + $scenarios = parent::scenarios(); + $scenarios['login'] = ['username', 'password']; + $scenarios['register'] = ['username', 'email', 'password']; + return $scenarios; + } +} +``` + +シナリオの機能は、主として、[検証](#validation-rules) と [属性の一括代入](#massive-assignment) によって使用されます。 +しかし、他の目的に使うことも可能です。例えば、現在のシナリオに基づいて異なる [属性のラベル](#attribute-labels) を宣言することも出来ます。 + + +## 検証規則 + +モデルのデータをエンドユーザから受け取ったときは、データを検証して、それが一定の規則 (*検証規則*、あるいは、いわゆる *ビジネスルール*) を満たしていることを確認しなければなりません。 +`ContactForm` モデルを例に挙げるなら、全ての属性が空っぽではなく、`email` 属性が有効なメールアドレスを含んでいることを確認したいでしょう。 +いずれかの属性の値が対応するビジネスルールを満たしていないときは、ユーザがエラーを訂正するのを助ける適切なエラーメッセージが表示されるべきです。 + +受信したデータを検証するために、[[yii\base\Model::validate()]] を呼ぶことが出来ます。 +このメソッドは、[[yii\base\Model::rules()]] で宣言された検証規則を使って、該当するすべての属性を検証します。 +エラーが見つからなければ、メソッドは true を返します。そうでなければ、[[yii\base\Model::errors]] +にエラーを保存して、false を返します。例えば、 + +```php +$model = new \app\models\ContactForm; + +// モデルの属性にユーザの入力を代入する +$model->attributes = \Yii::$app->request->post('ContactForm'); + +if ($model->validate()) { + // すべての入力値は有効である +} else { + // 検証が失敗: $errors はエラーメッセージを含む配列 + $errors = $model->errors; +} +``` + + +モデルに関連付けられた検証規則を宣言するためには、[[yii\base\Model::rules()]] メソッドをオーバーライドして、 +モデルの属性が満たすべき規則を返すようにします。 +次の例は、`ContactForm` モデルのために宣言された検証規則を示します: + +```php +public function rules() +{ + return [ + // name、email、subject、body の属性が必須 + [['name', 'email', 'subject', 'body'], 'required'], + + // email 属性は、有効なメールアドレスでなければならない + ['email', 'email'], + ]; +} +``` + +一個の規則は、一個または複数の属性を検証するために使うことが出来ます。 +また、一個の属性は、一個または複数の規則によって検証することが出来ます。 +検証規則をどのように宣言するかについて、更なる詳細は [入力を検証する](input-validation.md) の節を参照してください。 + +時として、特定の [シナリオ](#scenarios) にのみ適用される規則が必要になるでしょう。そのためには、下記のように、 +規則に `on` プロパティを指定することが出来ます: + +```php +public function rules() +{ + return [ + // "register" シナリオでは、username、email、password のすべてが必須 + [['username', 'email', 'password'], 'required', 'on' => 'register'], + + // "login" シナリオでは、username と password が必須 + [['username', 'password'], 'required', 'on' => 'login'], + ]; +} +``` + +`on` プロパティを指定しない場合は、その規則は全てのシナリオに適用されることになります。 +現在の [[yii\base\Model::scenario|シナリオ]] に適用可能な規則は *アクティブな規則* と呼ばれます。 + +属性が検証されるのは、それが `scenarios()` の中でアクティブな属性であると宣言されており、 +かつ、`rules()` の中で宣言されている一つまたは複数のアクティブな規則と関連付けられている場合であり、また、そのような場合だけです。 + + +## 一括代入 + +一括代入は、一行のコードを書くだけで、ユーザの入力したデータをモデルに投入できる便利な方法です。 +一括代入は、入力されたデータを [[yii\base\Model::$attributes]] に直接に代入することによって、モデルの属性にデータを投入します。 +次の二つのコード断片は等価であり、どちらもエンドユーザから送信されたフォームのデータを `ContactForm` モデルの属性に割り当てようとするものです。 +明らかに、一括代入を使う前者の方が、後者よりも明瞭で間違いも起こりにくいでしょう: + +```php +$model = new \app\models\ContactForm; +$model->attributes = \Yii::$app->request->post('ContactForm'); +``` + +```php +$model = new \app\models\ContactForm; +$data = \Yii::$app->request->post('ContactForm', []); +$model->name = isset($data['name']) ? $data['name'] : null; +$model->email = isset($data['email']) ? $data['email'] : null; +$model->subject = isset($data['subject']) ? $data['subject'] : null; +$model->body = isset($data['body']) ? $data['body'] : null; +``` + + +### 安全な属性 + +一括代入は、いわゆる *安全な属性*、すなわち、モデルの現在の [[yii\base\Model::scenario|シナリオ]] +用に [[yii\base\Model::scenarios()]] にリストされている属性に対してのみ適用されます。 +例えば、`User` モデルが次のようなシナリオ宣言を持っている場合において、現在のシナリオが `login` であるときは、`username` と `password` のみが一括代入が可能です。その他の属性はいっさい触れられません。 + +```php +public function scenarios() +{ + return [ + 'login' => ['username', 'password'], + 'register' => ['username', 'email', 'password'], + ]; +} +``` + +> Info|情報: 一括代入が安全な属性に対してのみ適用されるのは、どの属性がエンドユーザのデータによって + 修正されうるかを制御する必要があるからです。 + 例えば、`User` モデルに、ユーザに割り当てられる権限を決定する `permission` という属性がある場合、 + この属性が修正できるのは、管理者がバックエンドのインターフェイスを通じてする時だけに制限したいでしょう。 + +[[yii\base\Model::scenarios()]] の既定の実装は [[yii\base\Model::rules()]] に現われる全てのシナリオと属性を返すものです。 +従って、このメソッドをオーバーライドしない場合は、アクティブな検証規則のどれかに出現する限り、その属性は安全である、ということになります。 + +このため、実際に検証することなく属性を安全であると宣言できるように、`safe` というエイリアスを与えられた特別なバリデータが提供されています。例えば、次の規則は `title` と `description` の両方が安全な属性であると宣言しています。 + +```php +public function rules() +{ + return [ + [['title', 'description'], 'safe'], + ]; +} +``` + + +### 安全でない属性 + +上記で説明したように、[[yii\base\Model::scenarios()]] メソッドは二つの目的を持っています: +すなわち、どの属性が検証されるべきかを決めることと、どの属性が安全であるかを決めることです。 +めったにない場合として、属性を検証する必要はあるが、安全であるという印は付けたくない、ということがあります。 +そういう時は、下の例の `secret` 属性のように、`scenarios()` の中で宣言するときに属性の名前の前に感嘆符 +`!` を前置することが出来ます: + +```php +public function scenarios() +{ + return [ + 'login' => ['username', 'password', '!secret'], + ]; +} +``` + +このモデルが `login` シナリオにある場合、三つの属性は全て検証されます。しかし、`username` と +`password` の属性だけが一括代入が可能です。`secret` 属性に入力値を割り当てるためには、 +下記のように明示的に実行する必要があります。 + +```php +$model->secret = $secret; +``` + + +## データのエクスポート + +モデルを他の形式にエクスポートする必要が生じることはよくあります。例えば、一群のモデルを JSON や +Excel 形式に変換したい場合があるでしょう。 +エクスポートのプロセスは二つの独立したステップに分割することが出来ます。 +最初のステップで、モデルは配列に変換されます。そして第二のステップで、配列が目的の形式に変換されます。 +あなたは最初のステップだけに注力しても構いません。と言うのは、第二のステップは汎用的なデータフォーマッタ、 +例えば [[yii\web\JsonResponseFormatter]] によって達成できるからです。 + +モデルを配列に変換する最も簡単な方法は、[[yii\base\Model::$attributes]] プロパティを使うことです。 +例えば、 + +```php +$post = \app\models\Post::findOne(100); +$array = $post->attributes; +``` + +既定によって、[[yii\base\Model::$attributes]] プロパティは [[yii\base\Model::attributes()]] で宣言されている *全て* の属性の値を返します。 + +モデルを配列に変換するためのもっと柔軟で強力な方法は、[[yii\base\Model::toArray()]] メソッドを使うことです。 +このメソッドの既定の動作は [[yii\base\Model::$attributes]] のそれと同じものです。 +しかしながら、このメソッドを使うと、どのデータ項目 (*フィールド* と呼ばれます) を結果の配列に入れるか、 +そして、その項目にどのような書式を適用するかを選ぶことが出来ます。 +実際、[レスポンスの書式設定](rest-response-formatting.md) で説明されているように、 +RESTFul ウェブサービスの開発においては、これがモデルをエクスポートする既定の方法となっています。 + + +### フィールド + +フィールドとは、単に、モデルの [[yii\base\Model::toArray()]] メソッドを呼ぶことによって取得される配列の中の、 +名前付きの要素のことです。 + +既定では、フィールドの名前は属性の名前と等しいものになります。しかし、この既定の動作は、 +[[yii\base\Model::fields()|fields()]] および/または [[yii\base\Model::extraFields()|extraFields()]] メソッドをオーバーライドして、変更することが出来ます。 +どちらも、フィールド定義のリストを返すべきメソッドです。 +`fields()` によって定義されたフィールドは、デフォルトフィールドです。 +すなわち、`toArray()` が、既定ではこれらのフィールドを返すということを意味します。 +`extraFields()` メソッドは、`$expand` パラメータによって指定する限りにおいて `toArray()` によって返され得る、追加のフィールドを定義します。 +例として、次のコードは、`fields()` で定義された全てのフィールドと、 +(`extraFields()` で定義されていれば) `prettyName` と `fullAddress` フィールドを返すものです。 + +```php +$array = $model->toArray([], ['prettyName', 'fullAddress']); +``` + +`fields()` をオーバーライドして、フィールドを追加、削除、リネーム、再定義することが出来ます。 +`fields()` の返り値は配列でなければなりません。配列のキーはフィールド名であり、 +配列の値は対応するフィールド定義です。フィールド定義には、プロパティ/属性の名前か、または、対応するフィールドの値を返す無名関数を使うことが出来ます。 +フィールド名がそれを定義する属性名と同一であるという特殊な場合においては、配列のキーを省略することが出来ます。 +例えば、 + +```php +// 明示的に全てのフィールドをリストする方法。(API の後方互換性を保つために) DB テーブルやモデル属性の +// 変更がフィールドの変更を引き起こさないことを保証したい場合に適している。 +public function fields() +{ + return [ + // フィールド名が属性名と同じ + 'id', + + // フィールド名は "email"、対応する属性名は "email_address" + 'email' => 'email_address', + + // フィールド名は "name"、その値は PHP コールバックで定義 + 'name' => function () { + return $this->first_name . ' ' . $this->last_name; + }, + ]; +} + +// いくつかのフィールドを除去する方法。親の実装を継承しつつ、慎重に扱うべきフィールドは +// 除外したいときに適している。 +public function fields() +{ + $fields = parent::fields(); + + // 慎重に扱うべき情報を含むフィールドを削除する + unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']); + + return $fields; +} +``` + +> Warning|警告: 既定ではモデルの全ての属性がエクスポートされる配列に含まれるため、データを精査して、 +> 慎重に扱うべき情報が含まれていないことを確認すべきです。そういう情報がある場合は、 +> `fields()` をオーバーライドして、除去すべきです。上記の例では、`auth_key`、`password_hash` +> および `password_reset_token` を選んで除去しています。 + + +## 最善の慣行 + +モデルは、業務のデータ、規則、ロジックを表わす中心的なオブジェクトです。 +モデルは、他の場所で再利用する必要がよくあります。 +良く設計されたアプリケーションでは、通常、モデルは [コントローラ](structure-controllers.md) よりもはるかに重いものになります。 + +要約すると、モデルは、 + +* ビジネスデータを表現する属性を含むことが出来る; +* データの有効性と整合性を保証する検証規則を含むことが出来る; +* ビジネスロジックを実装するメソッドを含むことが出来る; +* リクエスト、セッション、または他の環境データに直接アクセスするべきではない。 + これらのデータは、[コントローラ](structure-controllers.md) によってモデルに注入されるべきである; +* HTML を埋め込むなどの表示用のコードは避けるべきである - これは [ビュー](structure-views.md) で行う方が良い; +* あまりに多くの [シナリオ](#scenarios) を単一のモデルで持つことは避ける。 + +大規模で複雑なシステムを開発するときには、たいてい、上記の最後にあげた推奨事項を考慮するのが良いでしょう。 +そういうシステムでは、モデルは数多くの場所で使用され、それに従って、数多くの規則セットやビジネスロジックを含むため、非常に大きくて重いものになり得ます。 +コードの一ヶ所に触れるだけで数ヶ所の違った場所に影響が及ぶため、ついには、モデルのコードの保守が悪夢になってしまうこともよくあります。 +モデルのコードの保守性を高めるために、以下の戦略をとることが出来ます: + +* 異なる [アプリケーション](structure-applications.md) や [モジュール](structure-modules.md) + によって共有される一連の基底モデルクラスを定義する。 + これらのモデルクラスは、すべてで共通に使用される最小限の規則セットとロジックのみを含むべきである。 +* モデルを使用するそれぞれの [アプリケーション](structure-applications.md) または [モジュール](structure-modules.md) において、 + 対応する基底モデルクラスから拡張した具体的なモデルクラスを定義する。 + この具体的なモデルクラスが、そのアプリケーションやモジュールに固有の規則やロジックを含むべきである。 + +例えば、[アドバンストアプリケーションテンプレート](tutorial-advanced-app.md) の中で、 +基底モデルクラス `common\models\Post` を定義することが出来ます。 +次に、フロントエンドアプリケーションにおいては、`common\models\Post` から拡張した具体的なモデルクラス +`frontend\models\Post` を定義して使います。 +また、バックエンドアプリケーションにおいても、同様に、`backend\models\Post` を定義します。 +この戦略を取ると、`frontend\models\Post` の中のコードはフロントエンドアプリケーション固有のものであると保証することが出来ます。 +そして、フロントエンドのコードにどのような変更を加えても、バックエンドアプリケーションを壊すかもしれないと心配する必要がなくなります。 From decf61a4f34134d2d89a011ae39006fb0b41eafe Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sat, 1 Nov 2014 18:49:10 +0900 Subject: [PATCH 032/144] docs/guide/structure-models.md - typo fixed [ci skip] close #5847 --- docs/guide/structure-models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-models.md b/docs/guide/structure-models.md index e483d73..7d175e3 100644 --- a/docs/guide/structure-models.md +++ b/docs/guide/structure-models.md @@ -493,7 +493,7 @@ In summary, models You may usually consider the last recommendation above when you are developing large complex systems. In these systems, models could be very fat because they are used in many places and may thus contain many sets of rules and business logic. This often ends up in a nightmare in maintaining the model code -because a single touch of the code could affect several different places. To make the mode code more maintainable, +because a single touch of the code could affect several different places. To make the model code more maintainable, you may take the following strategy: * Define a set of base model classes that are shared by different [applications](structure-applications.md) or From ecb113f1d06e683f36fd2a978f4b5fb70fa1a654 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Sat, 1 Nov 2014 14:05:33 +0100 Subject: [PATCH 033/144] fixed model serializtaion example --- docs/guide/rest-resources.md | 4 ++-- framework/base/Arrayable.php | 4 ++-- framework/base/Model.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/guide/rest-resources.md b/docs/guide/rest-resources.md index 2e653ce..37a4705 100644 --- a/docs/guide/rest-resources.md +++ b/docs/guide/rest-resources.md @@ -71,8 +71,8 @@ public function fields() // field name is "email", the corresponding attribute name is "email_address" 'email' => 'email_address', // field name is "name", its value is defined by a PHP callback - 'name' => function () { - return $this->first_name . ' ' . $this->last_name; + 'name' => function ($model) { + return $model->first_name . ' ' . $model->last_name; }, ]; } diff --git a/framework/base/Arrayable.php b/framework/base/Arrayable.php index 3acc41f..6958b02 100644 --- a/framework/base/Arrayable.php +++ b/framework/base/Arrayable.php @@ -52,8 +52,8 @@ interface Arrayable * 'email', * 'firstName' => 'first_name', * 'lastName' => 'last_name', - * 'fullName' => function () { - * return $this->first_name . ' ' . $this->last_name; + * 'fullName' => function ($model) { + * return $model->first_name . ' ' . $model->last_name; * }, * ]; * ``` diff --git a/framework/base/Model.php b/framework/base/Model.php index de8a024..048baf5 100644 --- a/framework/base/Model.php +++ b/framework/base/Model.php @@ -841,8 +841,8 @@ class Model extends Component implements IteratorAggregate, ArrayAccess, Arrayab * 'email', * 'firstName' => 'first_name', * 'lastName' => 'last_name', - * 'fullName' => function () { - * return $this->first_name . ' ' . $this->last_name; + * 'fullName' => function ($model) { + * return $model->first_name . ' ' . $model->last_name; * }, * ]; * ``` From 597dfd81e6568dfd977c85cbad6817e89fac968a Mon Sep 17 00:00:00 2001 From: DelphiSerg Date: Sat, 1 Nov 2014 20:11:21 +0200 Subject: [PATCH 034/144] Update output-formatter.md --- docs/guide/output-formatter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/output-formatter.md b/docs/guide/output-formatter.md index 7ec3d59..d41a5d9 100644 --- a/docs/guide/output-formatter.md +++ b/docs/guide/output-formatter.md @@ -113,7 +113,7 @@ echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2014-10-06 ### Time zones When formatting date and time values, Yii will convert them to the [[yii\i18n\Formatter::timeZone|configured time zone]]. -Therefor the input value is assumed to be in UTC unless a time zone is explicitly given. For this reason +Therefore the input value is assumed to be in UTC unless a time zone is explicitly given. For this reason it is recommended to store all date and time values in UTC preferably as a UNIX timestamp, which is always UTC by definition. If the input value is in a time zone different from UTC, the time zone has to be stated explicitly like in the following example: From f2385720a8bbec4e652a77f16fa0497a41c5d6d1 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Sat, 1 Nov 2014 22:58:21 +0100 Subject: [PATCH 035/144] Update rest-authentication.md --- docs/guide/rest-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/rest-authentication.md b/docs/guide/rest-authentication.md index 2c6f7ca..b91214b 100644 --- a/docs/guide/rest-authentication.md +++ b/docs/guide/rest-authentication.md @@ -6,7 +6,7 @@ be used. Therefore, each request should come with some sort of authentication cr the user authentication status may not be maintained by sessions or cookies. A common practice is to send a secret access token with each request to authenticate the user. Since an access token can be used to uniquely identify and authenticate a user, **API requests should always be sent -via HTTPS to prevent from man-in-the-middle (MitM) attacks**. +via HTTPS to prevent man-in-the-middle (MitM) attacks**. There are different ways to send an access token: From 530537e48fa53c6d8a4e49bfeb8abc221401e450 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sat, 1 Nov 2014 20:41:34 -0400 Subject: [PATCH 036/144] Fixes #5817 [skip ci] --- framework/console/controllers/BaseMigrateController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/console/controllers/BaseMigrateController.php b/framework/console/controllers/BaseMigrateController.php index bf49f01..82a1ee5 100644 --- a/framework/console/controllers/BaseMigrateController.php +++ b/framework/console/controllers/BaseMigrateController.php @@ -408,7 +408,7 @@ abstract class BaseMigrateController extends Controller * ~~~ * * @param integer $limit the maximum number of new migrations to be displayed. - * If it is 0, all available new migrations will be displayed. + * If it is `all`, all available new migrations will be displayed. * @throws \yii\console\Exception if invalid limit value passed */ public function actionNew($limit = 10) @@ -642,4 +642,4 @@ abstract class BaseMigrateController extends Controller * @param string $version migration version name. */ abstract protected function removeMigrationHistory($version); -} \ No newline at end of file +} From 38fe290e7f6e9b33c791208284e01a9fbe4e650a Mon Sep 17 00:00:00 2001 From: huoshi5151 Date: Sun, 2 Nov 2014 14:45:30 +0800 Subject: [PATCH 037/144] typo fixed typo fixed --- docs/guide-zh-CN/structure-applications.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/guide-zh-CN/structure-applications.md b/docs/guide-zh-CN/structure-applications.md index 4e9ef19..bd0435f 100644 --- a/docs/guide-zh-CN/structure-applications.md +++ b/docs/guide-zh-CN/structure-applications.md @@ -389,7 +389,6 @@ $width = \Yii::$app->params['thumbnail.size'][0]; 如果 [视图路径](#viewPath) 使用默认值,默认的布局路径别名为`@app/views/layouts`。 该属性需要配置成一个目录或 路径 [别名](concept-aliases.md)。 -You may configure it as a directory or a path [alias](concept-aliases.md). #### [[yii\base\Application::runtimePath|runtimePath]] From 31f858e736541e78ea929f76af78b274eb272d6a Mon Sep 17 00:00:00 2001 From: huoshi5151 Date: Sun, 2 Nov 2014 16:38:43 +0800 Subject: [PATCH 038/144] typo fixed typo fixed --- docs/guide-zh-CN/structure-controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/structure-controllers.md b/docs/guide-zh-CN/structure-controllers.md index 703f246..750ed1f 100644 --- a/docs/guide-zh-CN/structure-controllers.md +++ b/docs/guide-zh-CN/structure-controllers.md @@ -283,7 +283,7 @@ class HelloWorldAction extends Action ### 操作结果 -操作方法或独立操作的`run()`方法的返回值非常中药,它表示对应操作结果。 +操作方法或独立操作的`run()`方法的返回值非常重要,它表示对应操作结果。 返回值可为 [响应](runtime-responses.md) 对象,作为响应发送给终端用户。 From a1fd9c6469b00978209fc390e97f007fa48f349f Mon Sep 17 00:00:00 2001 From: huoshi5151 Date: Sun, 2 Nov 2014 16:59:22 +0800 Subject: [PATCH 039/144] repeat fixed repeat fixed --- docs/guide-zh-CN/structure-controllers.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/guide-zh-CN/structure-controllers.md b/docs/guide-zh-CN/structure-controllers.md index 703f246..f5d37e4 100644 --- a/docs/guide-zh-CN/structure-controllers.md +++ b/docs/guide-zh-CN/structure-controllers.md @@ -378,8 +378,7 @@ class SiteController extends Controller ## 控制器生命周期 -处理一个请求时,[应用主体](structure-applications.md) 会根据请求[路由](#routes)创建一个控制器,will create a controller -控制器经过以下生命周期来完成请求: +处理一个请求时,[应用主体](structure-applications.md) 会根据请求[路由](#routes)创建一个控制器,控制器经过以下生命周期来完成请求: 1. 在控制器创建和配置后,[[yii\base\Controller::init()]] 方法会被调用。 2. 控制器根据请求操作ID创建一个操作对象: From 4ec0e61d8133bb776b447f93ad25212367612bae Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 2 Nov 2014 21:30:13 +0900 Subject: [PATCH 040/144] docs/guide/structure-views.md grammar fix [ci skip] --- docs/guide/structure-views.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-views.md b/docs/guide/structure-views.md index b8553d8..f29adbd 100644 --- a/docs/guide/structure-views.md +++ b/docs/guide/structure-views.md @@ -42,7 +42,7 @@ and rendering this view template. Besides `$this`, there may be other predefined variables in a view, such as `$model` in the above example. These variables represent the data that are *pushed* into the view by [controllers](structure-controllers.md) -or other objects whose trigger the [view rendering](#rendering-views). +or other objects which trigger the [view rendering](#rendering-views). > Tip: The predefined variables are listed in a comment block at beginning of a view so that they can be recognized by IDEs. It is also a good way of documenting your views. From 8c89f847e72c17172b82386b0407e98482799cda Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 2 Nov 2014 12:05:35 +0900 Subject: [PATCH 041/144] docs/guide-ja/intro-upgrade-from-v1.md minor fix [ci skip] --- docs/guide-ja/intro-upgrade-from-v1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-ja/intro-upgrade-from-v1.md b/docs/guide-ja/intro-upgrade-from-v1.md index 176d36c..79925d8 100644 --- a/docs/guide-ja/intro-upgrade-from-v1.md +++ b/docs/guide-ja/intro-upgrade-from-v1.md @@ -45,7 +45,7 @@ Yii 2.0 は PHP 5.4 以上を必要とします。PHP 5.4 は、Yii 1.1 によ Yii 2.0 での最も明らかな変更は名前空間の使用です。 ほとんど全てのコアクラスが、例えば、`yii\web\Request` のように名前空間に属します。 -クラス名に "C" のプレフィックスはもう使われません。 +クラス名に "C" の接頭辞はもう使われません。 命名のスキームはディレクトリ構造に従うようになりました。 例えば、`yii\web\Request` は、対応するクラスファイルが Yii フレームワークフォルダの下の `web/Request.php` であることを示します。 @@ -156,7 +156,7 @@ Yii 2 のビューについての最も顕著な変更は、ビューの中で ` ビューにおいてコントローラやウィジェットにアクセスしたい場合は、`$this->context` を使うことが出来ます。 パーシャルビューを別のビューの中で表示するためには、`$this->renderPartial()` ではなく、`$this->render()` を使います。 -`render` の呼び出しは、2.0 では明示的に echo しなくてはなりません。と言うのは、`render)` メソッドは、直接に表示するのではなく、レンダリング結果を文字列として返すものだからです。 +`render` の呼び出しは、2.0 では明示的に echo しなくてはなりません。と言うのは、`render()` メソッドは、直接に表示するのではなく、レンダリング結果を文字列として返すものだからです。 例えば: ```php From 218de429371b00e5170abebb8d5e763f8fd7319e Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 2 Nov 2014 15:29:37 +0900 Subject: [PATCH 042/144] docs/guide-ja/intro-*, docs/guide-ja/start-* minor changes [ci skip] --- docs/guide-ja/intro-upgrade-from-v1.md | 14 +++++++------- docs/guide-ja/start-databases.md | 2 +- docs/guide-ja/start-gii.md | 2 +- docs/guide-ja/start-hello.md | 16 ++++++++-------- docs/guide-ja/start-workflow.md | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/guide-ja/intro-upgrade-from-v1.md b/docs/guide-ja/intro-upgrade-from-v1.md index 79925d8..05c90af 100644 --- a/docs/guide-ja/intro-upgrade-from-v1.md +++ b/docs/guide-ja/intro-upgrade-from-v1.md @@ -176,8 +176,8 @@ Yii 2.0 は [[yii\base\Model]] を 1.1 における `CModel` と同様な基底 `CFormModel` というクラスは完全に廃止されました。 Yii 2 では、それの代りに、[yii\base\Model]] を拡張してフォームモデルクラスを作成すべきです。 -Yii 2.0 は シナリオを宣言するための [[yii\base\Model::scenarios()|scenarios()]] というメソッドを導入しました。 -このメソッドを使って、どのようなシナリオがサポートされるか、また、どのシナリオの下である属性が検証される必要があるか、安全とみなされるか否か、などを宣言します。 +Yii 2.0 は サポートされるシナリオを宣言するための [[yii\base\Model::scenarios()|scenarios()]] というメソッドを導入しました。 +このメソッドを使って、あるシナリオの下で、どの属性が検証される必要があるか、また、どの属性が安全とみなされるか否か、などを宣言することが出来ます。 例えば: ```php @@ -193,12 +193,12 @@ public function scenarios() 上記では二つのシナリオが宣言されています: `backend` と `frontend` です。 `backend` シナリオでは、`email` と `role` の属性が両方とも安全であり、一括代入が可能です。 `frontend` シナリオでは、`email` は一括代入が可能ですが、`role` は不可能です。 -`email` と `role` は、両方とも、ルールを使って検証されなければなりません。 +`email` と `role` は、両方とも、規則を使って検証されなければなりません。 -[[yii\base\Model::rules()|rules()]] メソッドが Yii 1.1 同様に検証ルールを宣言するために使われます。 +[[yii\base\Model::rules()|rules()]] メソッドが Yii 1.1 同様に検証規則を宣言するために使われます。 [[yii\base\Model::scenarios()|scenarios()]] が導入されたことにより、`unsafe` バリデータが無くなったことに注意してください。 -ほとんどの場合、[[yii\base\Model::rules()|rules()]] メソッドが存在し得るシナリオを十全に記述することが出来るなら、そして `unsafe` な属性を宣言する必要が無いなら、[[yii\base\Model::scenarios()|scenarios()]] をオーバーライドする必要はありません。 +ほとんどの場合、[[yii\base\Model::rules()|rules()]] メソッドが在り得るシナリオを十分に既定しているなら、そして `unsafe` な属性を宣言する必要が無いなら、[[yii\base\Model::scenarios()|scenarios()]] をオーバーライドする必要はありません。 モデルについてさらに詳細を学習するために、[モデル](structure-models.md) の節を参照してください。 @@ -389,7 +389,7 @@ $sql = $command->sql; $rows = $command->queryAll(); ``` -何より良いのは、このようなクエリ構築メソッドが [Active Record](db-active-record.md) を扱う時にも使える、ということです。 +何より良いのは、このようなクエリ構築メソッドが [アクティブレコード](db-active-record.md) を扱う時にも使える、ということです。 更なる詳細については [クエリビルダ](db-query-builder.md) の節を参照してください。 @@ -397,7 +397,7 @@ $rows = $command->queryAll(); アクティブレコード ------------------ -Yii 2.0 は [Active Record](db-active-record.md) に数多くの変更を導入しました。 +Yii 2.0 は [アクティブレコード](db-active-record.md) に数多くの変更を導入しました。 最も顕著な違いは、クエリの構築方法とリレーショナルクエリの処理の二つです。 1.1 の `CDbCriteria` クラスは Yii 2 では [[yii\db\ActiveQuery]] に置き換えられました。 diff --git a/docs/guide-ja/start-databases.md b/docs/guide-ja/start-databases.md index aec8268..a5ccf7d 100644 --- a/docs/guide-ja/start-databases.md +++ b/docs/guide-ja/start-databases.md @@ -127,7 +127,7 @@ $country->save(); ``` > Info|情報: アクティブレコードは、オブジェクト指向の流儀でデータベースのデータにアクセスし、操作する強力な方法です。 -[Active Record](db-active-record.md) の節で、更に詳細な情報を得ることが出来ます。 +[アクティブレコード](db-active-record.md) の節で、更に詳細な情報を得ることが出来ます。 もう一つの方法として、[データアクセスオブジェクト(DAO)](db-dao.md) と呼ばれる、より低レベルなデータアクセス方法を使って データベースを操作することも出来ます。 diff --git a/docs/guide-ja/start-gii.md b/docs/guide-ja/start-gii.md index 600ce54..f0b3219 100644 --- a/docs/guide-ja/start-gii.md +++ b/docs/guide-ja/start-gii.md @@ -46,7 +46,7 @@ defined('YII_ENV') or define('YII_ENV', 'dev'); http://hostname/index.php?r=gii ``` -> Note|注意: ローカルホスト以外のマシンから GII にアクセスしようとすると、既定ではセキュリティ上の +> Note|注意: ローカルホスト以外のマシンから Gii にアクセスしようとすると、既定ではセキュリティ上の > 目的からアクセスが拒否されます。下記のように Gii を構成して、許可される IP アドレスを追加することが出来ます。 > ```php diff --git a/docs/guide-ja/start-hello.md b/docs/guide-ja/start-hello.md index c3571b8..9e4199e 100644 --- a/docs/guide-ja/start-hello.md +++ b/docs/guide-ja/start-hello.md @@ -4,14 +4,14 @@ この節では、アプリケーションに新しい「こんにちは」というページを作成する方法を説明します。 この目的を達するために、[アクション](structure-controllers.md#creating-actions) と [ビュー](structure-views.md) を作成することになります: -* アプリケーションがこのページへのリクエストをそのアクションに送致(dispatch)し、 +* アプリケーションがこのページへのリクエストをそのアクションに送付し、 * 次にそのアクションが "Hello" という言葉をエンドユーザに示すビューを表示します。 このチュートリアルを通じて、次の三つのことを学びます: 1. リクエストに応える [アクション](structure-controllers.md) をどのようにして作るか、 2. レスポンスの内容を構成する [ビュー](structure-views.md) をどのようにして作るか、そして、 -3. アプリケーションはどのようにしてリクエストを [アクション](structure-controllers.md#creating-actions) に送致するか。 +3. アプリケーションはどのようにしてリクエストを [アクション](structure-controllers.md#creating-actions) に送付するか。 アクションを作成する @@ -48,20 +48,20 @@ class SiteController extends Controller ``` 上記のコードで、`say` アクションは `SiteController` クラスの中で `actionSay` という名前のメソッドとして定義されています。 -Yii はコントローラクラスの中でアクションのメソッドとアクションでないメソッドを区別するために、`action` という接頭語を使います。 -`action` という接頭語の後の名前がアクション ID にマップされます。 +Yii はコントローラクラスの中でアクションのメソッドとアクションでないメソッドを区別するために、`action` という接頭辞を使います。 +`action` という接頭辞の後の名前がアクション ID にマップされます。 アクションを命名するについては、Yii がアクション ID をどのように取り扱うかを知っているべきです。 アクション ID は常に小文字で参照されます。 アクション ID が複数の単語を必要とするときは、単語がダッシュ(-)で連結されます (例えば、`create-comment`)。 -アクションメソッドの名前は、アクション ID からダッシュを全て削除し、各単語の先頭の文字を大文字にした結果に `action` という接頭語を付けたものとします。 +アクションメソッドの名前は、アクション ID からダッシュを全て削除し、各単語の先頭の文字を大文字にした結果に `action` という接頭辞を付けたものとします。 例えば、アクション ID `create-comment` に対応するアクションメソッド名は `actionCreateComment` となります。 私たちの例では、このアクションメソッドは `$message` というパラメータを取ります。 そして、このパラメータは `"Hello"` という既定値を取ります (PHP で関数やメソッドの引数について既定値をセットするのと全く同じ方法を使います)。 アプリケーションは、リクエストを受け取って、当該リクエストの処理を `say` アクションに任せると決定した場合、リクエストの中に同じ名前の付いたパラメータがあれば、それをこのパラメータに代入します。 -言い換えれば、もしリクエストに `"GoodBye"` という値の `message` パラメータが入っていれば、アクションの `$message` 変数にその値が割り当てけられます。 +言い換えれば、もしリクエストに `"GoodBye"` という値の `message` パラメータが入っていれば、アクションの `$message` 変数にその値が割り当てられます。 このアクションメソッドの中では、[[yii\web\Controller::render()|render()]] が呼ばれて `say` と言う名前の [ビュー](structure-views.md) ファイルが表示されます。 `message` パラメータも同時にビューに渡され、そこで使用されます。 @@ -72,7 +72,7 @@ Yii はコントローラクラスの中でアクションのメソッドとア ビューを作成する ---------------- -[ビュー](structure-views.md) は、レスポンスのコンテンツを生成するために書くスクリプトです。 +[ビュー](structure-views.md) は、レスポンスのコンテンツを生成するためにあなたが書くスクリプトです。 「こんにちは」のタスクのためには、アクションメソッドから受け取った `message` パラメータを印字する `say` ビューを作成します: ```php @@ -126,7 +126,7 @@ URL から `message` パラメータを省略すると、"Hello" だけを表示 > Info|情報: アクションと同じく、コントローラもまたアプリケーションの中で一意に定義される ID を持ちます。 コントローラ ID も、アクション ID と同じ命名規則を使います。 - コントローラクラスの名前は、コントローラ ID からダッシュを削除し、各単語の最初の文字を大文字にし、結果として出来る文字列に `Controller` という接尾語を追加したものとします。 + コントローラクラスの名前は、コントローラ ID からダッシュを削除し、各単語の最初の文字を大文字にし、結果として出来る文字列に `Controller` という接尾辞を追加したものとします。 例えば、`post-comment` というコントローラ ID に対応するコントローラクラスの名前は `PostCommentController` です。 diff --git a/docs/guide-ja/start-workflow.md b/docs/guide-ja/start-workflow.md index d01d700..619e4ee 100644 --- a/docs/guide-ja/start-workflow.md +++ b/docs/guide-ja/start-workflow.md @@ -69,7 +69,7 @@ Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/ 各アプリケーションは一つのエントリスクリプト `web/index.php` を持ちます。これはアプリケーション中で唯一ウェブからアクセス可能な PHP スクリプトです。 エントリスクリプトは入力されたリクエストを受け取って、[アプリケーション](structure-applications.md) のインスタンスを作成します。 -[アプリケーション](structure-applications.md) は [コンポーネント](concept-components.md) の助力を得てリクエストを解決し、リクエストを MVC 要素に対して送出します。 +[アプリケーション](structure-applications.md) は [コンポーネント](concept-components.md) の助力を得てリクエストを解決し、リクエストを MVC に送付します。 [ウィジェット](structure-widgets.md) は、複雑で動的なユーザインタフェイス要素を構築するために、[ビュー](structure-views.md) の中で使われます。 From c03d902cf2ec982a954080c3f04af03b82be961c Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 2 Nov 2014 20:37:13 +0900 Subject: [PATCH 043/144] docs/guide-ja/* changes for "render" and "rendering" [ci skip] --- docs/guide-ja/intro-upgrade-from-v1.md | 4 ++-- docs/guide-ja/start-databases.md | 9 +++++---- docs/guide-ja/start-forms.md | 2 +- docs/guide-ja/start-hello.md | 4 ++-- docs/guide-ja/start-workflow.md | 6 +++--- docs/guide-ja/structure-application-components.md | 2 +- docs/guide-ja/structure-applications.md | 2 +- docs/guide/structure-views.md | 2 +- 8 files changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/guide-ja/intro-upgrade-from-v1.md b/docs/guide-ja/intro-upgrade-from-v1.md index 05c90af..aaa53f1 100644 --- a/docs/guide-ja/intro-upgrade-from-v1.md +++ b/docs/guide-ja/intro-upgrade-from-v1.md @@ -151,8 +151,8 @@ Yii 2.0 は、パスエイリアスの使用を、ファイル/ディレクト ------ Yii 2 のビューについての最も顕著な変更は、ビューの中で `$this` という特殊な変数がカレントコントローラやウィジェットを指すものではなくなったということです。 -今や `$this` は 2.0 で新しく導入された概念である *ビュー*オブジェクトを指します。 -*ビュー*オブジェクトは [[yii\web\View]] という型であり、MVC パターンのビューの部分を表すものです。 +今や `$this` は 2.0 で新しく導入された概念である *ビュー* オブジェクトを指します。 +*ビュー* オブジェクトは [[yii\web\View]] という型であり、MVC パターンのビューの部分を表すものです。 ビューにおいてコントローラやウィジェットにアクセスしたい場合は、`$this->context` を使うことが出来ます。 パーシャルビューを別のビューの中で表示するためには、`$this->renderPartial()` ではなく、`$this->render()` を使います。 diff --git a/docs/guide-ja/start-databases.md b/docs/guide-ja/start-databases.md index a5ccf7d..21fb939 100644 --- a/docs/guide-ja/start-databases.md +++ b/docs/guide-ja/start-databases.md @@ -184,7 +184,7 @@ class CountryController extends Controller * クエリによって表現される SQL 文に `offset` 句と `limit` 句をセットして、一度に一ページ分のデータだけ (1ページ最大5行)を返すようにします。 * 次の項で説明されるように、一連のページボタンからなるページャをビューに表示するために使われます。 -コードの最後で、`index` アクションは `index` と言う名前のビューを表示していますが、このとき、国データはもちろん、そのページ付け情報もビューに渡されます。 +コードの最後で、`index` アクションは `index` と言う名前のビューをレンダリングしていますが、このとき、国データはもちろん、そのページ付け情報もビューに渡されます。 ビューを作成する @@ -213,8 +213,9 @@ use yii\widgets\LinkPager; ``` ビューは国データの表示に関連して二つの部分に分けられます。 -最初の部分では、提供された国データが HTML の順序無しリストとして表示されます。 -第二の部分では、アクションから渡されたページ付け情報を使って、[[yii\widgets\LinkPager]] ウィジェットが表示されます。 +最初の部分では、提供された国データがたどられて、HTML の順序無しリストとしてレンダリングされます。 +第二の部分では、アクションから渡されたページ付け情報を使って、[[yii\widgets\LinkPager]] +ウィジェットがレンダリングされます。 `LinkPager` ウィジェットはページボタンのリストを表示します。ボタンのどれかをクリックすると、対応するページの国データが更新表示されます。 @@ -243,7 +244,7 @@ http://hostname/index.php?r=country/index&page=2 * 最初、[[yii\data\Pagination|Pagination]] は、1ページ目を表しています。 これは、国の SELECT クエリが `LIMIT 5 OFFSET 0` という句を伴うことを示しています。 その結果、最初の5つの国が取得されて表示されます。 -* [[yii\widgets\LinkPager|LinkPager]] ウィジェットは、[[yii\data\Pagination::createUrl()|Pagination]] によって作成された URL を使ってページボタンを表示します。 +* [[yii\widgets\LinkPager|LinkPager]] ウィジェットは、[[yii\data\Pagination::createUrl()|Pagination]] によって作成された URL を使ってページボタンをレンダリングします。 URL は、別々のページ番号を表現する `page` というクエリパラメータを含んだものになります。 * ページボタン "2" をクリックすると、`country/index` のルートに対する新しいリクエストが発行され、処理されます。 [[yii\data\Pagination|Pagination]] が URL から `page` クエリパラメータを読み取って、カレントページ番号を 2 にセットします。 diff --git a/docs/guide-ja/start-forms.md b/docs/guide-ja/start-forms.md index 2912508..e4baa64 100644 --- a/docs/guide-ja/start-forms.md +++ b/docs/guide-ja/start-forms.md @@ -172,7 +172,7 @@ use yii\widgets\ActiveForm; ``` このビューは HTML フォームを構築するのに、[[yii\widgets\ActiveForm|ActiveForm]] と呼ばれる強力な [ウィジェット](structure-widgets.md) を使います。 -ウィジェットの `begin()` メソッドと `end()` メソッドが、それぞれ、フォームの開始タグと終了タグを表示します。 +ウィジェットの `begin()` メソッドと `end()` メソッドが、それぞれ、フォームの開始タグと終了タグをレンダリングします。 この二つのメソッドの呼び出しの間に、[[yii\widgets\ActiveForm::field()|field()]] メソッドによって入力フィールドが作成されます。 最初の入力フィールドは "name" のデータ、第二の入力フィールドは "email" のデータのためのものです。 入力フィールドの後に、[[yii\helpers\Html::submitButton()]] メソッドが呼ばれて、送信ボタンを生成しています。 diff --git a/docs/guide-ja/start-hello.md b/docs/guide-ja/start-hello.md index 9e4199e..eb21b6e 100644 --- a/docs/guide-ja/start-hello.md +++ b/docs/guide-ja/start-hello.md @@ -63,9 +63,9 @@ Yii はコントローラクラスの中でアクションのメソッドとア アプリケーションは、リクエストを受け取って、当該リクエストの処理を `say` アクションに任せると決定した場合、リクエストの中に同じ名前の付いたパラメータがあれば、それをこのパラメータに代入します。 言い換えれば、もしリクエストに `"GoodBye"` という値の `message` パラメータが入っていれば、アクションの `$message` 変数にその値が割り当てられます。 -このアクションメソッドの中では、[[yii\web\Controller::render()|render()]] が呼ばれて `say` と言う名前の [ビュー](structure-views.md) ファイルが表示されます。 +このアクションメソッドの中では、[[yii\web\Controller::render()|render()]] が呼ばれて `say` と言う名前の [ビュー](structure-views.md) ファイルがレンダリングされます。 `message` パラメータも同時にビューに渡され、そこで使用されます。 -表示結果はアクションメソッドによって返されます。 +レンダリング結果はアクションメソッドによって返されます。 返された結果はアプリケーションによって受け取られ、ブラウザ上でエンドユーザに(完全な HTML ページの一部として)表示されます。 diff --git a/docs/guide-ja/start-workflow.md b/docs/guide-ja/start-workflow.md index 619e4ee..e410819 100644 --- a/docs/guide-ja/start-workflow.md +++ b/docs/guide-ja/start-workflow.md @@ -90,7 +90,7 @@ Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/ 6. 一つでもフィルタが失敗したときは、アクションはキャンセルされます。 7. すべてのフィルタを通ったとき、アクションが実行されます。 8. アクションはデータモデルを、おそらくはデータベースから、読み出します。 -9. アクションはデータモデルをビューに提供して、ビューを表示します。 -10. 表示された結果が [レスポンス](runtime-responses.md) アプリケーションコンポーネントに返されます。 -11. レスポンスコンポーネントが表示された結果をユーザのブラウザに送信します。 +9. アクションはデータモデルをビューに提供して、ビューをレンダリングします。 +10. レンダリング結果が [レスポンス](runtime-responses.md) アプリケーションコンポーネントに返されます。 +11. レスポンスコンポーネントがレンダリング結果をユーザのブラウザに送信します。 diff --git a/docs/guide-ja/structure-application-components.md b/docs/guide-ja/structure-application-components.md index 667b423..c66fa2e 100644 --- a/docs/guide-ja/structure-application-components.md +++ b/docs/guide-ja/structure-application-components.md @@ -115,5 +115,5 @@ Yii のアプリケーションがユーザリクエストを処理すること * [[yii\web\User|user]]: ユーザの認証情報を表現します。 このコンポーネントは、[[yii\web\Application|ウェブアプリケーション]] においてのみ利用できます。. 更なる詳細は [認証](security-authentication.md) の節を参照してください。 -* [[yii\web\View|view]]: ビューの描画をサポートします。 +* [[yii\web\View|view]]: ビューのレンダリングをサポートします。 更なる詳細は [ビュー](structure-views.md) の節を参照してください。 diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index 6e4d525..b962032 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -426,7 +426,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; #### [[yii\base\Application::layout|layout]] -このプロパティは、[ビュー](structure-views.md) を描画するときに使われるべきデフォルトのレイアウトを規定します。 +このプロパティは、[ビュー](structure-views.md) をレンダリングするときに使われるべきデフォルトのレイアウトを規定します。 デフォルト値は `'main'` であり、[レイアウトパス](#layoutPath) の下にある `main.php` というファイルが使われるべき事を意味します。 [レイアウトパス](#layoutPath) と [ビューパス](#viewPath) の両方がデフォルト値を取る場合、 デフォルトのレイアウトファイルは `@app/views/layouts/main.php` というパスエイリアスとして表すことが出来ます。 diff --git a/docs/guide/structure-views.md b/docs/guide/structure-views.md index b8553d8..f29adbd 100644 --- a/docs/guide/structure-views.md +++ b/docs/guide/structure-views.md @@ -42,7 +42,7 @@ and rendering this view template. Besides `$this`, there may be other predefined variables in a view, such as `$model` in the above example. These variables represent the data that are *pushed* into the view by [controllers](structure-controllers.md) -or other objects whose trigger the [view rendering](#rendering-views). +or other objects which trigger the [view rendering](#rendering-views). > Tip: The predefined variables are listed in a comment block at beginning of a view so that they can be recognized by IDEs. It is also a good way of documenting your views. From 21cb13737f37367a4061d2181f43bb63340ff0d4 Mon Sep 17 00:00:00 2001 From: huoshi5151 Date: Sun, 2 Nov 2014 23:25:59 +0800 Subject: [PATCH 044/144] typo fixed typo fixed --- docs/guide-zh-CN/structure-views.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/structure-views.md b/docs/guide-zh-CN/structure-views.md index 7d69c2c..f0e7a4b 100644 --- a/docs/guide-zh-CN/structure-views.md +++ b/docs/guide-zh-CN/structure-views.md @@ -563,7 +563,7 @@ $this->registerMetaTag(['name' => 'description', 'content' => 'This website is a ### 注册链接标签 -和 [Meta标签](#adding-meta-tags) 类似,链接标签有时很使用,如自定义网站图标,指定Rss订阅,或授权OpenID到其他服务器。 +和 [Meta标签](#adding-meta-tags) 类似,链接标签有时很实用,如自定义网站图标,指定Rss订阅,或授权OpenID到其他服务器。 可以和元标签相似的方式调用[[yii\web\View::registerLinkTag()]],例如,在内容视图中注册链接标签如下所示: ```php From 0b755395d43bcf6ea48083bc2250b4bbeb83b4fb Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sun, 2 Nov 2014 22:11:45 -0500 Subject: [PATCH 045/144] working on guide [skip ci] --- docs/guide/README.md | 3 +- docs/guide/runtime-routing.md | 483 +++++++++++++++++++++++++++++++---- docs/guide/runtime-url-handling.md | 360 -------------------------- docs/guide/start-installation.md | 6 +- docs/guide/structure-controllers.md | 4 +- docs/internals/translation-status.md | 3 +- 6 files changed, 447 insertions(+), 412 deletions(-) delete mode 100644 docs/guide/runtime-url-handling.md diff --git a/docs/guide/README.md b/docs/guide/README.md index 09d7493..6629072 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -49,11 +49,10 @@ Handling Requests * [Overview](runtime-overview.md) * [Bootstrapping](runtime-bootstrapping.md) -* [Routing](runtime-routing.md) +* [Routing and Url Creation](runtime-routing.md) * [Requests](runtime-requests.md) * [Responses](runtime-responses.md) * [Sessions and Cookies](runtime-sessions-cookies.md) -* [URL Parsing and Generation](runtime-url-handling.md) * [Handling Errors](runtime-handling-errors.md) * [Logging](runtime-logging.md) diff --git a/docs/guide/runtime-routing.md b/docs/guide/runtime-routing.md index ec292bc..9d5db09 100644 --- a/docs/guide/runtime-routing.md +++ b/docs/guide/runtime-routing.md @@ -1,35 +1,105 @@ -Routing -======= +Routing and URL Creation +======================== -When the [[yii\web\Application::run()|run()]] method is called by the [entry script](structure-entry-scripts.md), -the first thing it does is to resolve the incoming request and instantiate an appropriate -[controller action](structure-controllers.md) to handle the request. This process is called *routing*. +> Note: This section is under development. +When a Yii application starts processing a requested URL, the first step it does is to parse the URL +into a [route](structure-controllers.md#routes). The route is then used to instantiate the corresponding +[controller action](structure-controllers.md) to handle the request. This whole process is called *routing*. + +The reverse process of routing is called *URL creation*, which creates a URL from a given route +and the associated parameters. When the created URL is later requested, the routing process can resolve it +back into the original route and parameters. + +The central piece responsible for routing and URL creation is the [[yii\web\UrlManager|URL manager]], +which is registered as the `urlManager` application component. The [[yii\web\UrlManager|URL manager]] +provides the [[yii\web\UrlManager::parseRequest()|parseRequest()]] method to parse an incoming request into +a route and the associated parameters and the [[yii\web\UrlManager::createUrl()|createUrl()]] method to +create a URL from a given route and its associated parameters. + +By configuring the `urlManager` component in the application configuration, you can let your application +to recognize arbitrary URL formats without modifying your existing application code. For example, you can +use the following code to create a URL for the `post/view` action: -## Resolving Route +```php +use yii\helpers\Url; + +// Url::to() calls UrlManager::createUrl() to create a URL +$url = Url::to(['post/view', 'id' => 100]); +``` + +Depending on the `urlManager` configuration, the created URL may look like one of the followings (or other format). +And if the created URL is requested later, it will still be parsed back into the original route and parameter value. + +``` +/index.php?r=post/view&id=100 +/index.php/post/100 +/posts/100 +``` + + +## URL Formats + +The [[yii\web\UrlManager|URL manager]] supports two URL formats: the default URL format and the pretty URL format. -The first step of routing is to parse the incoming request into a route which, as described in -the [Controllers](structure-controllers.md#routes) section, is used to address a controller action. -This is done by [[yii\web\Request::resolve()|resolve()]] method of the `request` application component. -The method invokes the [URL manager](runtime-url-handling.md) to do the actual request parsing work. +The default URL format uses a query parameter named `r` to represent the route and normal query parameters +to represent the parameters associated with the route. For example, the URL `/index.php?r=post/view&id=100` represents +the route `post/view` and the `id` parameter 100. The default URL format does not require any configuration about +the [[yii\web\UrlManager|URL manager]] and works in any Web server setup. + +The pretty URL format uses the extra path following the entry script name to represent the route and the associated +parameters. For example, the extra path in the URL `/index.php/post/100` is `/post/100` which may represent +the route `post/view` and the `id` parameter 100 with a proper [[yii\web\UrlManager::rules|URL rule]]. To use +the pretty URL format, you will need to design a set of [[yii\web\UrlManager::rules|URL rules]] according to the actual +requirement about how the URLs should look like. + +You may switch between the two URL formats by toggling the [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] +property of the [[yii\web\UrlManager|URL manager]] without changing any other application code. + + +## Routing + +Routing involves two steps. In the first step, the incoming request is parsed into a route and the associated +parameters. In the second step, a [controller action](structure-controllers.md) corresponding to the parsed route +is created to handle the request. + +When using the default URL format, parsing a request into a route is as simple as getting the value of a `GET` +parameter named `r`. When using the pretty URL format, however, it requires examining the registered +[[yii\web\UrlManager::rules|URL rules]] to find one that can resolve the request into a route. If such a rule cannot +be found, a [[yii\web\NotFoundHttpException]] exception will be thrown. + +Once the request is parsed into a route, it is time to create the controller action identified by the route. +The route is broken down into multiple parts by the slashes in it. For example, `site/index` will be +broken into `site` and `index`. Each part is an ID which may refer to a module, a controller or an action. +Starting from the first part in the route, the application conducts the following steps to create modules (if any), +the controller and the action: -By default, if the incoming request contains a `GET` parameter named `r`, its value will be considered -as the route. However, if the [[yii\web\UrlManager::enablePrettyUrl|pretty URL feature]] is enabled, -more work will be done to determine the requested route. For more details, please refer to -the [URL Parsing and Generation](runtime-url-handling.md) section. +1. Set the application as the current module. +2. Check if the [[yii\base\Module::controllerMap|controller map]] of the current module contains the current ID. + If so, a controller object will be created according to the controller configuration found in the map, + and Step 5 will be taken to handle the rest part of the route. +3. Check if the ID refers to a module listed in the [[yii\base\Module::modules|modules]] property of + the current module. If so, a module is created according to the configuration found in the module list, + and Step 2 will be taken to handle the next part of the route under the context of the newly created module. +4. Treat the ID as a controller ID and create a controller object. Do the next step with the rest part of + the route. +5. The controller looks for the current ID in its [[yii\base\Controller::actions()|action map]]. If found, + it creates an action according to the configuration found in the map. Otherwise, the controller will + attempt to create an inline action which is defined by an action method corresponding to the current ID. -In case a route cannot be determined, the `request` component will throw a [[yii\web\NotFoundHttpException]]. +Among the above steps, if any error occurs, a [[yii\web\NotFoundHttpException]] will be thrown, indicating +failure of the routing process. ### Default Route -If an incoming request does not specify a route, which often happens to the request for homepages, -the route specified by [[yii\web\Application::defaultRoute]] will be used. The default value of this property -is `site/index`, which refers to the `index` action of the `site` controller. You may customize this property +When a request is parsed into an empty route, the so-called *default route* will be used, instead. By default, +the default route is `site/index`, which refers to the `index` action of the `site` controller. You may customize +customize it by configuring the [[yii\web\Application::defaultRoute|defaultRoute]] property of the application in the application configuration like the following: ```php -return [ +[ // ... 'defaultRoute' => 'main/index', ]; @@ -43,41 +113,368 @@ informational page for all requests. There are many ways to accomplish this goal ways is to configure the [[yii\web\Application::catchAll]] property like the following in the application configuration: ```php -return [ +[ // ... 'catchAll' => ['site/offline'], ]; ``` +With the above configuration, the `site/offline` action will be used to handle all incoming requests. + The `catchAll` property should take an array whose first element specifies a route, and -the rest of the elements (name-value pairs) specify the parameters to be bound to the action. +the rest of the elements (name-value pairs) specify the parameters to be [bound to the action](structure-controllers.md#action-parameters). -When the `catchAll` property is set, it will replace any route resolved from the incoming requests. -With the above configuration, the same `site/offline` action will be used to handle all incoming requests. +## Creating URLs -## Creating Action +Yii provides a helper method [[yii\helpers\Url::to()]] to create various kinds of URLs from given routes and +their associated parameters. For example, -Once the requested route is determined, the next step is to create the action object corresponding to the route. +```php +use yii\helpers\Url; -The route is broken down into multiple parts by the slashes in it. For example, `site/index` will be -broken into `site` and `index`. Each part is an ID which may refer to a module, a controller or an action. +// creates a URL to a route: /index.php?r=post/index +echo Url::to(['post/index']); -Starting from the first part in the route, the application conducts the following steps to create modules (if any), -the controller and the action: +// creates a URL to a route with parameters: /index.php?r=post/view&id=100 +echo Url::to(['post/view', 'id' => 100]); -1. Set the application as the current module. -2. Check if the [[yii\base\Module::controllerMap|controller map]] of the current module contains the current ID. - If so, a controller object will be created according to the controller configuration found in the map, - and do Step 5 with the rest parts of the route. -3. Check if the ID refers to a module listed in the [[yii\base\Module::modules|modules]] property of - the current module. If so, a module is created according to the configuration found in the module list, - and do Step 2 with the next part in the route under the context of the newly created module. -4. Treat the ID as a controller ID and create a controller object. Do the next step with the rest part of - the route. -5. The controller looks for the current ID in its [[yii\base\Controller::actions()|action map]]. If found, - it creates an action according to the configuration found in the map. Otherwise, the controller will - attempt to create an inline action which is defined by an action method corresponding to the current ID. +// creates an anchored URL: /index.php?r=post/view&id=100#content +echo Url::to(['post/view', 'id' => 100, '#' => 'content']); + +// creates an absolute URL: http://www.example.com/index.php?r=post/index +echo Url::to(['post/index'], true); + +// creates an absolute URL using https scheme: https://www.example.com/index.php?r=post/index +echo Url::to(['post/index'], 'https'); +``` + +Note that in the above example, we assume the default URL format is being used. If the pretty URL format is enabled, +the created URLs will be different, according to the [[yii\web\UrlManager::rules|URL rules]] in use. + +The route passed to the [[yii\helpers\Url::to()]] method is context sensitive. It can be either a *relative* route +or an *absolute* route which will be normalized according to the following rules: + +- If the route is an empty string, the currently requested [[yii\web\Controller::route|route]] will be used; +- If the route contains no slashes at all, it is considered to be an action ID of the current controller + and will be prepended with the [[\yii\web\Controller::uniqueId|uniqueId]] value of the current controller; +- If the route has no leading slash, it is considered to be a route relative to the current module and + will be prepended with the [[\yii\base\Module::uniqueId|uniqueId]] value of the current module. + +For example, assume the current module is `admin` and the current controller is `post`, + +```php +use yii\helpers\Url; + +// currently requested route: /index.php?r=admin/post/index +echo Url::to(['']); + +// a relative route with action ID only: /index.php?r=admin/post/index +echo Url::to(['index']); + +// a relative route: /index.php?r=admin/post/index +echo Url::to(['post/index']); + +// an absolute route: /index.php?r=post/index +echo Url::to(['/post/index']); +``` + +The [[yii\helpers\Url::to()]] method is implemented by calling the [[yii\web\UrlManager::createUrl()|createUrl()]] +and [[yii\web\UrlManager::createAbsoluteUrl()|createAbsoluteUrl()]] methods of the [[yii\web\UrlManager|URL manager]]. +In the next few subsections, we will explain how to configure the [[yii\web\UrlManager|URL manager]] to customize +the format of the created URLs. + +The [[yii\helpers\Url::to()]] method also supports creating URLs that are NOT related with particular routes. +Instead of passing an array as its first parameter, you should pass a string in this case. For example, + +```php +use yii\helpers\Url; + +// currently requested URL: /index.php?r=admin/post/index +echo Url::to(); + +// an aliased URL: http://example.com +Yii::setAlias('@example', 'http://example.com/'); +echo Url::to('@example'); + +// an absolute URL: http://example.com/images/logo.gif +echo Url::to('/images/logo.gif', true); +``` + +Besides the `to()` method, the [[yii\helpers\Url]]` helper class also provides several other convenient URL creation +methods. For example, + +```php +use yii\helpers\Url; + +// home page URL: /index.php?r=site/index +echo Url::home(); + +// the base URL, useful if the application is deployed in a sub-folder of the Web root +echo Url::base(); + +// the canonical URL of the currently requested URL +// see https://en.wikipedia.org/wiki/Canonical_link_element +echo Url::canonical(); + +// remember the currently requested URL and retrieve it back in later requests +Url::remember(); +echo Url::previous(); +``` + + +## Using Pretty URLs + +To use pretty URLs, configure the `urlManager` component in the application configuration like the following: + +```php +[ + 'components' => [ + 'urlManager' => [ + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'enableStrictParsing' => true, + 'rules' => [ + // ... + ], + ], + ], +] +``` + +where + +* [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]]: this property toggles the pretty URL format. +* [[yii\web\UrlManager::showScriptName|showScriptName]]: this property determines whether the entry script + should be included in the created URLs. For example, in stead of creating a URL `/index.php/post/100`, + by setting this property to be true, a URL `/post/100` may be generated. +* [[yii\web\UrlManager::enableStrictParsing|enableStrictParsing]]: this property determines whether to enable + strict request parsing. If strict parsing is enabled, the incoming requested URL must match at least one of + the [[yii\web\UrlManager::rules|rules]] in order to be treated as a valid request, or a [[yii\web\NotFoundHttpException]] + will be thrown. If strict parsing is disabled, when none of the [[yii\web\UrlManager::rules|rules]] matches + the requested URL, the path info part of the URL will be treated as the requested route. +* [[yii\web\UrlManager::rules|rules]]: this property contains a list of rules specifying how to parse and create + URLs. It is the main property that you should work with in order to create URLs whose format satisfies your + particular application requirement. + +> Note: In order to hide the entry script name in the created URLs, besides setting + [[yii\web\UrlManager::showScriptName|showScriptName]] to be true, you may also need to configure your Web server + so that it can correctly identify which PHP script should be executed when a requested URL does not explicitly + specify one. If you are using Apache Web server, you may refer to the recommended configuration as described in the + [Installation](start-installation.md#recommended-apache-configuration) section. + + +### URL Rules + +URL rules are objects responsible for parsing and creating URLs when the pretty URL format is used. You declare +the URL rules by configuring them in the [[yii\web\UrlManager::rules]] property. The property takes an array with +each element specifying a single URL rule. When the [[yii\web\UrlManager|URL manager]] is parsing an incoming request, +it examines the rules in the order they are declared and looks for the *first* rule that matches the requested URL. +The matching rule is then used to parse the URL into a route and its associated parameters. Similarly, when +the [[yii\web\UrlManager|URL manager]] is used to create a URL, it looks for the first rule that matches the given +route and parameters and uses it to create a URL. + +The following [[yii\web\UrlManager::rules|rules]] configuration declares two URL rules. The first rule matches +a URL `posts` and maps it into the route `post/index`. The second rule matches a URL matching the regular expression +`post/(\d+)` and maps it into the route `post/view` and a parameter named `id`. + +```php +[ + 'posts' => 'post/index', + 'post/' => 'post/view', +] +``` + +> Info: Only the path info part of a URL is used to match against a rule. The path info of a URL is the part + after the entry script and before the query string. For example, the path info of `/index.php/post/100?source=ad` + is `/post/100`. When performing the matching test, both of the leading and ending slashes in the path info are ignored. + + +### Named Parameters + +A URL rule can be associated with a few named parameters. When the rule is used to parse a URL, it will fill these +parameters with values matching various parts of the URL. And when the rule is used to create a URL, it will take the +values of the provided parameters and insert them into various parts of the URL being created. + +To specify a named parameter, embed in the URL pattern with a token `` or ``, +where `ParamName` specifies the parameter name and `Pattern` is a regular expression that the parameter value should +match. If `Pattern` is not specified, it means the parameter should match any characters except `/`. + +Let's use some examples to explain how URL rules work. Assume we have declared the following URL rules: + +```php +[ + 'posts' => 'post/index', + 'post/' => 'post/view', + 'posts//' => 'post/index', +] +``` + +* Parsing URLs + - `/index.php/posts` is parsed into the route `post/index` using the first rule; + - `/index.php/posts/2014/php` is parsed into the route `post/index`, the `year` parameter whose value is 2014 + and the `category` parameter whose value is `php` using the third rule; + - `/index.php/post/100` is parsed into the route `post/view` and the `id` parameter whose value is 100 using + the second rule; + - `/index.php/posts/php` will cause a [[yii\web\NotFoundHttpException]] when [[yii\web\UrlManager::enableStrictParsing]] + is true, because it matches none of the patterns. If [[yii\web\UrlManager::enableStrictParsing]] is false (the + default value), the path info part `posts/php` will be returned as the route. +* Creating URLs + - `Url::to(['post/index'])` creates `/index.php/posts` using the first rule; + - `Url::to(['post/index', 'year' => 2014, 'category' => 'php'])` creates `/index.php/posts/2014/php` using the + third rule; + - `Url::to(['post/view', 'id' => 100])` creates `/index.php/post/100` using the second rule; + - `Url::to(['post/view', 'id' => 100, 'source' => 'ad'])` creates `/index.php/post/100?source=ad` using the second rule. + Because the `source` parameter is not specified in the rule, it is appended as a query parameter in the created URL. + - `Url::to(['post/index', 'category' => 'php'])` creates `/index.php/post/index?category=php` using none of rules. + Note that since none of the rules applies, the URL is created by simply appending the route as the path info + and all parameters as the query string part. + + +### Parameterizing Routes + +Rules may also make use of named parameters as part of a route. Named parameters allow a rule to be applied to multiple routes based +on matching criteria. Named parameters may also help reduce the number of rules needed for an application, and thus improve the overall +performance. + +The following example rules illustrate how to parameterize routes with named parameters: + +```php +[ + '//' => '/', + '/' => '/read', + 's' => '/list', +] +``` + +In the above example, two named parameters are found in the route part of the rules: `controller` and `action`. The former matches a controller ID that's either "post" or "comment", while the latter matches an action ID that could be "create", "update", or "delete". You may name the parameters differently as long as they do not conflict with any GET parameters that may appear in your URLs. + +Using the above rules, the URL `/index.php/post/123/create` will be parsed as the route `post/create` with `GET` parameter +`id=123`. Given the route `comment/list` and `GET` parameter `page=2`, Yii can create a URL `/index.php/comments?page=2`. + + +### Parameterizing Hostnames + +It is also possible to include hostnames in the rules for parsing and creating URLs. One may extract part of the hostname +to be a `GET` parameter. This is especially useful for handling subdomains. For example, the URL +`http://admin.example.com/en/profile` may be parsed into GET parameters `user=admin` and `lang=en`. On the other hand, +rules with hostnames may also be used to create URLs with parameterized hostnames. + +In order to use parameterized hostnames, simply declare the URL rules while including the host info: + +```php +[ + 'http://.example.com//profile' => 'user/profile', +] +``` + +In the above example, the first segment of the hostname is treated as the "user" parameter while the first segment +of the pat is treated as the "lang" parameter. The rule corresponds to the `user/profile` route. + +Note that [[yii\web\UrlManager::showScriptName]] will not take effect when a URL is being created using a rule with a parameterized hostname. + +Also note that any rule with a parameterized hostname should NOT contain the subfolder if the application is under +a subfolder of the web root. For example, if the application is under `http://www.example.com/sandbox/blog`, then you +should still use the same URL rule as described above without the subfolder `sandbox/blog`. + +### Faking URL Suffix + +```php + [ + 'urlManager' => [ + 'suffix' => '.html', + ], + ], +]; +``` + +### Handling REST requests + +TBD: +- RESTful routing: [[yii\filters\VerbFilter]], [[yii\web\UrlManager::$rules]] +- Json API: + - response: [[yii\web\Response::format]] + - request: [[yii\web\Request::$parsers]], [[yii\web\JsonParser]] + + +### Customizing URL Rules + +[[yii\web\UrlRule]] class is used for both parsing URL into parameters and creating URL based on parameters. Despite +the fact that default implementation is flexible enough for the majority of projects, there are situations when using +your own rule class is the best choice. For example, in a car dealer website, we may want to support the URL format like +`/Manufacturer/Model`, where `Manufacturer` and `Model` must both match some data in a database table. The default rule +class will not work because it mostly relies on statically declared regular expressions which have no database knowledge. + +We can write a new URL rule class by extending from [[yii\web\UrlRule]] and use it in one or multiple URL rules. Using +the above car dealer website as an example, we may declare the following URL rules in application config: + +```php +// ... +'components' => [ + 'urlManager' => [ + 'rules' => [ + '' => 'site/', + + // ... + + ['class' => 'app\components\CarUrlRule', 'connectionID' => 'db', /* ... */], + ], + ], +], +``` + +In the above, we use the custom URL rule class `CarUrlRule` to handle +the URL format `/Manufacturer/Model`. The class can be written like the following: + +```php +namespace app\components; + +use yii\web\UrlRule; + +class CarUrlRule extends UrlRule +{ + public $connectionID = 'db'; + + public function init() + { + if ($this->name === null) { + $this->name = __CLASS__; + } + } + + public function createUrl($manager, $route, $params) + { + if ($route === 'car/index') { + if (isset($params['manufacturer'], $params['model'])) { + return $params['manufacturer'] . '/' . $params['model']; + } elseif (isset($params['manufacturer'])) { + return $params['manufacturer']; + } + } + return false; // this rule does not apply + } + + public function parseRequest($manager, $request) + { + $pathInfo = $request->getPathInfo(); + if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) { + // check $matches[1] and $matches[3] to see + // if they match a manufacturer and a model in the database + // If so, set $params['manufacturer'] and/or $params['model'] + // and return ['car/index', $params] + } + return false; // this rule does not apply + } +} +``` + +Besides the above usage, custom URL rule classes can also be implemented +for many other purposes. For example, we can write a rule class to log the URL parsing +and creation requests. This may be useful during development stage. We can also +write a rule class to display a special 404 error page in case all other URL rules fail +to resolve the current request. Note that in this case, the rule of this special class +must be declared as the last rule. -Among the above steps, if any error occurs, a [[yii\web\NotFoundHttpException]] will be thrown, indicating -failure of the routing. diff --git a/docs/guide/runtime-url-handling.md b/docs/guide/runtime-url-handling.md deleted file mode 100644 index b1b7e7b..0000000 --- a/docs/guide/runtime-url-handling.md +++ /dev/null @@ -1,360 +0,0 @@ -URL Parsing and Generation -========================== - -> Note: This section is under development. - -The concept of *URL management* in Yii is fairly simple: the application simply uses internal routes and parameters everywhere. The framework itself will then translate routes into URLs, and vice versa, according to the URL manager's configuration. This approach allows you to make site-wide changes to URLs merely by -editing a single configuration file, without ever touching any application code. - -Internal Routes ---------------- - -When implementing an application using Yii, you'll deal with *internal* routes, often referred to as "routes and parameters". -Each controller and controller action has a corresponding internal route, such as `site/index` or `user/create`. - -In the first example, `site` is the *controller ID*, while `index` is the *action ID*. In the -second example, `user` is the controller ID and `create` is the action ID. - -If the controller belongs to a *module*, the -internal route is prefixed with the module ID: for example, `blog/post/index` represents a blog module, the module's `post` -controller, and the `index` action. - -Creating URLs -------------- - -The most important rule for creating URLs in your site is to always do so through the URL manager. The URL manager is a built-in application component fittingly named `urlManager`. This component is accessible from both web and console applications via -`\Yii::$app->urlManager`. The component makes available two methods for creating URLs: - -- `createUrl($params)` -- `createAbsoluteUrl($params, $schema = null)` - -The `createUrl` method creates an URL relative to the application root, such as `/index.php/site/index/`. -The `createAbsoluteUrl` method creates an URL that beings with with the proper protocol and hostname: -`http://www.example.com/index.php/site/index`. Relative URLs, and the `createUrl` method are suitable for internal application URLs, while absolute URLs, and the `createAbsoluteUrl` method, are appropriate when you need to create URLs for external resources, such as connecting to third party services, sending email, -generating RSS feeds, etc. - -Both methods can be passed parameters used to further customize the URL, such as appending values to pass along as part of the request. - -Some examples of these two methods: - -```php -echo \Yii::$app->urlManager->createUrl(['site/page', 'id' => 'about']); -// /index.php/site/page/id/about/ -echo \Yii::$app->urlManager->createUrl(['date-time/fast-forward', 'id' => 105]) -// /index.php?r=date-time/fast-forward&id=105 -echo \Yii::$app->urlManager->createAbsoluteUrl('blog/post/index'); -// http://www.example.com/index.php/blog/post/index/ -``` - -The exact format of the resulting URL depends on how the URL manager is configured. The above -examples could also output: - -* `/site/page/id/about/` -* `/index.php?r=site/page&id=about` -* `/index.php?r=date-time/fast-forward&id=105` -* `/index.php/date-time/fast-forward?id=105` -* `http://www.example.com/blog/post/index/` -* `http://www.example.com/index.php?r=blog/post/index` - -In order to simplify URL creation, Yii has the [[yii\helpers\Url]] helper. Assuming the current URL is `/index.php?r=management/default/users&id=10`, the following -shows how the `Url` helper works: - -```php -use yii\helpers\Url; - -// currently active route -// /index.php?r=management/default/users -echo Url::to(''); - -// same controller, different action -// /index.php?r=management/default/page&id=contact -echo Url::toRoute(['page', 'id' => 'contact']); - -// same module, different controller and action -// /index.php?r=management/post/index -echo Url::toRoute('post/index'); - -// absolute route no matter what controller is making this call -// /index.php?r=site/index -echo Url::toRoute('/site/index'); - -// url for the case sensitive action `actionHiTech` of the current controller -// /index.php?r=management/default/hi-tech -echo Url::toRoute('hi-tech'); - -// url for action the case sensitive controller, `DateTimeController::actionFastForward` -// /index.php?r=date-time/fast-forward&id=105 -echo Url::toRoute(['/date-time/fast-forward', 'id' => 105]); - -// get URL from alias -// http://google.com/ -Yii::setAlias('@google', 'http://google.com/'); -echo Url::to('@google'); - -// get home URL -// /index.php?r=site/index -echo Url::home(); - -Url::remember(); // save URL to be used later -Url::previous(); // get previously saved URL -``` - -> **Tip**: In order to generate a URL containing a hashtag, for example `/index.php?r=site/page&id=100#title`, you need to - specify the parameter named `#` using `Url::to(['post/read', 'id' => 100, '#' => 'title'])`. - -There's also the `Url::canonical()` method that allows you to generate -[canonical URLs](https://en.wikipedia.org/wiki/Canonical_link_element) for the current action. -This method ignores all action parameters except for ones specifically passed via action arguments: - -```php -namespace app\controllers; - -use yii\web\Controller; -use yii\helpers\Url; - -class CanonicalController extends Controller -{ - public function actionTest($page) - { - echo Url::canonical(); - } -} -``` - -When accessed as `/index.php?r=canonical/test&page=hello&number=42`, the canonical URL will be `/index.php?r=canonical/test&page=hello`. - -Customizing URLs ----------------- - -By default, Yii uses a query string format for URLs, such as `/index.php?r=news/view&id=100`. In order to make URLs -human-friendly (i.e., more legible), you need to configure the `urlManager` component in the application's configuration -file. Enabling "pretty" URLs will convert the query string format to a directory-based format: `/index.php/news/view?id=100`. - - -Disabling the `showScriptName` parameter further customizes the URL such that `index.php` will be omitted. Here's the relevant part of -the application's configuration file: - -```php - [ - 'urlManager' => [ - 'enablePrettyUrl' => true, - 'showScriptName' => false, - ], - ], -]; -``` - -Note that this configuration will only work if the web server has also been properly configured for Yii, see -[installation](start-installation.md#recommended-apache-configuration). - -### Named Parameters - -A rule can be associated with a few `GET` parameters. These `GET` parameters appear in the rule's pattern as special tokens in the following format: - -``` - -``` - -`ParameterName` is a name of a `GET` parameter, and the optional `ParameterPattern` is the regular expression that should -be used to match the value of the `GET` parameter. When `ParameterPattern` is omitted, it means the parameter -should match any characters except `/`. When creating a URL, these parameter tokens will be replaced with the -corresponding parameter values; when parsing a URL, the corresponding GET parameters will be populated with the parsed results. - -Let's use some examples to explain how URL rules work. Asusuming that the rule set consists of three rules: - -```php -[ - 'posts'=>'post/list', - 'post/'=>'post/read', - 'post//'=>'post/read', -] -``` - -- Calling `Url::toRoute('post/list')` generates `/index.php/posts`. The first rule is applied. -- Calling `Url::toRoute(['post/read', 'id' => 100])` generates `/index.php/post/100`. The second rule is applied. -- Calling `Url::toRoute(['post/read', 'year' => 2008, 'title' => 'a sample post'])` generates - `/index.php/post/2008/a%20sample%20post`. The third rule is applied. -- Calling `Url::toRoute('post/read')` generates `/index.php/post/read`. None of the rules is applied; convention is used instead. - -In summary, when using `createUrl` to generate a URL, the route and the `GET` parameters passed to the method are used to -decide which URL rule will be applied. If every parameter associated with a rule can be found in the `GET` parameters passed -to `createUrl`, and if the route of the rule also matches the route parameter, the rule will be used to generate the URL. - -If the `GET` parameters passed to `Url::toRoute` are more than those required by a rule, the additional parameters will -appear in the query string. For example, the call `Url::toRoute(['post/read', 'id' => 100, 'year' => 2008])`, will -generate `/index.php/post/100?year=2008`. - -As mentioned earlier, the other purpose of URL rules is to parse the requesting URLs. Naturally, this is the inverse of URL creation. For example, when a user requests for `/index.php/post/100`, the second rule in the above example -will apply, which resolves to the route `post/read` with the `GET` parameter `['id' => 100]` (accessible via -`Yii::$app->request->get('id')`). - -### Parameterizing Routes - -Rules may also make use of named parameters as part of a route. Named parameters allow a rule to be applied to multiple routes based -on matching criteria. Named parameters may also help reduce the number of rules needed for an application, and thus improve the overall -performance. - -The following example rules illustrate how to parameterize routes with named parameters: - -```php -[ - '<controller:(post|comment)>/<id:\d+>/<action:(create|update|delete)>' => '<controller>/<action>', - '<controller:(post|comment)>/<id:\d+>' => '<controller>/read', - '<controller:(post|comment)>s' => '<controller>/list', -] -``` - -In the above example, two named parameters are found in the route part of the rules: `controller` and `action`. The former matches a controller ID that's either "post" or "comment", while the latter matches an action ID that could be "create", "update", or "delete". You may name the parameters differently as long as they do not conflict with any GET parameters that may appear in your URLs. - -Using the above rules, the URL `/index.php/post/123/create` will be parsed as the route `post/create` with `GET` parameter -`id=123`. Given the route `comment/list` and `GET` parameter `page=2`, Yii can create a URL `/index.php/comments?page=2`. - -### Parameterizing Hostnames - -It is also possible to include hostnames in the rules for parsing and creating URLs. One may extract part of the hostname -to be a `GET` parameter. This is especially useful for handling subdomains. For example, the URL -`http://admin.example.com/en/profile` may be parsed into GET parameters `user=admin` and `lang=en`. On the other hand, -rules with hostnames may also be used to create URLs with parameterized hostnames. - -In order to use parameterized hostnames, simply declare the URL rules while including the host info: - -```php -[ - 'http://<user:\w+>.example.com/<lang:\w+>/profile' => 'user/profile', -] -``` - -In the above example, the first segment of the hostname is treated as the "user" parameter while the first segment -of the pat is treated as the "lang" parameter. The rule corresponds to the `user/profile` route. - -Note that [[yii\web\UrlManager::showScriptName]] will not take effect when a URL is being created using a rule with a parameterized hostname. - -Also note that any rule with a parameterized hostname should NOT contain the subfolder if the application is under -a subfolder of the web root. For example, if the application is under `http://www.example.com/sandbox/blog`, then you -should still use the same URL rule as described above without the subfolder `sandbox/blog`. - -### Faking URL Suffix - -```php -<?php -return [ - // ... - 'components' => [ - 'urlManager' => [ - 'suffix' => '.html', - ], - ], -]; -``` - -### Handling REST requests - -TBD: -- RESTful routing: [[yii\filters\VerbFilter]], [[yii\web\UrlManager::$rules]] -- Json API: - - response: [[yii\web\Response::format]] - - request: [[yii\web\Request::$parsers]], [[yii\web\JsonParser]] - - -URL parsing ------------ - -Complimentary to creating URLs Yii also handles transforming custom URLs back into internal routes and parameters. - -### Strict URL parsing - -By default if there's no custom rule for a URL and the URL matches the default format such as `/site/page`, Yii tries to run the corresponding controller's action. This behavior can be disabled so if there's no custom rule match, a 404 not found error will be produced immediately. - -```php -<?php -return [ - // ... - 'components' => [ - 'urlManager' => [ - 'enableStrictParsing' => true, - ], - ], -]; -``` - -Creating your own rule classes ------------------------------- - -[[yii\web\UrlRule]] class is used for both parsing URL into parameters and creating URL based on parameters. Despite -the fact that default implementation is flexible enough for the majority of projects, there are situations when using -your own rule class is the best choice. For example, in a car dealer website, we may want to support the URL format like -`/Manufacturer/Model`, where `Manufacturer` and `Model` must both match some data in a database table. The default rule -class will not work because it mostly relies on statically declared regular expressions which have no database knowledge. - -We can write a new URL rule class by extending from [[yii\web\UrlRule]] and use it in one or multiple URL rules. Using -the above car dealer website as an example, we may declare the following URL rules in application config: - -```php -// ... -'components' => [ - 'urlManager' => [ - 'rules' => [ - '<action:(login|logout|about)>' => 'site/<action>', - - // ... - - ['class' => 'app\components\CarUrlRule', 'connectionID' => 'db', /* ... */], - ], - ], -], -``` - -In the above, we use the custom URL rule class `CarUrlRule` to handle -the URL format `/Manufacturer/Model`. The class can be written like the following: - -```php -namespace app\components; - -use yii\web\UrlRule; - -class CarUrlRule extends UrlRule -{ - public $connectionID = 'db'; - - public function init() - { - if ($this->name === null) { - $this->name = __CLASS__; - } - } - - public function createUrl($manager, $route, $params) - { - if ($route === 'car/index') { - if (isset($params['manufacturer'], $params['model'])) { - return $params['manufacturer'] . '/' . $params['model']; - } elseif (isset($params['manufacturer'])) { - return $params['manufacturer']; - } - } - return false; // this rule does not apply - } - - public function parseRequest($manager, $request) - { - $pathInfo = $request->getPathInfo(); - if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) { - // check $matches[1] and $matches[3] to see - // if they match a manufacturer and a model in the database - // If so, set $params['manufacturer'] and/or $params['model'] - // and return ['car/index', $params] - } - return false; // this rule does not apply - } -} -``` - -Besides the above usage, custom URL rule classes can also be implemented -for many other purposes. For example, we can write a rule class to log the URL parsing -and creation requests. This may be useful during development stage. We can also -write a rule class to display a special 404 error page in case all other URL rules fail -to resolve the current request. Note that in this case, the rule of this special class -must be declared as the last rule. diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index 06851b2..e60b30b 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -158,9 +158,9 @@ DocumentRoot "path/to/basic/web" ### Recommended Nginx Configuration <a name="recommended-nginx-configuration"></a> -You should have installed PHP as an [FPM SAPI](http://php.net/install.fpm) to use [Nginx](http://wiki.nginx.org/). -Use the following Nginx configuration, replacing `path/to/basic/web` with the actual path for `basic/web` and `mysite.local` with -the actual hostname to serve. +To use [Nginx](http://wiki.nginx.org/), you should install PHP as an [FPM SAPI](http://php.net/install.fpm). +You may use the following Nginx configuration, replacing `path/to/basic/web` with the actual path for +`basic/web` and `mysite.local` with the actual hostname to serve. ``` server { diff --git a/docs/guide/structure-controllers.md b/docs/guide/structure-controllers.md index 79737be..7e0c124 100644 --- a/docs/guide/structure-controllers.md +++ b/docs/guide/structure-controllers.md @@ -84,8 +84,8 @@ ModuleID/ControllerID/ActionID ``` So if a user requests with the URL `http://hostname/index.php?r=site/index`, the `index` action in the `site` controller -will be executed. For more details how routes are resolved into actions, please refer to -the [Routing](runtime-routing.md) section. +will be executed. For more details on how routes are resolved into actions, please refer to +the [Routing and URL Generation](runtime-routing.md) section. ## Creating Controllers <a name="creating-controllers"></a> diff --git a/docs/internals/translation-status.md b/docs/internals/translation-status.md index 1c9bea2..6a24519 100644 --- a/docs/internals/translation-status.md +++ b/docs/internals/translation-status.md @@ -27,11 +27,10 @@ structure-assets.md | Yes structure-extensions.md | Yes runtime-overview.md | Yes runtime-bootstrapping.md | Yes -runtime-routing.md | Yes +runtime-routing.md | runtime-requests.md | Yes runtime-responses.md | Yes runtime-sessions-cookies.md | Yes -runtime-url-handling.md | runtime-handling-errors.md | Yes runtime-logging.md | Yes concept-components.md | Yes From 53cb1047ce27b9e86202bbfa1dcaebec07536296 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara <softark@gmail.com> Date: Sun, 2 Nov 2014 22:53:21 +0900 Subject: [PATCH 046/144] docs/guide/structure-views.md - missing ".php" [ci skip] --- docs/guide/structure-views.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-views.md b/docs/guide/structure-views.md index f29adbd..beb77f9 100644 --- a/docs/guide/structure-views.md +++ b/docs/guide/structure-views.md @@ -238,7 +238,7 @@ A view name is resolved into the corresponding view file path according to the f context to the view name. This mainly applies to the views rendered within controllers and widgets. For example, `site/about` will be resolved into `@app/views/site/about.php` if the context is the controller `SiteController`. * If a view is rendered within another view, the directory containing the other view file will be prefixed to - the new view name to form the actual view file path. For example, `item` will be resolved into `@app/views/post/item` + the new view name to form the actual view file path. For example, `item` will be resolved into `@app/views/post/item.php` if it is being rendered in the view `@app/views/post/index.php`. According to the above rules, calling `$this->render('view')` in a controller `app\controllers\PostController` will From be84215be6396825807a878734038a6ea0987d0c Mon Sep 17 00:00:00 2001 From: Anton Andersen <trianman@gmail.com> Date: Mon, 3 Nov 2014 19:48:25 +0400 Subject: [PATCH 047/144] Fix upgrade doc [skip ci] --- framework/UPGRADE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index 47c04fe..365bd38 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -200,6 +200,7 @@ new ones save the following code as `convert.php` that should be placed in the s * Static helper `yii\helpers\Security` has been converted into an application component. You should change all usage of its methods to a new syntax, for example: instead of `yii\helpers\Security::hashData()` use `Yii::$app->getSecurity()->hashData()`. + The `generateRandomString()` method now produces not ASCII compatible ouput. Use `generateRandomString()` instead. Default encryption and hash parameters has been upgraded. If you need to decrypt/validate data that was encrypted/hashed before, use the following configuration of the 'security' component: From 14f9d1490d27cee41e84348a8f0c2d9cd2a7eb1a Mon Sep 17 00:00:00 2001 From: Anton Andersen <trianman@gmail.com> Date: Mon, 3 Nov 2014 19:53:54 +0400 Subject: [PATCH 048/144] Fix typo [skip ci] --- framework/UPGRADE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index 365bd38..0701e0c 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -200,7 +200,7 @@ new ones save the following code as `convert.php` that should be placed in the s * Static helper `yii\helpers\Security` has been converted into an application component. You should change all usage of its methods to a new syntax, for example: instead of `yii\helpers\Security::hashData()` use `Yii::$app->getSecurity()->hashData()`. - The `generateRandomString()` method now produces not ASCII compatible ouput. Use `generateRandomString()` instead. + The `generateRandomString()` method now produces not an ASCII compatible ouput. Use `generateRandomString()` instead. Default encryption and hash parameters has been upgraded. If you need to decrypt/validate data that was encrypted/hashed before, use the following configuration of the 'security' component: From 4ee638c4bd9a8263f4b825bc9edaa7aa6104a305 Mon Sep 17 00:00:00 2001 From: Anton Andersen <trianman@gmail.com> Date: Mon, 3 Nov 2014 20:16:44 +0400 Subject: [PATCH 049/144] Fix typo [skip ci] --- framework/UPGRADE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index 0701e0c..cb36ea9 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -200,7 +200,7 @@ new ones save the following code as `convert.php` that should be placed in the s * Static helper `yii\helpers\Security` has been converted into an application component. You should change all usage of its methods to a new syntax, for example: instead of `yii\helpers\Security::hashData()` use `Yii::$app->getSecurity()->hashData()`. - The `generateRandomString()` method now produces not an ASCII compatible ouput. Use `generateRandomString()` instead. + The `generateRandomKey()` method now produces not an ASCII compatible ouput. Use `generateRandomString()` instead. Default encryption and hash parameters has been upgraded. If you need to decrypt/validate data that was encrypted/hashed before, use the following configuration of the 'security' component: From 17960584c0fc2b13ab960c71535401af13433dfc Mon Sep 17 00:00:00 2001 From: Anton Andersen <trianman@gmail.com> Date: Mon, 3 Nov 2014 20:21:53 +0400 Subject: [PATCH 050/144] Fix typo [skip ci] --- framework/UPGRADE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index cb36ea9..12928c8 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -200,7 +200,7 @@ new ones save the following code as `convert.php` that should be placed in the s * Static helper `yii\helpers\Security` has been converted into an application component. You should change all usage of its methods to a new syntax, for example: instead of `yii\helpers\Security::hashData()` use `Yii::$app->getSecurity()->hashData()`. - The `generateRandomKey()` method now produces not an ASCII compatible ouput. Use `generateRandomString()` instead. + The `generateRandomKey()` method now produces not an ASCII compatible output. Use `generateRandomString()` instead. Default encryption and hash parameters has been upgraded. If you need to decrypt/validate data that was encrypted/hashed before, use the following configuration of the 'security' component: From 2f29c87c9736ce144f0f707a21d6edbb0e4b074f Mon Sep 17 00:00:00 2001 From: RichWeber <rbagatyi@gmail.com> Date: Mon, 3 Nov 2014 19:04:23 +0200 Subject: [PATCH 051/144] add structure-application-components.md --- docs/guide-uk/structure-application-components.md | 87 +++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 docs/guide-uk/structure-application-components.md diff --git a/docs/guide-uk/structure-application-components.md b/docs/guide-uk/structure-application-components.md new file mode 100644 index 0000000..39fabbe --- /dev/null +++ b/docs/guide-uk/structure-application-components.md @@ -0,0 +1,87 @@ +Компоненти додатка +===================== + +Додатки є [сервіс локаторами](concept-service-locators.md). Вони зберігають багато так званих +*компонентів додатку*, які надають різноманітні інструменти для опрацювання запитів. Наприклад, +компоненти `urlManager` відповідає за маршрутизацію веб запитів до потрібного контролера; компонент `db` надає інструменти для работи з базою даних; і т. д. + +Кожний компонент додатка має свій унікальний ID, який дозволяє ідентифікувати його серед інших різноманітних компонентів +в одному і тому ж додатку. Ви можете отримати доступ до компонента наступним чином: + +```php +\Yii::$app->ComponentID +``` + +Наприклад, ви можете використовувати `\Yii::$app->db` для отримання [[yii\db\Connection|з’єднання з БД]], +і `\Yii::$app->cache` для отримання доступу до основного компонента [[yii\caching\Cache|кеша]], зареєстрованого в додатку. + +Компонентами додатку можуть бути любі об’єкти. Ви можете зареєструвати їх з допомогою властивості [[yii\base\Application::components]] в [конфігурації](structure-applications.md#application-configurations) додатка. +Наприклад, + +```php +[ + 'components' => [ + // реєстрація "cache" компонента з допомогою назви класу + 'cache' => 'yii\caching\ApcCache', + + // реєстрація "db" компонента з допомогою масива конфігурації + 'db' => [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=demo', + 'username' => 'root', + 'password' => '', + ], + + // реєстрація "search" компонента з допомогою анонімної функції + 'search' => function () { + return new app\components\SolrService; + }, + ], +] +``` + +> Інформація: Хоча ви можете зареєструвати стільки компонентів в додатку скільки вам потрібно, + все ж таки варто робити це осмислено. Компоненти додатку схожі на глобальні змінні. Використання дуже великої кількості компонетів додатку може потенційно зробити ваш код складним для розробки і тестування. + В більшості випадків ви можете просто створити локальний компонент і використовувати його при необхідності. + + +## Вбудовані компоненти додатку <a name="core-application-components"></a> + +В Yii є декілька *вбудованих* компонентів додатку, з фіксованими ID і конфігураціями за замовчуванням. Наприклад, +компонент [[yii\web\Application::request|request]] використовується для отримання інформації про запит користувача і розбору його в +певний [маршрут](runtime-routing.md); компонент [[yii\base\Application::db|db]] являє собою з’єднання з базою даних, +через яке ви можете виконувати запити. Саме з допомогою цих вбудованих компонентів Yii додатки можуть обрабляти +запит користувача. + +Нижче наведений перелік вбудованих компонентів додатку. Ви можете конфігурувати їх так само як і інші компоненти додатку. +Коли ви конфігуруєте вбудований компонент додатку і не вказуєте клас цього компонента, то буде використовуватись значення за замовчуванням. + +* [[yii\web\AssetManager|assetManager]]: використовується для керування і відображенням ресурсів додатку. + Більш детальна інформація представлена ​​в розділі [Ресурси](output-assets.md); +* [[yii\db\Connection|db]]: являє собою з’єднання з базою даних, через яке ви можете виконувати запити. + Зверніть увагу, що коли конфігуруєте даний компонент, ви маєте вказати клас компонента так як і решту необхідних параметрів, а саме такі як [[yii\db\Connection::dsn]]. + Більш детальна інформація представлена ​​в розділі [Об’єкти доступу до даних (DAO)](db-dao.md); +* [[yii\base\Application::errorHandler|errorHandler]]: здійснює опрацювання PHP помилок і виключень. + Більш детальна інформація представлена ​​в розділі [Обробка помилок](runtime-handling-errors.md); +* [[yii\base\Formatter|formatter]]: форматує дані для відображення їх кінцевому користувачу. Наприклад, число може + бути зображене з різноманітними розділителями, дата може бути зображена в форматі `long`. + Більш детальна інформація представлена ​​в розділі [Форматування даних](output-formatting.md); +* [[yii\i18n\I18N|i18n]]: використовується для перекладу повідомлень і форматування. + Більш детальна інформація представлена ​​в розділі [Інтернаціоналізація](tutorial-i18n.md); +* [[yii\log\Dispatcher|log]]: обробка і маршрутизація логів. + Більш детальна інформація представлена ​​в розділі [Логування](runtime-logging.md); +* [[yii\swiftmailer\Mailer|mail]]: надає можливості для побудови і розсилки поштових повідомлень. + Більш детальна інформація представлена ​​в розділі [Відправлення пошти](tutorial-mailing.md); +* [[yii\base\Application::response|response]]: являє собою дані від серверу, які будуть направлені користувачу. + Більш детальна інформація представлена ​​в розділі [Відповіді](runtime-responses.md); +* [[yii\base\Application::request|request]]: являє собою запит, отриманий від кінцевого користувача. + Більш детальна інформація представлена ​​в розділі [Запити](runtime-requests.md); +* [[yii\web\Session|session]]: інформація про сесії. Даний компонент доступний тільки в [[yii\web\Application|веб додатках]]. + Більш детальна інформація представлена ​​в розділі [Сесії і куки](runtime-sessions-cookies.md); +* [[yii\web\UrlManager|urlManager]]: використовується для розбору і побудови URL. + Більш детальна інформація представлена ​​в розділі [Розбір і генерація URL](runtime-url-handling.md); +* [[yii\web\User|user]]: являє собою інформацію авторизованого користувача. + Даний компонент доступний тільки в [[yii\web\Application|веб додатках]]. + Більш детальна інформація представлена ​​в розділі [Аутентифікація](security-authentication.md); +* [[yii\web\View|view]]: використовується для відображення представлень. + Більш детальна інформація представлена ​​в розділі [Представлення](structure-views.md). From f172523d3d6961f621661466a8fe34c10f80fe7b Mon Sep 17 00:00:00 2001 From: keltstr <keltstr@gmail.com> Date: Mon, 3 Nov 2014 19:21:56 +0300 Subject: [PATCH 052/144] Improvements for Russian translation of concept-configurations.md --- docs/guide-ru/concept-configurations.md | 100 ++++++++++++++++---------------- 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/docs/guide-ru/concept-configurations.md b/docs/guide-ru/concept-configurations.md index 019e68a..4e72469 100644 --- a/docs/guide-ru/concept-configurations.md +++ b/docs/guide-ru/concept-configurations.md @@ -1,12 +1,12 @@ -Настройки -======== +Конфигурации +============ -Настройки широко используются в Yii при создании новых объектов или при инициализации уже существующих объектов. -Обычно настройки включают в себя названия классов создаваемых объектов и список первоначальных значений, -которые должны быть присвоены [свойствам](concept-properties.md) объекта. Также в настройках можно указать список +Конфигурации широко используются в Yii при создании новых объектов или при инициализации уже существующих объектов. +Обычно конфигурации включают в себя названия классов создаваемых объектов и список первоначальных значений, +которые должны быть присвоены [свойствам](concept-properties.md) объекта. Также в конфигурациях можно указать список [обработчиков событий](concept-events.md) объекта, и/или список [поведений](concept-behaviors.md) объекта. -Пример настроек подключения к базе данных и дальнейшей инициализации подключения: +Пример конфигурации подключения к базе данных и дальнейшей инициализации подключения: ```php $config = [ @@ -20,22 +20,22 @@ $config = [ $db = Yii::createObject($config); ``` -Метод [[Yii::createObject()]] принимает в качестве аргумента массив настроек и создаёт объект указанного в них класса. +Метод [[Yii::createObject()]] принимает в качестве аргумента массив с конфигурацией и создаёт объект указанного в них класса. При этом оставшаяся часть конфигурации используется для инициализации свойств, обработчиков событий и поведений объекта. Если объект уже создан, вы можете использовать [[Yii::configure()]] для того, чтобы инициализировать свойства объекта -массивом настроек: +массивом с конфигурацией: ```php Yii::configure($object, $config); ``` -Обратите внимание, что в этом случае массив с настройками не должен содержать ключ `class`. +Обратите внимание, что в этом случае массив с конфигурацией не должен содержать ключ `class`. -## Формат настроек <a name="configuration-format"></a> +## Формат конфигурации <a name="configuration-format"></a> -Формат настроек выглядит следующим образом: +Формат конфигурации выглядит следующим образом: ```php [ @@ -53,14 +53,14 @@ Yii::configure($object, $config); создаваемого объекта, а значения — начальными значениями свойств создаваемого объекта. Таким способом могут быть установлены только публичные переменные объекта и его [свойства](concept-properties.md), созданные через геттеры и сеттеры. -* Элементы `on eventName` указывают какие обработчики должны быть установлены для [событий](concept-events.md) объекта. +* Элементы `on eventName` указывают на то, какие обработчики должны быть прикреплены к [событиям](concept-events.md) объекта. Обратите внимание, что ключи массива начинаются с `on `. Чтобы узнать весь список поддерживаемых видов обработчиков событий обратитесь в раздел [события](concept-events.md) -* Элементы `as behaviorName` указывают какие [поведения](concept-behaviors.md) должны быть установлены для объекта. - Обратите внимание, что ключи массива начинаются с `as `. `$behaviorConfig` это массив для настройки - поведения, этот массив такой же как тот, о котором идет речь. +* Элементы `as behaviorName` указывают на то, какие [поведения](concept-behaviors.md) должны быть внедрены в объект. + Обратите внимание, что ключи массива начинаются с `as `; а `$behaviorConfig` представляет собой конфигурацию для + создания [поведения](concept-behaviors.md), похожую на все остальные конфигурации. -Пример настроек с установкой первоначальных значений свойств объекта, обработчика событий и поведения: +Пример конфигурации с установкой первоначальных значений свойств объекта, обработчика событий и поведения: ```php [ @@ -77,21 +77,21 @@ Yii::configure($object, $config); ``` -## Использование настроек <a name="using-configurations"></a> +## Использование конфигурации <a name="using-configurations"></a> -Возможность настройки широко используется в Yii. В самом начале данной главы мы узнали как +Конфигурации повсеместно используются в Yii. В самом начале данной главы мы узнали как создать объект с необходимыми параметрами используя метод [[Yii::createObject()]]. -В данном разделе речь пойдет о настройках приложения и настройках виджетов — двух основных способов -использования настроек. +В данном разделе речь пойдет о конфигурации приложения и конфигурациях виджетов — двух основных способов +использования конфигурации. -### Настройки приложения <a name="application-configurations"></a> +### Конфигурация приложения <a name="application-configurations"></a> -Настройки [приложения](structure-applications.md) пожалуй самые сложные из используемых в фреймворке. -Причина в том, что класс [[yii\web\Application|application]] содержит большое количество настраиваемых +Конфигурация [приложения](structure-applications.md), пожалуй, самая сложная из используемых в фреймворке. +Причина в том, что класс [[yii\web\Application|application]] содержит большое количество конфигурируемых свойств и событий. Более того, свойство приложения [[yii\web\Application::components|components]] -может принимать массив настроек для создания компонентов, регистрируемых на уровне приложения. -Пример настроек приложения для [шаблона приложения basic](start-basic.md). +может принимать массив с конфигурацией для создания компонентов, регистрируемых на уровне приложения. +Пример конфигурации приложения для [шаблона приложения basic](start-basic.md). ```php $config = [ @@ -125,22 +125,22 @@ $config = [ ]; ``` -Ключ `class` в данных настройках не указывается. Причина в том, что класс вызывается по полному имени во +Ключ `class` в данной конфигурации не указывается. Причина в том, что класс вызывается по полному имени во [входном скрипте](structure-entry-scripts.md): ```php (new yii\web\Application($config))->run(); ``` -Для более подробной документации о настройке свойства приложения `components` обратитесь к главам +За более подробной документацией о настройках свойства `components` в конфигурации приложения обратитесь к главам [приложения](structure-applications.md) и [Service Locator](concept-service-locator.md). -### Настройки виджетов <a name="widget-configurations"></a> +### Конфигурации виджетов <a name="widget-configurations"></a> При использовании [виджетов](structure-widgets.md) часто возникает необходимость изменить параметры виджета с помощью -настроек. Для создания виджета можно использовать два метода: [[yii\base\Widget::widget()]] и -[[yii\base\Widget::beginWidget()]]. Оба метода принимают настройки в виде массива: +конфигурации. Для создания виджета можно использовать два метода: [[yii\base\Widget::widget()]] и +[[yii\base\Widget::beginWidget()]]. Оба метода принимают конфигурацию в виде PHP массива: ```php use yii\widgets\Menu; @@ -161,11 +161,11 @@ echo Menu::widget([ Обратите внимание что параметр `class` НЕ передается, так как полное имя уже указано. -## Файлы Настроек <a name="configuration-files"></a> +## Конфигурационные файлы <a name="configuration-files"></a> -Если настройки сложные, то их, как правило, разделяют по нескольким PHP файлам. Такие файлы называют -*файлами настроек* или *конфигурационными файлами*. Файл настроек возвращает массив PHP с настройками. -Например, настройки приложения можно хранить в отдельном файле `web.php`, как показано ниже: +Если конфигурация очень сложная, то её, как правило, разделяют по нескольким PHP файлам. Такие файлы называют +*Конфигурационными файлами*. Конфигурационный файл возвращает массив PHP являющийся конфигурацией. +Например, конфигурацию приложения можно хранить в отдельном файле `web.php`, как показано ниже: ```php return [ @@ -207,7 +207,7 @@ return [ ]; ``` -Чтобы получить настройки, хранимые в файле, достаточно подключить файл с помощью `require`: +Чтобы получить конфигурацию, хранящуюся в файле, достаточно подключить файл с помощью `require`: ```php $config = require('path/to/web.php'); @@ -215,12 +215,10 @@ $config = require('path/to/web.php'); ``` -## Настройки по умолчанию <a name="default-configurations"></a> +## Значения конфигурации по умолчанию <a name="default-configurations"></a> Метод [[Yii::createObject()]] реализован с использованием [dependency injection container](concept-di-container.md). -Это позволяет указывать так называемые *настройки по умолчанию*, которые будут применены ко ВСЕМ экземплярам классов -во время их инициализации методом [[Yii::createObject()]]. Настройки по умолчанию указываются с помощью метода -`Yii::$container->set()` на этапе [предварительной загрузки](runtime-bootstrapping.md). +Это позволяет задавать так называемые *значения конфигурации по умолчанию*, которые будут применены ко ВСЕМ экземплярам классов во время их инициализации методом [[Yii::createObject()]]. Значения конфигурации по умолчанию указываются с помощью метода `Yii::$container->set()` на этапе [предварительной загрузки](runtime-bootstrapping.md). Например, если мы хотим изменить виджет [[yii\widgets\LinkPager]] так, чтобы все виджеты данного вида показывали максимум 5 кнопок на странице вместо 10 (как это установлено изначально), можно использовать следующий код: @@ -231,15 +229,15 @@ $config = require('path/to/web.php'); ]); ``` -Если бы мы не установили настройки по умолчанию, то тогда нам нужно было бы каждый раз при использовании LinkPager -указывать настройки `maxButtonCount`. +Без использования значений конфигурации по умолчанию, при использовании LinkPager, вам пришлось бы каждый раз +задавать значение `maxButtonCount`. ## Константы окружения <a name="environment-constants"></a> -Настройки могут различаться в зависимости от окружения, в котором происходит запуск приложения. Например, -в окружении разработчика вы используете базу данных `mydb_dev`, а на продакшн сервере базу данных -`mydb_prod`. Для упрощения смены окружений в Yii существует константа `YII_ENV`. Вы можете указать её во +Конфигурации могут различаться в зависимости от режима, в котором происходит запуск приложения. Например, +в окружении разработчика (development) вы используете базу данных `mydb_dev`, а в эксплуатационном (production) окружении +базу данных `mydb_prod`. Для упрощения смены окружений в Yii существует константа `YII_ENV`. Вы можете указать её во [входном скрипте](structure-entry-scripts.md) своего приложения: ```php @@ -248,20 +246,20 @@ defined('YII_ENV') or define('YII_ENV', 'dev'); `YII_ENV` может принимать следующие значения: -- `prod`: production окружение, т.е. окружение для конечного сервера. Константа `YII_ENV_PROD` установлена в true. +- `prod`: окружение production, т.е. эксплуатационный режим сервера. Константа `YII_ENV_PROD` установлена в true. Значение по умолчанию. -- `dev`: development окружение, т.е. окружение для разработки. Константа `YII_ENV_DEV` установлена в true. -- `test`: testing окружение, т.е. окружения для тестирования. Константа `YII_ENV_TEST` установлена в true. +- `dev`: окружение development, т.е. режим для разработки. Константа `YII_ENV_DEV` установлена в true. +- `test`: окружение testing, т.е. режим для тестирования. Константа `YII_ENV_TEST` установлена в true. -Используя эти константы вы можете изменить настройки в соответствии с вашим окружением. -Например, чтобы включить [отладочную панель и отладчик](tool-debugger.md) в development окружении вы можете использовать -следующие настройки приложения: +Используя эти константы, вы можете задать в конфигурации значения параметров зависящие от текущего окружения. +Например, чтобы включить [отладочную панель и отладчик](tool-debugger.md) в режиме разработки, вы можете использовать +следующий код в конфигурации приложения: ```php $config = [...]; if (YII_ENV_DEV) { - // настройки для 'dev' окружения + // значения параметров конфигурации для окружения разработки 'dev' $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = 'yii\debug\Module'; } From 9ea3f5bc0935b6bd2c77d21d9c83a13bf3dca648 Mon Sep 17 00:00:00 2001 From: Alexander Makarov <sam@rmcreative.ru> Date: Mon, 3 Nov 2014 20:59:56 +0300 Subject: [PATCH 053/144] Added "configuration" and "environment" to Russian translation dictionary --- docs/internals-ru/translation-workflow.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/internals-ru/translation-workflow.md b/docs/internals-ru/translation-workflow.md index 4b9682f..ae216a8 100644 --- a/docs/internals-ru/translation-workflow.md +++ b/docs/internals-ru/translation-workflow.md @@ -105,11 +105,13 @@ php build translation "../docs/guide" "../docs/guide-ru" "Russian guide translat - attribute of the model — атрибут модели. - camel case — без перевода. - customization — (тонкая) настройка //Ранее встречался перевод "кастомизация", желательно этот вариант по возможности не использовать. -- column — столбец (если речь про БД). +- column — столбец (если речь про БД). +- configuration — конфигурация. - content — содержимое. - controller — контроллер. - debug (mode) — отладочный (режим) (см. production mode). -- eager loading — метод жадной загрузки/жадная загрузка (см. lazy loading). +- eager loading — метод жадной загрузки/жадная загрузка (см. lazy loading). +- environment — окружение. - PHP extension — расширение PHP. - field (of the table) — поле (или атрибут) таблицы. - framework — фреймворк. From 58e780ff3d57f58268d2f4b9d887a181f9bf3f16 Mon Sep 17 00:00:00 2001 From: relbraun <relbraun@gmail.com> Date: Mon, 3 Nov 2014 20:33:56 +0200 Subject: [PATCH 054/144] Hebrew translation --- framework/messages/config.php | 2 +- framework/messages/he/yii.php | 79 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 framework/messages/he/yii.php diff --git a/framework/messages/config.php b/framework/messages/config.php index ebb4821..bd66ca1 100644 --- a/framework/messages/config.php +++ b/framework/messages/config.php @@ -7,7 +7,7 @@ return [ 'messagePath' => __DIR__, // array, required, list of language codes that the extracted messages // should be translated to. For example, ['zh-CN', 'de']. - 'languages' => ['ar', 'az', 'bg', 'ca', 'cs', 'da', 'de', 'el', 'es', 'et', 'fa-IR', 'fi', 'fr', 'hu', 'id', 'it', 'ja', 'kk', 'ko', 'lt', 'lv', 'nl', 'pl', 'pt', 'pt-BR', 'ro', 'ru', 'sk', 'sr', 'sr-Latn', 'sv', 'th', 'uk', 'vi', 'zh-CN','zh-TW'], + 'languages' => ['ar', 'az', 'bg', 'ca', 'cs', 'da', 'de', 'el', 'es', 'et', 'fa-IR', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'kk', 'ko', 'lt', 'lv', 'nl', 'pl', 'pt', 'pt-BR', 'ro', 'ru', 'sk', 'sr', 'sr-Latn', 'sv', 'th', 'uk', 'vi', 'zh-CN','zh-TW'], // string, the name of the function for translating messages. // Defaults to 'Yii::t'. This is used as a mark to find the messages to be // translated. You may use a string for single function name or an array for diff --git a/framework/messages/he/yii.php b/framework/messages/he/yii.php new file mode 100644 index 0000000..e9294ae --- /dev/null +++ b/framework/messages/he/yii.php @@ -0,0 +1,79 @@ +<?php +/** + * Message translations. + * + * This file is automatically generated by 'yii message' command. + * It contains the localizable messages extracted from source code. + * You may modify this file by translating the extracted messages. + * + * Each array element represents the translation (value) of a message (key). + * If the value is empty, the message is considered as not translated. + * Messages that no longer need translation will have their translations + * enclosed between a pair of '@@' marks. + * + * Message string can be used with plural forms format. Check i18n section + * of the guide for details. + * + * NOTE: this file must be saved in UTF-8 encoding. + */ +return [ + '(not set)' => '(לא הוגדר)', + 'An internal server error occurred.' => 'שגיאת שרת פנימית', + 'Delete' => 'מחק', + 'Error' => 'שגיאה', + 'File upload failed.' => 'העלאת קובץ נכשלה', + 'Home' => 'דף הבית', + 'Invalid data received for parameter "{param}".' => 'התקבל ערך לא חוקי לפרמטר "{param}"', + 'Login Required' => 'נדרשת הרשמה', + 'Missing required arguments: {params}' => 'חסרים ארגומנטים נדרשים: {params}', + 'Missing required parameters: {params}' => 'חסרים פרמטרים נדרשים: {params}', + 'No' => 'לא', + 'No help for unknown command "{command}".' => 'פקודה "{command}" לא מוכרת ואין לה עזרה', + 'No help for unknown sub-command "{command}".' => 'תת-פקודה "{command}" לא מוכרת ואין לה עזרה', + 'No results found.' => 'לא נמצאו תוצאות', + 'Only files with these extensions are allowed: {extensions}.' => 'רק קבצים עם ההרחבות הבאות מותרים: {extentions}.', + 'Page not found.' => 'דף לא נמצא', + 'Please fix the following errors:' => 'בבקשה, תקן את השגיאות הבאות: ', + 'Please upload a file.' => 'נא העלה קובץ.', + 'Showing <b>{begin, number}-{end, number}</b> of <b>{totalCount, number}</b> {totalCount, plural, one{item} other{items}}.' => 'מציג <b>{begin, number}-{end, number}</b> מתוך <b>{totalCount, number}</b> {totalCount, plural, one{רשומה} other{רשומות}}.', + 'The file "{file}" is not an image.' => 'הקובץ "{file}" אינו קובץ תמונה.', + 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'הקובץ "{file}" גדול מדי. גודל זה אינו מצליח {limit, number} {limit, plural, one{byte} other{bytes}}.', + 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'הקובץ "{file}" קטן מדי. הקובץ אינו יכול להיות קטן מ {limit, number} {limit, plural, one{byte} other{bytes}}.', + 'The format of {attribute} is invalid.' => 'הפורמט של {attribute} אינו חוקי.', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'התמונה "{file}" גדולה מדי. הגובה לא יכול להיות גדול מ {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'התמונה "{file}" גדולה מדי. הרוחב לא יכול להיות גדול מ {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'התמונה "{file}" קטנה מדי. הגובה לא יכול להיות קטן מ {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'התמונה "{file}" קטנה מדי. הרוחב לא יכול להיות קטן מ {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The verification code is incorrect.' => 'קוד האימות אינו תקין.', + 'Total <b>{count, number}</b> {count, plural, one{item} other{items}}.' => 'סך הכל <b>{count, number}</b> {count, plural, one{אייטם} other{אייטמים}}.', + 'Unable to verify your data submission.' => 'אין אפשרות לאמת את המידע שהתקבל.', + 'Unknown command "{command}".' => 'Unknown command "{command}".', + 'Unknown option: --{name}' => 'Unknown option: --{name}', + 'Update' => 'עדכון', + 'View' => 'תצוגה', + 'Yes' => 'כן', + 'You are not allowed to perform this action.' => 'אינך מורשה לבצע את הפעולה הזו.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'אתה יכול להעלות לכל היותר {limit, number} {limit, plural, one{קובץ} few{קבצים} many{קבצים} other{קבצים}}.', + 'the input value' => 'הערך המוכנס', + '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" כבר בשימוש', + '{attribute} cannot be blank.' => '{attribute} לא יכול להיות ריק.', + '{attribute} is invalid.' => '{attribute} לא חוקי.', + '{attribute} is not a valid URL.' => '{attribute} איננו כתובת אינטרנט חוקית.', + '{attribute} is not a valid email address.' => '{attribute} לא כתובת מייל חוקית.', + '{attribute} must be "{requiredValue}".' => '{attribute} חייב להיות "{requiredValue}".', + '{attribute} must be a number.' => '{attribute} חייב להיות מספר', + '{attribute} must be a string.' => '{attribute} חייב להיות מחרוזת טקסט', + '{attribute} must be an integer.' => '{attribute} חייב להיות מספר שלם', + '{attribute} must be either "{true}" or "{false}".' => '{attribute} חייב להיות "{true}" או "{false}".', + '{attribute} must be greater than "{compareValue}".' => '{attribute} חייב להיות גדול מ "{compareValue}".', + '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute} חייב להיות גדול מ או שווה "{compareValue}".', + '{attribute} must be less than "{compareValue}".' => '{attribute} חייב להיות פחות מ "{compareValue}".', + '{attribute} must be less than or equal to "{compareValue}".' => '{attribute} חייב להיות פחות מ או שווה "{compareValue}".', + '{attribute} must be no greater than {max}.' => '{attribute} חייב להיות לא יותר מ "{compareValue}".', + '{attribute} must be no less than {min}.' => '{attribute} חייב להיות לא פחות מ "{min}".', + '{attribute} must be repeated exactly.' => '{attribute} חייב להיות מוחזר בדיוק.', + '{attribute} must not be equal to "{compareValue}".' => '{attribute} חייב להיות שווה ל "{compareValue}"', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} אמור לכלול לפחות {min, number} {min, plural, one{תו} few{תוים} many{תוים}}.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} אמור לא לכלול יותר מ {max, number} {max, plural, one{תו} few{תוים} many{תוים}}.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} אמור לכלול {length, number} {length, plural, one{תו} few{תוים} many{תוים}}.', +]; From bcd2392673a5c22c10193ebb301413e3858b3ca4 Mon Sep 17 00:00:00 2001 From: Artem Belov <otsec_ru@gmail.com> Date: Mon, 3 Nov 2014 23:12:04 +0300 Subject: [PATCH 055/144] ArrayHelper::toArray() now uses $properties parameter in recursive calls for descending objects --- framework/CHANGELOG.md | 1 + framework/helpers/BaseArrayHelper.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index d68c6ab..c8fd8b0 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.1 under development ----------------------- +- Bug #5893: `yii\helpers\ArrayHelper::toArray()` now applies `$properties` parameter for converting descending objects in recursive calls (otsec) - Bug #4471: `yii\caching\ApcCache::getValues()` now returns array in case of APC is installed but not enabled in CLI mode (samdark, cebe) - Bug #5402: Debugger was not loading when there were closures in asset classes (samdark) - Bug #5570: `yii\bootstrap\Tabs` would throw an exception if `content` is not set for one of its `items` (RomeroMsk) diff --git a/framework/helpers/BaseArrayHelper.php b/framework/helpers/BaseArrayHelper.php index f0aa842..2108717 100644 --- a/framework/helpers/BaseArrayHelper.php +++ b/framework/helpers/BaseArrayHelper.php @@ -81,7 +81,7 @@ class BaseArrayHelper } } - return $recursive ? static::toArray($result) : $result; + return $recursive ? static::toArray($result, $properties) : $result; } } if ($object instanceof Arrayable) { From 6eb570ad67cccb32bfd0f24fc9170186aa89a60b Mon Sep 17 00:00:00 2001 From: Artem Belov <otsec.ru@gmail.com> Date: Tue, 4 Nov 2014 00:11:28 +0300 Subject: [PATCH 056/144] Added missing russian translation for message "just now" for relative time formatter --- framework/messages/ru/yii.php | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/messages/ru/yii.php b/framework/messages/ru/yii.php index 996ff6a..bbf6a63 100644 --- a/framework/messages/ru/yii.php +++ b/framework/messages/ru/yii.php @@ -85,6 +85,7 @@ return [ 'in {delta, plural, =1{a second} other{# seconds}}' => 'через {delta, plural, =1{секунду} one{# секунду} few{# секунды} many{# секунд} other{# секунды}}', 'in {delta, plural, =1{a year} other{# years}}' => 'через {delta, plural, =1{год} one{# год} few{# года} many{# лет} other{# года}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'через {delta, plural, =1{час} one{# час} few{# часа} many{# часов} other{# часа}}', + 'just now' => 'прямо сейчас', 'the input value' => 'введённое значение', '{attribute} "{value}" has already been taken.' => '{attribute} «{value}» уже занят.', '{attribute} cannot be blank.' => 'Необходимо заполнить «{attribute}».', From b10f580dfd485027e03c86224297b6aa5560445c Mon Sep 17 00:00:00 2001 From: Qiang Xue <qiang.xue@gmail.com> Date: Mon, 3 Nov 2014 17:03:44 -0500 Subject: [PATCH 057/144] Finished routing tutorial [skip ci] --- docs/guide/runtime-routing.md | 409 +++++++++++++++++++++++++---------- docs/internals/translation-status.md | 2 +- 2 files changed, 290 insertions(+), 121 deletions(-) diff --git a/docs/guide/runtime-routing.md b/docs/guide/runtime-routing.md index 9d5db09..a3fdbe7 100644 --- a/docs/guide/runtime-routing.md +++ b/docs/guide/runtime-routing.md @@ -1,21 +1,19 @@ Routing and URL Creation ======================== -> Note: This section is under development. - When a Yii application starts processing a requested URL, the first step it does is to parse the URL into a [route](structure-controllers.md#routes). The route is then used to instantiate the corresponding [controller action](structure-controllers.md) to handle the request. This whole process is called *routing*. The reverse process of routing is called *URL creation*, which creates a URL from a given route -and the associated parameters. When the created URL is later requested, the routing process can resolve it -back into the original route and parameters. +and the associated query parameters. When the created URL is later requested, the routing process can resolve it +back into the original route and query parameters. The central piece responsible for routing and URL creation is the [[yii\web\UrlManager|URL manager]], which is registered as the `urlManager` application component. The [[yii\web\UrlManager|URL manager]] provides the [[yii\web\UrlManager::parseRequest()|parseRequest()]] method to parse an incoming request into -a route and the associated parameters and the [[yii\web\UrlManager::createUrl()|createUrl()]] method to -create a URL from a given route and its associated parameters. +a route and the associated query parameters and the [[yii\web\UrlManager::createUrl()|createUrl()]] method to +create a URL from a given route and its associated query parameters. By configuring the `urlManager` component in the application configuration, you can let your application to recognize arbitrary URL formats without modifying your existing application code. For example, you can @@ -29,7 +27,7 @@ $url = Url::to(['post/view', 'id' => 100]); ``` Depending on the `urlManager` configuration, the created URL may look like one of the followings (or other format). -And if the created URL is requested later, it will still be parsed back into the original route and parameter value. +And if the created URL is requested later, it will still be parsed back into the original route and query parameter value. ``` /index.php?r=post/view&id=100 @@ -43,13 +41,13 @@ And if the created URL is requested later, it will still be parsed back into the The [[yii\web\UrlManager|URL manager]] supports two URL formats: the default URL format and the pretty URL format. The default URL format uses a query parameter named `r` to represent the route and normal query parameters -to represent the parameters associated with the route. For example, the URL `/index.php?r=post/view&id=100` represents -the route `post/view` and the `id` parameter 100. The default URL format does not require any configuration about +to represent the query parameters associated with the route. For example, the URL `/index.php?r=post/view&id=100` represents +the route `post/view` and the `id` query parameter 100. The default URL format does not require any configuration about the [[yii\web\UrlManager|URL manager]] and works in any Web server setup. The pretty URL format uses the extra path following the entry script name to represent the route and the associated -parameters. For example, the extra path in the URL `/index.php/post/100` is `/post/100` which may represent -the route `post/view` and the `id` parameter 100 with a proper [[yii\web\UrlManager::rules|URL rule]]. To use +query parameters. For example, the extra path in the URL `/index.php/post/100` is `/post/100` which may represent +the route `post/view` and the `id` query parameter 100 with a proper [[yii\web\UrlManager::rules|URL rule]]. To use the pretty URL format, you will need to design a set of [[yii\web\UrlManager::rules|URL rules]] according to the actual requirement about how the URLs should look like. @@ -60,19 +58,21 @@ property of the [[yii\web\UrlManager|URL manager]] without changing any other ap ## Routing <a name="routing"></a> Routing involves two steps. In the first step, the incoming request is parsed into a route and the associated -parameters. In the second step, a [controller action](structure-controllers.md) corresponding to the parsed route +query parameters. In the second step, a [controller action](structure-controllers.md) corresponding to the parsed route is created to handle the request. When using the default URL format, parsing a request into a route is as simple as getting the value of a `GET` -parameter named `r`. When using the pretty URL format, however, it requires examining the registered -[[yii\web\UrlManager::rules|URL rules]] to find one that can resolve the request into a route. If such a rule cannot -be found, a [[yii\web\NotFoundHttpException]] exception will be thrown. +query parameter named `r`. + +When using the pretty URL format, the [[yii\web\UrlManager|URL manager]] will examine the registered +[[yii\web\UrlManager::rules|URL rules]] to find matching one that can resolve the request into a route. +If such a rule cannot be found, a [[yii\web\NotFoundHttpException]] exception will be thrown. Once the request is parsed into a route, it is time to create the controller action identified by the route. The route is broken down into multiple parts by the slashes in it. For example, `site/index` will be broken into `site` and `index`. Each part is an ID which may refer to a module, a controller or an action. -Starting from the first part in the route, the application conducts the following steps to create modules (if any), -the controller and the action: +Starting from the first part in the route, the application takes the following steps to create modules (if any), +controller and action: 1. Set the application as the current module. 2. Check if the [[yii\base\Module::controllerMap|controller map]] of the current module contains the current ID. @@ -128,7 +128,7 @@ the rest of the elements (name-value pairs) specify the parameters to be [bound ## Creating URLs <a name="creating-urls"></a> Yii provides a helper method [[yii\helpers\Url::to()]] to create various kinds of URLs from given routes and -their associated parameters. For example, +their associated query parameters. For example, ```php use yii\helpers\Url; @@ -242,9 +242,9 @@ To use pretty URLs, configure the `urlManager` component in the application conf ] ``` -where +The [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] property is mandatory as it toggles the pretty URL format. +The rest of the properties are optional. However, their configuration shown above is most commonly used. -* [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]]: this property toggles the pretty URL format. * [[yii\web\UrlManager::showScriptName|showScriptName]]: this property determines whether the entry script should be included in the created URLs. For example, in stead of creating a URL `/index.php/post/100`, by setting this property to be true, a URL `/post/100` may be generated. @@ -266,17 +266,23 @@ where ### URL Rules <a name="url-rules"></a> -URL rules are objects responsible for parsing and creating URLs when the pretty URL format is used. You declare -the URL rules by configuring them in the [[yii\web\UrlManager::rules]] property. The property takes an array with -each element specifying a single URL rule. When the [[yii\web\UrlManager|URL manager]] is parsing an incoming request, -it examines the rules in the order they are declared and looks for the *first* rule that matches the requested URL. -The matching rule is then used to parse the URL into a route and its associated parameters. Similarly, when -the [[yii\web\UrlManager|URL manager]] is used to create a URL, it looks for the first rule that matches the given -route and parameters and uses it to create a URL. +A URL rule is an instance of [[yii\web\UrlRule]] or its child class. Each URL rule consists of a pattern used +for matching the path info part of URLs, a route, and a few query parameters. A URL rule can be used to parse a request +if its pattern matches the requested URL; and a URL rule can be used to create a URL if its route and query parameter +names match those that are given. + +When the pretty URL format is enabled, the [[yii\web\UrlManager|URL manager]] uses the URL rules declared in its +[[yii\web\UrlManager::rules|rules]] property to parse incoming requests and create URLs. In particular, +to parse an incoming request, the [[yii\web\UrlManager|URL manager]] examines the rules in the order they are +declared and looks for the *first* rule that matches the requested URL. The matching rule is then used to +parse the URL into a route and its associated parameters. Similarly, to create a URL, the [[yii\web\UrlManager|URL manager]] +looks for the first rule that matches the given route and parameters and uses that to create a URL. -The following [[yii\web\UrlManager::rules|rules]] configuration declares two URL rules. The first rule matches -a URL `posts` and maps it into the route `post/index`. The second rule matches a URL matching the regular expression -`post/(\d+)` and maps it into the route `post/view` and a parameter named `id`. +You can configure [[yii\web\UrlManager::rules]] as an array with keys being the patterns and values the corresponding +routes. Each pattern-route pair constructs a URL rule. For example, the following [[yii\web\UrlManager::rules|rules]] +configuration declares two URL rules. The first rule matches a URL `posts` and maps it into the route `post/index`. +The second rule matches a URL matching the regular expression `post/(\d+)` and maps it into the route `post/view` and +a parameter named `id`. ```php [ @@ -285,22 +291,45 @@ a URL `posts` and maps it into the route `post/index`. The second rule matches a ] ``` -> Info: Only the path info part of a URL is used to match against a rule. The path info of a URL is the part - after the entry script and before the query string. For example, the path info of `/index.php/post/100?source=ad` - is `/post/100`. When performing the matching test, both of the leading and ending slashes in the path info are ignored. +> Info: The pattern in a rule is used to match the path info part of a URL. For example, the path info of + `/index.php/post/100?source=ad` is `post/100` (the leading and ending slashes are ignored) which matches + the pattern `post/(\d+)`. + +Besides declaring URL rules as pattern-route pairs, you may also declare them as configuration arrays. Each configuration +array is used to configure a single URL rule object. This is often needed when you want to configure other +properties of a URL rule. For example, + +```php +[ + // ...other url rules... + + [ + 'pattern' => 'posts', + 'route' => 'post/index', + 'suffix' => '.json', + ], +] +``` + +By default if you do not specify the `class` option for a rule configuration, it will take the default +class [[yii\web\UrlRule]]. ### Named Parameters <a name="named-parameters"></a> -A URL rule can be associated with a few named parameters. When the rule is used to parse a URL, it will fill these -parameters with values matching various parts of the URL. And when the rule is used to create a URL, it will take the -values of the provided parameters and insert them into various parts of the URL being created. +A URL rule can be associated with a few named query parameters which are specified in the pattern in the format +of `<ParamName:RegExp>`, where `ParamName` specifies the parameter name and `RegExp` is an optional regular +expression used to match parameter values. If `RegExp` is not specified, it means the parameter value should be +a string without any slash. + +> Note: You can only specify regular expressions for parameters. The rest part of a pattern is considered as plain text. -To specify a named parameter, embed in the URL pattern with a token `<ParamName>` or `<ParamName:Pattern>`, -where `ParamName` specifies the parameter name and `Pattern` is a regular expression that the parameter value should -match. If `Pattern` is not specified, it means the parameter should match any characters except `/`. +When a rule is used to parse a URL, it will fill the associated parameters with values matching the corresponding +parts of the URL, and these parameters will be made available in `$_GET` later by the `request` application component. +When the rule is used to create a URL, it will take the values of the provided parameters and insert them at the +places where the parameters are declared. -Let's use some examples to explain how URL rules work. Assume we have declared the following URL rules: +Let's use some examples to illustrate named parameters work. Assume we have declared the following three URL rules: ```php [ @@ -310,124 +339,242 @@ Let's use some examples to explain how URL rules work. Assume we have declared t ] ``` -* Parsing URLs - - `/index.php/posts` is parsed into the route `post/index` using the first rule; - - `/index.php/posts/2014/php` is parsed into the route `post/index`, the `year` parameter whose value is 2014 - and the `category` parameter whose value is `php` using the third rule; - - `/index.php/post/100` is parsed into the route `post/view` and the `id` parameter whose value is 100 using - the second rule; - - `/index.php/posts/php` will cause a [[yii\web\NotFoundHttpException]] when [[yii\web\UrlManager::enableStrictParsing]] - is true, because it matches none of the patterns. If [[yii\web\UrlManager::enableStrictParsing]] is false (the - default value), the path info part `posts/php` will be returned as the route. -* Creating URLs - - `Url::to(['post/index'])` creates `/index.php/posts` using the first rule; - - `Url::to(['post/index', 'year' => 2014, 'category' => 'php'])` creates `/index.php/posts/2014/php` using the - third rule; - - `Url::to(['post/view', 'id' => 100])` creates `/index.php/post/100` using the second rule; - - `Url::to(['post/view', 'id' => 100, 'source' => 'ad'])` creates `/index.php/post/100?source=ad` using the second rule. - Because the `source` parameter is not specified in the rule, it is appended as a query parameter in the created URL. - - `Url::to(['post/index', 'category' => 'php'])` creates `/index.php/post/index?category=php` using none of rules. - Note that since none of the rules applies, the URL is created by simply appending the route as the path info - and all parameters as the query string part. - +When the rules are used to parse URLs: -### Parameterizing Routes +- `/index.php/posts` is parsed into the route `post/index` using the first rule; +- `/index.php/posts/2014/php` is parsed into the route `post/index`, the `year` parameter whose value is 2014 + and the `category` parameter whose value is `php` using the third rule; +- `/index.php/post/100` is parsed into the route `post/view` and the `id` parameter whose value is 100 using + the second rule; +- `/index.php/posts/php` will cause a [[yii\web\NotFoundHttpException]] when [[yii\web\UrlManager::enableStrictParsing]] + is true, because it matches none of the patterns. If [[yii\web\UrlManager::enableStrictParsing]] is false (the + default value), the path info part `posts/php` will be returned as the route. + +And when the rules are used to create URLs: + +- `Url::to(['post/index'])` creates `/index.php/posts` using the first rule; +- `Url::to(['post/index', 'year' => 2014, 'category' => 'php'])` creates `/index.php/posts/2014/php` using the + third rule; +- `Url::to(['post/view', 'id' => 100])` creates `/index.php/post/100` using the second rule; +- `Url::to(['post/view', 'id' => 100, 'source' => 'ad'])` creates `/index.php/post/100?source=ad` using the second rule. + Because the `source` parameter is not specified in the rule, it is appended as a query parameter in the created URL. +- `Url::to(['post/index', 'category' => 'php'])` creates `/index.php/post/index?category=php` using none of rules. + Note that since none of the rules applies, the URL is created by simply appending the route as the path info + and all parameters as the query string part. + -Rules may also make use of named parameters as part of a route. Named parameters allow a rule to be applied to multiple routes based -on matching criteria. Named parameters may also help reduce the number of rules needed for an application, and thus improve the overall -performance. +### Parameterizing Routes <a name="parameterizing-routes"></a> -The following example rules illustrate how to parameterize routes with named parameters: +You can embed parameter names in the route of a URL rule. This allows a URL rule to be used for matching multiple +routes. For example, the following rules embed `controller` and `action` parameters in the routes. ```php [ '<controller:(post|comment)>/<id:\d+>/<action:(create|update|delete)>' => '<controller>/<action>', - '<controller:(post|comment)>/<id:\d+>' => '<controller>/read', - '<controller:(post|comment)>s' => '<controller>/list', + '<controller:(post|comment)>/<id:\d+>' => '<controller>/view', + '<controller:(post|comment)>s' => '<controller>/index', +] +``` + +To parse a URL `/index.php/comment/100/create`, the first rule will apply, which sets the `controller` parameter to +be `comment` and `action` parameter to be `create`. The route `<controller>/<action>` is thus resolved as `comment/create`. + +Similarly, to create a URL for the route `comment/index`, the third rule will apply, which creates a URL `/index.php/comments`. + +> Info: By parameterizing routes, it is possible to greatly reduce the number of URL rules, which can significantly + improve the performance of [[yii\web\UrlManager|URL manager]]. + +By default, all parameters declared in a rule are required. If a requested URL does not contain a particular parameter, +or if a URL is being created without a particular parameter, the rule will not apply. To make some of the parameters +optional, you can configure the [[yii\web\UrlRule::defaults|defaults]] property of a rule. Parameters listed in this +property are optional and will take the specified values when they are not provided. + +In the following rule declaration, the `page` and `tag` parameters are both optional and will take the value of 1 and +empty string, respectively, when they are not provided. + +```php +[ + // ...other rules... + [ + 'pattern' => 'posts/<page:\d+>/<tag>', + 'route' => 'post/index', + 'defaults' => ['page' => 1, 'tag' => ''], + ], ] ``` -In the above example, two named parameters are found in the route part of the rules: `controller` and `action`. The former matches a controller ID that's either "post" or "comment", while the latter matches an action ID that could be "create", "update", or "delete". You may name the parameters differently as long as they do not conflict with any GET parameters that may appear in your URLs. +The above rule can be used to parse or create any of the following URLs: + +* `/index.php/posts`: `page` is 1, `tag` is ''. +* `/index.php/posts/2`: `page` is 2, `tag` is ''. +* `/index.php/posts/2/news`: `page` is 2, `tag` is `'news'`. +* `/index.php/posts/news`: `page` is 1, `tag` is `'news'`. -Using the above rules, the URL `/index.php/post/123/create` will be parsed as the route `post/create` with `GET` parameter -`id=123`. Given the route `comment/list` and `GET` parameter `page=2`, Yii can create a URL `/index.php/comments?page=2`. +Without using optional parameters, you would have to create 4 rules to achieve the same result. -### Parameterizing Hostnames +### Rules with Server Names <a name="rules-with-server-names"></a> -It is also possible to include hostnames in the rules for parsing and creating URLs. One may extract part of the hostname -to be a `GET` parameter. This is especially useful for handling subdomains. For example, the URL -`http://admin.example.com/en/profile` may be parsed into GET parameters `user=admin` and `lang=en`. On the other hand, -rules with hostnames may also be used to create URLs with parameterized hostnames. +It is possible to include Web server names in the patterns of URL rules. This is mainly useful when your application +should behave differently for different Web server names. For example, the following rules will parse the URL +`http://admin.example.com/login` into the route `admin/user/login` and `http://www.example.com/login` into `site/login`. + +```php +[ + 'http://admin.example.com/login' => 'admin/user/login', + 'http://www.example.com/login' => 'site/login', +] +``` -In order to use parameterized hostnames, simply declare the URL rules while including the host info: +You can also embed parameters in the server names to extract dynamic information from them. For example, the following rule +will parse the URL `http://en.example.com/posts` into the route `post/index` and the parameter `language=en`. ```php [ - 'http://<user:\w+>.example.com/<lang:\w+>/profile' => 'user/profile', + 'http://<language:\w+>.example.com/posts' => 'post/index', ] ``` -In the above example, the first segment of the hostname is treated as the "user" parameter while the first segment -of the pat is treated as the "lang" parameter. The rule corresponds to the `user/profile` route. +> Note: Rules with server names should NOT include subfolder of the entry script in their patterns. For example, if + the application is under `http://www.example.com/sandbox/blog`, then you should use the pattern + `http://www.example.com/posts` instead of `http://www.example.com/sandbox/blog/posts`. This will allow your application + to be deployed under any directory without the need to change your application code. -Note that [[yii\web\UrlManager::showScriptName]] will not take effect when a URL is being created using a rule with a parameterized hostname. -Also note that any rule with a parameterized hostname should NOT contain the subfolder if the application is under -a subfolder of the web root. For example, if the application is under `http://www.example.com/sandbox/blog`, then you -should still use the same URL rule as described above without the subfolder `sandbox/blog`. +### URL Suffixes <a name="url-suffixes"></a> -### Faking URL Suffix +You may want to add suffixes to the URLs for various purposes. For example, you may add `.html` to the URLs so that they +look like URLs for static HTML pages; you may also add `.json` to the URLs to indicate that the expected content type +of the response to the URLs. You can achieve this goal by configuring the [[yii\web\UrlManager::suffix]] property like +the following in the application configuration: ```php -<?php -return [ - // ... +[ 'components' => [ 'urlManager' => [ + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'enableStrictParsing' => true, 'suffix' => '.html', + 'rules' => [ + // ... + ], ], ], -]; +] ``` -### Handling REST requests +The above configuration will let the [[yii\web\UrlManager|URL manager]] to recognize requested URLs and also create +URLs with `.html` as their suffix. -TBD: -- RESTful routing: [[yii\filters\VerbFilter]], [[yii\web\UrlManager::$rules]] -- Json API: - - response: [[yii\web\Response::format]] - - request: [[yii\web\Request::$parsers]], [[yii\web\JsonParser]] +> Tip: You may set `/` as URL suffix so that the URLs are all ended with a slash. +> Note: When you configure a URL suffix, if a requested URL does not have the suffix, it will be considered as + an unrecognized URL. This is a recommended practice for SEO purpose. + +Sometimes you may want to use different suffixes for different URLs. This can be achieved by configuring the +[[yii\web\UrlRule::suffix|suffix]] property of individual URL rules. When a URL rule has this property set, it will +override the suffix setting at the [[yii\web\UrlManager|URL manager]] level. For example, the following configuration +contains a customized URL rule which uses `.json` as its suffix instead of the global one `.html`. + +```php +[ + 'components' => [ + 'urlManager' => [ + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'enableStrictParsing' => true, + 'suffix' => '.html', + 'rules' => [ + // ... + [ + 'pattern' => 'posts', + 'route' => 'post/index', + 'suffix' => '.json', + ], + ], + ], + ], +] +``` -### Customizing URL Rules -[[yii\web\UrlRule]] class is used for both parsing URL into parameters and creating URL based on parameters. Despite -the fact that default implementation is flexible enough for the majority of projects, there are situations when using -your own rule class is the best choice. For example, in a car dealer website, we may want to support the URL format like -`/Manufacturer/Model`, where `Manufacturer` and `Model` must both match some data in a database table. The default rule -class will not work because it mostly relies on statically declared regular expressions which have no database knowledge. +### HTTP Methods <a name="http-methods"></a> -We can write a new URL rule class by extending from [[yii\web\UrlRule]] and use it in one or multiple URL rules. Using -the above car dealer website as an example, we may declare the following URL rules in application config: +When implementing RESTful APIs, it is commonly needed that the same URL be parsed into different routes according to +the HTTP methods being used. This can be easily achieved by prefixing the supported HTTP methods to the patterns of +the rules. If a rule supports multiple HTTP methods, separate the method names with commas. For example, the following +rules have the same pattern `post/<id:\d+>` with different HTTP method support. A request for `PUT post/100` will +be parsed into `post/create`, while a request for `GET post/100` will be parsed into `post/view`. ```php -// ... -'components' => [ - 'urlManager' => [ - 'rules' => [ - '<action:(login|logout|about)>' => 'site/<action>', +[ + 'PUT,POST post/<id:\d+>' => 'post/create', + 'DELETE post/<id:\d+>' => 'post/delete', + 'post/<id:\d+>' => 'post/view', +] +``` - // ... +> Note: If a URL rule contains HTTP method(s) in its pattern, the rule will only be used for parsing purpose. + It will be skipped when the [[yii\web\UrlManager|URL manager]] is called to create URLs. - ['class' => 'app\components\CarUrlRule', 'connectionID' => 'db', /* ... */], - ], +> Tip: To simplify the routing of RESTful APIs, Yii provides a special URL rule class [[yii\rest\UrlRule]] + which is very efficient and supports some fancy features such as automatic pluralization of controller IDs. + For more details, please refer to the [Routing](rest-routing.md) section about developing RESTful APIs. + + +### Customizing Rules <a name="customizing-rules"></a> + +In the previous examples, URL rules are mainly declared in terms of pattern-route pairs. This is a commonly used +shortcut format. In certain scenarios, you may want to customize a URL rule by configuring its other properties, such +as [[yii\web\UrlRule::suffix]]. This can be done by using a full configuration array to specify a rule. The following +example is extracted from the [URL Suffixes](#url-suffixes) subsection, + +```php +[ + // ...other url rules... + + [ + 'pattern' => 'posts', + 'route' => 'post/index', + 'suffix' => '.json', ], -], +] ``` -In the above, we use the custom URL rule class `CarUrlRule` to handle -the URL format `/Manufacturer/Model`. The class can be written like the following: +> Info: By default if you do not specify the `class` option for a rule configuration, it will take the default + class [[yii\web\UrlRule]]. + + +### Adding Rules Dynamically <a name="adding-rules"></a> + +URL rules can be dynamically added to the [[yii\web\UrlManager|URL manager]]. This is often needed by redistributable +[modules](structure-modules.md) which want to manage their own URL rules. In order for the dynamically added rules +to take effect during the routing process, you should add them during the [bootstrapping](runtime-bootstrapping.md) +stage. For modules, this means they should implement [[yii\base\BootstrapInterface]] and add the rules in the +[[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] method like the following: + +```php +public function bootstrap($app) +{ + $app->getUrlManager()->addRules([ + // rule declarations here + ], false); +} +``` + +Note that you should also list these modules in [[yii\web\Application::bootstrap]] so that they can participate the +[bootstrapping](runtime-bootstrapping.md) process. + + +### Creating Rule Classes <a name="creating-rules"></a> + +Despite the fact that the default [[yii\web\UrlRule]] class is flexible enough for the majority of projects, there +are situations when you have to create your own rule classes. For example, in a car dealer Web site, you may want +to support the URL format like `/Manufacturer/Model`, where both `Manufacturer` and `Model` must match some data +stored in a database table. The default rule class will not work here because it relies on statically declared patterns. + +We can create the following URL rule class to solve this problem. ```php namespace app\components; @@ -436,10 +583,11 @@ use yii\web\UrlRule; class CarUrlRule extends UrlRule { - public $connectionID = 'db'; + public $db = 'db'; public function init() { + parent::init(); if ($this->name === null) { $this->name = __CLASS__; } @@ -471,10 +619,31 @@ class CarUrlRule extends UrlRule } ``` -Besides the above usage, custom URL rule classes can also be implemented -for many other purposes. For example, we can write a rule class to log the URL parsing -and creation requests. This may be useful during development stage. We can also -write a rule class to display a special 404 error page in case all other URL rules fail -to resolve the current request. Note that in this case, the rule of this special class -must be declared as the last rule. +And use the new rule class in the [[yii\web\UrlManager::rules]] configuration: + +```php +[ + // ...other rules... + + [ + 'class' => 'app\components\CarUrlRule', + // ...configure other properties... + ], +] +``` + + +## Performance Consideration <a name="performance-consideration"></a> + +When developing a complex Web application, it is important to optimize URL rules so that it takes less time to parse +requests and create URLs. + +By using parameterized routes, you may reduce the number of URL rules, which can significantly improve the performance. + +When parsing or creating URLs, [[yii\web\UrlManager|URL manager]] examines URL rules in the order they are declared. +Therefore, you may consider adjusting the order of the URL rules so that more commonly used rules are placed before +less used ones. +If some URL rules share the same prefix in their patterns or routes, you may consider using [[yii\web\GroupUrlRule]] +so that they can be more efficiently examined by [[yii\web\UrlManager|URL manager]] as a group. This is often the case +when your application is composed by modules, each having its own set of URL rules with module ID as their common prefixes. diff --git a/docs/internals/translation-status.md b/docs/internals/translation-status.md index 6a24519..642fe28 100644 --- a/docs/internals/translation-status.md +++ b/docs/internals/translation-status.md @@ -27,7 +27,7 @@ structure-assets.md | Yes structure-extensions.md | Yes runtime-overview.md | Yes runtime-bootstrapping.md | Yes -runtime-routing.md | +runtime-routing.md | Yes runtime-requests.md | Yes runtime-responses.md | Yes runtime-sessions-cookies.md | Yes From 9da53b702c7b77f022a351ec8a71f30bf277a8fa Mon Sep 17 00:00:00 2001 From: Qiang Xue <qiang.xue@gmail.com> Date: Mon, 3 Nov 2014 17:05:00 -0500 Subject: [PATCH 058/144] typo fix [skip ci] --- framework/db/QueryInterface.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/db/QueryInterface.php b/framework/db/QueryInterface.php index f6c1181..cb08e8e 100644 --- a/framework/db/QueryInterface.php +++ b/framework/db/QueryInterface.php @@ -102,7 +102,7 @@ interface QueryInterface * - **or**: similar to the `and` operator except that the operands are concatenated using `OR`. For example, * `['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]` will generate `(type IN (7, 8, 9) OR (id IN (1, 2, 3)))`. * - * - **not**: this will take only one operator and build the negation of it by prefixing the query string with `NOT`. + * - **not**: this will take only one operand and build the negation of it by prefixing the query string with `NOT`. * For example `['not', ['attribute' => null]]` will result in the condition `NOT (attribute IS NULL)`. * * - **between**: operand 1 should be the column name, and operand 2 and 3 should be the From 6580b608e1ce6f2a90fedf9522a80688aa1ba23a Mon Sep 17 00:00:00 2001 From: Alexander Makarov <sam@rmcreative.ru> Date: Tue, 4 Nov 2014 01:50:43 +0300 Subject: [PATCH 059/144] Fixes #5874: Upgraded Twitter Bootstrap to 3.3.x --- extensions/bootstrap/CHANGELOG.md | 1 + extensions/bootstrap/composer.json | 2 +- framework/CHANGELOG.md | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions/bootstrap/CHANGELOG.md b/extensions/bootstrap/CHANGELOG.md index 93c3ff4..51c3116 100644 --- a/extensions/bootstrap/CHANGELOG.md +++ b/extensions/bootstrap/CHANGELOG.md @@ -6,6 +6,7 @@ Yii Framework 2 bootstrap extension Change Log - Bug #5570: `yii\bootstrap\Tabs` would throw an exception if `content` is not set for one of its `items` (RomeroMsk) - Enh #5735: Added `yii\bootstrap\Tabs::renderTabContent` to support manually rendering tab contents (RomeroMsk) +- Chg #5874: Upgraded Twitter Bootstrap to 3.3.x (samdark) 2.0.0 October 12, 2014 diff --git a/extensions/bootstrap/composer.json b/extensions/bootstrap/composer.json index e90811a..4a5da0d 100644 --- a/extensions/bootstrap/composer.json +++ b/extensions/bootstrap/composer.json @@ -19,7 +19,7 @@ ], "require": { "yiisoft/yii2": "*", - "bower-asset/bootstrap": "3.2.* | 3.1.*" + "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*" }, "autoload": { "psr-4": { diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index c8fd8b0..61c07fb 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -31,7 +31,8 @@ Yii Framework 2 Change Log - Enh #5806: Allow `Html::encode()` to be used when the application is not started (qiangxue) - Enh: `Console::confirm()` now uses `Console::stdout()` instead of `echo` to be consistent with all other functions (cebe) - Chg #3630: `yii\db\Command::queryInternal()` is now protected (samdark) -- Chg #5508: Dropped the support for the `--append` option for the `fixture` command (qiangxue) +- Chg #5508: Dropped the support for the `--append` option for the `fixture` command (qiangxue) +- Chg #5874: Upgraded Twitter Bootstrap to 3.3.x (samdark) 2.0.0 October 12, 2014 ---------------------- From 40368ee2a08efd64d41034634ec258c3f41c9d87 Mon Sep 17 00:00:00 2001 From: Carsten Brandt <mail@cebe.cc> Date: Tue, 4 Nov 2014 00:32:49 +0100 Subject: [PATCH 060/144] Update UPGRADE.md Added note about bootstrap version. --- framework/UPGRADE.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index 12928c8..f6179f4 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -8,6 +8,16 @@ if you want to upgrade from version A to version C and there is version B between A and C, you need to following the instructions for both A and B. +Upgrade from Yii 2.0.0 +---------------------- + +* Upgraded Twitter Bootstrap to version 3.3.x. If you need to use an older version (i.e. stick with 3.2.x) you can + specify that in your `composer.json` by adding the following line in the `require` section: + + ```json + "bower-asset/bootstrap": "3.2.*", + ``` + Upgrade from Yii 2.0 RC ----------------------- From a81482b9672d49e33e21e32da18580427a58bf68 Mon Sep 17 00:00:00 2001 From: Carsten Brandt <mail@cebe.cc> Date: Tue, 4 Nov 2014 00:35:57 +0100 Subject: [PATCH 061/144] more on bootstrap upgrade --- composer.json | 2 +- framework/UPGRADE.md | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 03b04f5..58b87a6 100644 --- a/composer.json +++ b/composer.json @@ -82,7 +82,7 @@ "bower-asset/jquery.inputmask": "3.1.*", "bower-asset/punycode": "1.3.*", "bower-asset/yii2-pjax": "2.0.*", - "bower-asset/bootstrap": "3.2.* | 3.1.*", + "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*", "bower-asset/jquery-ui": "1.11.*@stable", "bower-asset/typeahead.js": "0.10.*" }, diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index f6179f4..0925e48 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -11,8 +11,9 @@ for both A and B. Upgrade from Yii 2.0.0 ---------------------- -* Upgraded Twitter Bootstrap to version 3.3.x. If you need to use an older version (i.e. stick with 3.2.x) you can - specify that in your `composer.json` by adding the following line in the `require` section: +* Upgraded Twitter Bootstrap to [version 3.3.x](http://blog.getbootstrap.com/2014/10/29/bootstrap-3-3-0-released/). + If you need to use an older version (i.e. stick with 3.2.x) you can specify that in your `composer.json` by + adding the following line in the `require` section: ```json "bower-asset/bootstrap": "3.2.*", From bdf266409b9f0f9049430bc97bf5785088eeb4f0 Mon Sep 17 00:00:00 2001 From: Alexander Makarov <sam@rmcreative.ru> Date: Tue, 4 Nov 2014 03:00:14 +0300 Subject: [PATCH 062/144] Fixes #4909: updated application lifecycle diagram to use "request component" and "response component" instead of "request" and "response" in order to prevent confusion --- docs/guide/images/application-lifecycle.graphml | 84 ++++++++++++------------ docs/guide/images/application-lifecycle.png | Bin 40306 -> 38617 bytes 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/docs/guide/images/application-lifecycle.graphml b/docs/guide/images/application-lifecycle.graphml index f701c62..aed5293 100644 --- a/docs/guide/images/application-lifecycle.graphml +++ b/docs/guide/images/application-lifecycle.graphml @@ -28,7 +28,7 @@ <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/> </y:ModelParameter> </y:NodeLabel> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="29.16015625" x="-33.16015625" y="26.002094268798828">user<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="27.34375" x="-31.34375" y="25.717914581298828">user<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -48,7 +48,7 @@ <y:Geometry height="45.0" width="119.0" x="789.0653619766235" y="637.1271178722382"/> <y:Fill color="#99CCFF" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="40.28125" x="39.359375" y="13.43359375">model<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="36.68359375" x="41.158203125" y="13.1494140625">model<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -65,7 +65,7 @@ <y:Geometry height="46.887996673583984" width="39.527000427246094" x="828.8018617630005" y="544.9831195354463"/> <y:Fill color="#CCCCFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="56.27734375" x="-8.375171661376953" y="-30.154888153076172">database<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="53.376953125" x="-6.924976348876953" y="-30.723247528076172">database<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -93,7 +93,7 @@ <y:Geometry height="45.0" width="119.0" x="789.0653619766235" y="713.6271178722382"/> <y:Fill color="#99CC00" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="29.611328125" x="44.6943359375" y="13.43359375">view<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="28.005859375" x="45.4970703125" y="13.1494140625">view<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -110,10 +110,10 @@ <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> - <y:Geometry height="376.3268349409104" width="219.27949905395508" x="527.4919853210449" y="408.6371007919311"/> + <y:Geometry height="377.0372841596604" width="219.27949905395508" x="527.4919853210449" y="407.9266515731811"/> <y:Fill color="#FFEFD6" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FF9900" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="219.27949905395508" x="0.0" y="0.0">controller</y:NodeLabel> + <y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FF9900" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="219.27949905395508" x="0.0" y="0.0">controller</y:NodeLabel> <y:Shape type="rectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> @@ -123,7 +123,7 @@ <y:Geometry height="50.0" width="50.0" x="313.2978515625" y="412.2765645980835"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> - <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel> + <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 1</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> @@ -139,7 +139,7 @@ <y:Geometry height="30.0" width="150.55899810791016" x="563.2124862670898" y="445.3031164169311"/> <y:Fill color="#FFFFFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="78.888671875" x="35.83516311645508" y="5.93359375">create action<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="72.70703125" x="38.92598342895508" y="5.6494140625">create action<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -156,7 +156,7 @@ <y:Geometry height="45.0" width="159.91864204406738" x="558.5326642990112" y="521.8166599273682"/> <y:Fill color="#FFFFFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="88.392578125" x="35.76303195953369" y="13.43359375">perform filters<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="77.34765625" x="41.28549289703369" y="13.1494140625">perform filters<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -173,10 +173,10 @@ <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> - <y:Geometry height="162.00283348560333" width="187.54596614837646" x="544.2255182266235" y="607.9611022472382"/> + <y:Geometry height="162.71328270435333" width="187.54596614837646" x="544.2255182266235" y="607.2506530284882"/> <y:Fill color="#99336635" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#993366" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#FFFFFF" visible="true" width="187.54596614837646" x="0.0" y="0.0">action</y:NodeLabel> + <y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#993366" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#FFFFFF" visible="true" width="187.54596614837646" x="0.0" y="0.0">action</y:NodeLabel> <y:Shape type="rectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> @@ -186,7 +186,7 @@ <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> - <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 3</y:NodeLabel> + <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 3</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> @@ -202,7 +202,7 @@ <y:Geometry height="30.0" width="150.55899810791016" x="563.2124862670898" y="644.6271178722382"/> <y:Fill color="#FFFFFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="69.09765625" x="40.73067092895508" y="5.93359375">load model<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="62.705078125" x="43.92695999145508" y="5.6494140625">load model<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -219,7 +219,7 @@ <y:Geometry height="30.0" width="150.55899810791016" x="563.2124862670898" y="721.1271178722382"/> <y:Fill color="#FFFFFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="71.599609375" x="39.47969436645508" y="5.93359375">render view<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="66.02734375" x="42.26582717895508" y="5.6494140625">render view<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -237,10 +237,10 @@ <node id="n5"> <data key="d6"> <y:ShapeNode> - <y:Geometry height="45.0" width="96.0" x="189.47636032104495" y="713.6271178722382"/> + <y:Geometry height="45.0" width="119.0" x="198.3863394750308" y="713.6271178722382"/> <y:Fill color="#FFCC99" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="56.88671875" x="19.556640625" y="13.43359375">response<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="116.072265625" x="1.4638671875000284" y="13.1494140625">response component<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -257,7 +257,7 @@ <y:Geometry height="45.0" width="119.0" x="789.0653619766235" y="254.50096702575684"/> <y:Fill color="#FFCC99" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="47.88671875" x="35.556640625" y="13.43359375">request<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="106.732421875" x="6.1337890625" y="13.1494140625">request component<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -274,10 +274,10 @@ <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> - <y:Geometry height="143.421781539917" width="219.27949905395508" x="527.4919853210449" y="223.57918548583984"/> + <y:Geometry height="144.132230758667" width="219.27949905395508" x="527.4919853210449" y="222.86873626708984"/> <y:Fill color="#FFEFD6" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FF9900" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="219.27949905395508" x="0.0" y="0.0">application</y:NodeLabel> + <y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FF9900" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="219.27949905395508" x="0.0" y="0.0">application</y:NodeLabel> <y:Shape type="rectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> @@ -287,7 +287,7 @@ <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> - <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 2</y:NodeLabel> + <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 2</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> @@ -303,7 +303,7 @@ <y:Geometry height="30.0" width="150.55899810791016" x="563.2124862670898" y="262.00096702575684"/> <y:Fill color="#FFFFFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="80.1484375" x="35.20528030395508" y="5.93359375">resolve route<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="73.369140625" x="38.59492874145508" y="5.6494140625">resolve route<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -320,7 +320,7 @@ <y:Geometry height="30.0" width="150.55899810791016" x="563.2124862670898" y="322.00096702575684"/> <y:Fill color="#FFFFFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="99.607421875" x="25.475788116455078" y="5.93359375">create controller<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="90.0390625" x="30.259967803955078" y="5.6494140625">create controller<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -339,10 +339,10 @@ <y:ProxyAutoBoundsNode> <y:Realizers active="0"> <y:GroupNode> - <y:Geometry height="141.666015625" width="159.91864204406738" x="313.2978515625" y="225.33495140075684"/> + <y:Geometry height="142.37646484375" width="159.91864204406738" x="313.2978515625" y="224.62450218200684"/> <y:Fill color="#FFCC0024" transparent="false"/> <y:BorderStyle hasColor="false" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FFCC00" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="159.91864204406738" x="0.0" y="0.0">entry script</y:NodeLabel> + <y:NodeLabel alignment="center" autoSizePolicy="node_width" backgroundColor="#FFCC00" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="159.91864204406738" x="0.0" y="0.0">entry script</y:NodeLabel> <y:Shape type="rectangle"/> <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/> @@ -352,7 +352,7 @@ <y:Geometry height="50.0" width="50.0" x="313.2978515625" y="225.33495140075684"/> <y:Fill color="#F5F5F5" transparent="false"/> <y:BorderStyle color="#000000" type="dashed" width="1.0"/> - <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 4</y:NodeLabel> + <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 4</y:NodeLabel> <y:Shape type="roundrectangle"/> <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/> <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/> @@ -368,7 +368,7 @@ <y:Geometry height="30.0" width="129.0" x="329.2164936065674" y="262.00096702575684"/> <y:Fill color="#FFFFFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="94.673828125" x="17.1630859375" y="5.93359375">load app config<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="85.3984375" x="21.80078125" y="5.6494140625">load app config<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -385,7 +385,7 @@ <y:Geometry height="30.0" width="129.0" x="329.2164936065674" y="322.00096702575684"/> <y:Fill color="#FFFFFF" transparent="false"/> <y:BorderStyle color="#000000" type="line" width="1.0"/> - <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="91.8203125" x="18.58984375" y="5.93359375">run application<y:LabelModel> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" modelName="custom" textColor="#000000" visible="true" width="82.052734375" x="23.4736328125" y="5.6494140625">run application<y:LabelModel> <y:SmartNodeLabelModel distance="4.0"/> </y:LabelModel> <y:ModelParameter> @@ -411,10 +411,10 @@ <edge id="e1" source="n5" target="n0"> <data key="d10"> <y:PolyLineEdge> - <y:Path sx="-10.81052179205907" sy="-22.46484374999998" tx="0.0" ty="0.0"/> + <y:Path sx="-31.22050094604495" sy="-22.49430537223816" tx="0.0" ty="0.0"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="28.000006009454637" y="-193.20499098300934"> + <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="4.0" x="28.00000600945461" y="-193.17557203769684"> <y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> @@ -423,7 +423,7 @@ </y:ModelParameter> <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/> </y:EdgeLabel> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="19.17578125" x="-9.587884615545363" y="-200.27139723300934">11<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="17.34765625" x="-8.673822115545391" y="-200.52615797519684">11<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -441,7 +441,7 @@ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="-30.207454877387818" y="-10.065448760986328">3<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="-29.525518994973595" y="-10.349628448486328">3<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -469,7 +469,7 @@ <y:Path sx="0.0" sy="0.0" tx="-79.9882439360955" ty="0.0"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="37.24206271236892" y="-9.066415786743164">1<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="36.76878085201736" y="-9.523307113000556">1<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -487,7 +487,7 @@ <y:Path sx="0.0" sy="0.0" tx="2.408647025755731" ty="-181.21658369302781"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="-5.416119621118469" y="19.25165109634395">4<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="-4.962140296002758" y="18.61224679946895">4<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -505,7 +505,7 @@ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="-30.77317586853087" y="-9.06642460823059">9<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="-30.100868416252297" y="-9.35060429573059">9<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -523,7 +523,7 @@ <y:Path sx="0.0" sy="-2.2737367544323206E-13" tx="0.0" ty="0.0"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="19.17578125" x="-93.46793455769887" y="-9.066424608230705">10<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="17.34765625" x="-83.18526519030615" y="-9.350604295730818">10<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -541,7 +541,7 @@ <y:Path sx="55.750299312644984" sy="0.355224609375" tx="-109.63961141576266" ty="42.066115379333496"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="28.868979454040527" y="-9.066415786743164">2<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="29.326010704040527" y="-9.508390885372137">2<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -559,7 +559,7 @@ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="-31.923049588221375" y="-10.06642460823059">8<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="-31.270312699786246" y="-10.35060429573059">8<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -574,12 +574,12 @@ <edge id="e9" source="n4::n1" target="n5"> <data key="d10"> <y:PolyLineEdge> - <y:Path sx="-79.9882439360951" sy="2.2737367544323206E-13" tx="24.24112858184396" ty="-1.4999999999999991"> - <y:Point x="261.71748890288893" y="544.3166599273684"/> + <y:Path sx="-79.9882439360951" sy="2.2737367544323206E-13" tx="30.048898971244075" ty="-1.4999999999999991"> + <y:Point x="287.93523844627487" y="544.3166599273684"/> </y:Path> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="-83.6574311462557" y="-9.066396713256609">6<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFFFFF" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="-76.70009317381192" y="-9.350576400756609">6<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -597,7 +597,7 @@ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFEFD6" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="-5.793964385986328" y="4.999985313415493">5<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFEFD6" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="-5.336933135986328" y="4.999985313415493">5<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> @@ -615,7 +615,7 @@ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-81.01828954355172"/> <y:LineStyle color="#666666" type="line" width="2.0"/> <y:Arrows source="none" target="standard"/> - <y:EdgeLabel alignment="center" backgroundColor="#FFEFD6" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="11.587890625" x="-5.903311505104057" y="5.037729263305664">7<y:LabelModel> + <y:EdgeLabel alignment="center" backgroundColor="#FFEFD6" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="18.701171875" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="10.673828125" x="-5.4491733540852465" y="5.039560317993164">7<y:LabelModel> <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/> </y:LabelModel> <y:ModelParameter> diff --git a/docs/guide/images/application-lifecycle.png b/docs/guide/images/application-lifecycle.png index 1a47ee99dd5df6b3f8d9a59ad21e003f265940bd..f9ed032cec2432925eea80ece48ad35194c3074e 100644 GIT binary patch literal 38617 zcmcG02T+sW(=K3?h?FRxA~h%?AVm<6UZO}*dhgOZ(tDMnNUzdSdY4{9QK_M~&_Ox` z2)%`J-{|jOzL|Sx?#!L*OdOJ&_nh55dv^CcyPHq)vag8<9uVN*;1EekzEs4)xdy_) z!BYU=06xL=zrTZn<BKEpQcT%(ax)d*lg#)s`1omVntN`pPlOUN-w2FE;r1(H1qFow z2$%sPehZ@L2hpUf6kYrJ5H5{=^)iWU{Vm_im&yS!5E&?H5duBESmkYqdBf9?OvJtH zCY+9DoJgE-F=0%cId(%7{lo>9{r~olm*DipIeO1-sW2cCmEzQ!zDSJ^EM}h$d0JR0 z*3KUQu}|e%?b37Yz{RPZ3_;kuCZAaT_;@MDD0z_`j0*)pad2uA$rE(KRU`r;lcTr7 z)gXA{U~xc35J&(HlrDe{5FQv;4E%rm*q&7}Gj>-s;mhf6bvQC-bL1Ja)XE=%gF^=b zK}Erx+#gRF%@cQDWMsjrA899-!w@eXRsT3-O8zr*tCREw@uIODVx~iV(J9y}Il5Vw zR9w{lGejGahch1N`)8CGjpUj@JHBh`v{xwZGIhDJ;-&jrFz#;bPcN#WydoG)V+Ztj zc0E$j$DwoNu?EWw*H3E2?Psez%e4K1Zx|a6o7};DL@tt^uYv_V(_xp62{3V8$Iija zOKPps4Pv)7-C#1WmQ%sw@_u3m$?0Tbri0g}6Qk))otHEkdQ;K&gOxqI>ms5fUKlAn zzq$to_Eh}+49k>T`CbaG9;vu|M&=^=v(Q?kX1{=u%e`Q#we=!V6qDe%fJ5NrrN|4G zK21McOnk+jmCE#mhV4B(FDsRLmbmww6@jU7t}{OKT*Pi0rI*yn(ytT0^+{iBjA<ZL z#h5PgU_6x$olTE|1L7QLR-?QVBVHLBDH;YBg*w<cpje6dczmx&0)P#N?j+sPq8e(7 zf)R);MT*QUMsAeyEumf|vUJGY5Xds1$W+w#Jc;+5KJlel(?%llI0O$&0iMU9P+L>0 zX7^Z!L>qyOIM@P=3%$SD(YHnX^uY5?eKRLR3dZBxN0_^Wv96EJhl-xytA4khdUPhO z`)sp~B^o*~XZnCV(!T!%g8fQ+<+oTGuzS9crN9)Lg`&o*7aSFjTnk!qN4n3a@3dce zC}v!tgl@LZZuiYqmD>~xL@jKRpD<4}8#>T(8pXk@!}eXajNgl}ZAI-IO|mt5cm=<J z0{R!p9w6F*On9;qNwgS7GL=pIsbs4Na#cH7H*00b#XK8R&u5gq`}@J&H48hf-$jy^ zZ8HS{T2q#8KPUOJ(s!YaV~1aDRmQn91^8H|)52dHzpP0g7-b@s34Xz{eKtOsGt^AA zw<(em=NT8$qDH+pGAD$d(=?F^oj5yvo$HwQw9<P1=^VeXT<J|fqxTdmjXl+MOi`{A z25Bris<#^BZm{!dp)YjMQs5Pd7faz&CEMeTH~p$lENy)~+}`RrABnqe6z^1p{!wN> zmIl*$&4U#a-4b#OYo;3J0Vcad53(MT-FIoh$hCUmvP1-n;*(7KlEJalEO38E)^fr7 zycBgr<wCP*{QfcAp`2#_lM1mp*?jDMIgHCaJPfK#xAemGK4$=AsV#-}H&ue(iMQ!> zZ~5;Iu3@<Z=V#STEawx&$B#h6$^1(tQ>9q)TG!6{>hQt1f6lu0;+w7Y^Y0_wl|q_+ zBqd*}IJffsx1_+8hciuH2_}8N1&(NZKgbBu4rgx>GhM_g5hzpDbGw9muJX1K37+2d zK$mt6U(N)!z?YlF$TQ3LZ(y}x%Pdg4G+F5bSNwXdj~uyc>T@fflIpP<pQ)?Ev;a{C zaUbM6@v(ZD%v4fO57m7%mMZ@ztNTs{Wf!%&UO$+w|BJkLj`t%~OPpSWdu+md?U_NU zXg_l6E#$Ih88ZHaAiJV@E0>tuLbI2zvU9dTL}&u)GV@ytJbjF21ED&gAh6gaVsoWW zx`I1MkEP$8kwz)nkW($v>02rHptIGr;AwBmc507v4YajlnXnuh;%Jw(Zzs;Ms^gc# zeTW`+)L70<-G^=(7pjw;R#aG}-qWW}IIT|p2>ENn$X~O}xR3MGws?()bKgAH1p7%a zh<Xr&h-{GEw(Y3&X;LU#k8w+srSskqUPWsr@@hfVjJH(=r1}MN&KN=b`QuGZR#L0K zEC7q!i5QfwB~Bj<sUa>M45<xAB0tq!SeTU1;U_rH@~v$Pq)f4f^-j3kif6bG4hi6{ zYvWN1XVpMP1&B{QtVkd5)s(H!k0Vr}gYRB5Gip{7iwwElnozmCjrYe+bmlNLjX&%o z_%8dsYI|q#J5fWIEcl@0WgLQU=|FQ%JmXFVW{BoyYViElm&zZd<anu}R@9lY52}xu z*FXmFYXfb?eH}N$!U)>0X{_?PlHz$aF^CzG0`IM5Z<kfO_yA^EJQDe<#haH_PVcEn zRsB@(@kzsMx*1DT?y8B4)!0n1<6KjBHHi@YUo#pvSa$BNMqNxc=as;9BvmtU(~p>) zQ|rJRtp%>!D}i}A-j{do$od&lv^Z$*B-<KgoEV{zu+Gn_6ihzh@w}WAFO~MI%iW<p zl}DAiznb6}OK~v7|NQ9f&nC?tbA{Jn9Gnc_n||;gB{j1ncTZW?%?I8IG*u5CYTiUn zC7)^K&_tBZf^<x2`IqFL@(nER9%}piHDYaR@2N1g7bzu-SW1_aptZV#?|9t>25Q|Y z=E&c3E#`MToCE#KM~c~y;R$i`ty9;g4ZaiIu3>ofAD^k+kun#HA3R3~s#~o;bME6f zwJ3mympC+~UD^tF;o?B>{2@zCsEwX`LSbO&QoSix`VtO~8av1*PL3*q)LyB)&yG=C z6f6cXgB?o;3IMz_VD{+%Y5zZb94Yt|RBkx!P;O~eyZK=Fm2>!8dN+>rP-|9!*TC_R zs!@mm1^E661VGTvR@3b-WUw1-6t|;E${jZCHF!^DEn<K`;SWJ{powO7PfoT_X-Ds# zFJ%Ay#pMC<)9k$zc88#^u>TDA_M8o$kz3|VH<>#5G4cc#N{5XX03ORp{b9;!`{vFO zY|>$OfWQNS_m>D!Fu?tPy=!3^El_FT<>1&k&B)03$nUg4c#DWA)!N8AQz9&f$9yPD z>*DNiu1F!X{aSlY^P<%<HFSU;Si!yqvLhm0GF24;h!O<d3GR+#xvFqK++YeK+~hKv z$A{r~+YEkdJ3To$(F@bI8Z8(N+}YW2sIo*}=1YWS7#_l4#N6iUSNf@%+*eAh9P?(Q z1-NtgpchJ`iRc1+)r)eIDqjZfLbYOQDynnFzP(;@yeH#yAU7Borv&k@W!t7~n=g1_ zcsIuK6c$At9S_*My1MdV!NhS<4_|lZDP$TQtPQRY8b6c>jl8_T$cT%JYpScOCn*dj zL`FjLRSM&ki#1gUp^_21FGeAOpM$7U^6x_4=V?|IkcKU1hpkR`Cj$BpNEL#IefdMC z&wq>c-zPuddz<u}Z@5scR7UeRt$=e;D6Pn>X?qwYqhWjKv+G~=n!Sh0jb-wca>GZ8 zwbU%eiV~#=tfaW?TO$J=2KoMK2%-l32B3Ss5FFqI379w0SME-K&b&IjxUk?&!D%E} zAVNR?mbmg*w2h9Rf0FFlTY33N_Gd3B@2fj`hCRTQ+f4v=^B>B}wbSXZo-6kEPe%ZA z(FH5#$^Yho-8ic>8(ipU{eZ7GCJk@K%MiN8Z)J9}^V>xE#?xm5Pzfn1siE)hU=H^c zwkE482p@LemnGW~F`NnA7%fa#Vh3VSfHpdiFQoRSm;te_2~z+NP4c0sUCV4{>K$TY zVtjUA-yk%PJldL+UX&opmVN(yge3oA7%EuugS%6<O{)IQ;(PSJdy}MsiK!nkFtkkz zv$6HX`t!F|G32>((<;gvi!OJ^ovyqH0Q54z7e$8spAN)JkjXh)Z;Xi7BcbL$;MJq& z@EqqbALf_+@gP95BhQ_)$-z*AhfaHpC@k{uCw*@b#T_W^eMHWY8M9RJ1B$7!xW{jQ zJStOSG@omNkB|_>>Br%rVIO5F&5Pi7&yD}?B@Q+^2e%SsSd13H1e`VwM5r$p-`+So zMkkClYACG_2)<l7vY@AY{j$4SL808iv2yc43}3xfLz&HRgF<<GWFXT_vLqr0dS^DP z>{myXJu$RE>$L^4;42(YV}<NKLKXjpDjP!Y1{Avz&OhpNA9{Z-TPESTEhh(uv8bkz z>u{y8-Pdw^d54N}G#hTyw}lKL{GS5PV?PEtJt}akeQq%#|6rt)5!zbyhy%4Hb*08i zM@RqS#mVux(_cP(lUYFNwt8&Mm*4RLhQx&L`P=C<IKMr7bnW4s7cV!@V}9;BV<8RW zPTyP_T%Ypc&ao&3&Sn=Sb4p#c9}j}0&EWMzd184ZrCM4A*G(kFR37^I;ob^ebdPT) z{-dKf?-v8-H(eTxCj6PAN2+4pq`#m?9zs%H*ooIWuG7DJ_paP|OB1_sYBE(8qh~Ig z<GU%d<efTT{>POV)+UV^#C~+Lb{XM#g`s0?5%nD?Tx&EY2wIh;+WTPWd($P&Q?XIb zEV}O&EnO`w%uXk$rMJ-WW}jxl2hX1%<6SD$n>_1Iv%PNKym^O~7He_9Vl)lg5!3?l z=)idlJ8$>M&7TZBk0t2o>9d@)W%zuoTuScv@2~dD{QePW+!+ZiH|n~>r0^}^srq*u z==bIE5Zvq4-_XaFufd#3+0t>32L}f|!gyz8oGI?}yY2*b?wH)0+maWtMl?iKk6k{| z5UEToq8@o!9Uj{FZPx$oLwaM$sWZh=XQ!KlgwN5+BXn8L^<>J$58m@}aL@(4gSjbz zRZDeQ$yro;s+MP-5|A?+&E~iaetUI?lJfJv=tnnUwmq3Z&8g>agms_24$3-+&dZZj z0u>eM@Ngk}q2pDS367{S)(h^psr)M9FxYK8t?edMI35egyV*H_j_WMj2oSfXm9}=m zW)1b$$g|(8s&6+^l9Q?8ElLM$?~iH6AK1`w@gt**y(qh@St9*)c$mQ4Ss9vD7K*&J z@gw=<k4EuQ;h@n1RqA_WWC!<szMextC}b%w%a33ZT3NmLq$CTQLPU-A)JoYauZePF zVU`=S-7mb(DmQ20Q`6}s!($S92zZ(K@MDLD%-0bn828FeA&;X@!0`2`7P4wpXO&KU zfA?Y98?&`ydA3nl+S9RJ>a;$TZ4bPjqJZO0S7UI|kDh5jHWJU2QeqBw7b8THkb%0x z_t<rNj@--jjx}*dP~GA_b7h9X{THVWDchLQEl0hhRgH*4FWA-NGf%I%U6;8!4X`Zj zEcCOfTqMt~UE-q_X>^(n!(pyhox5V$Wf-$c!K0r+L=8;h@7=c`6I_Lbo2kP(su32c zO`gNQh|A6NE2(rR84(VuO_Yp?psLu<TCclH%s;I!t2cYNZx%Pws*%Jpd@vkB3>!C? zI@?{AKIn+4Hw^7qtnL;#dw2B)fsC+BHWwK~36wFnX*b#0MAvC2tb5B9Q=~MdZmXr| zPHm;nJwyo4AgU8em(AR?9y7QK%KD@)_5)hj2%)0#EL4En(o$1<nGIx!C8*puNDeVH zG-NvtC6d(<%G1c1^&?TnYj5jpO0+i8xN0xA7d4!S`uV9{m8Y4K>BD4@v}Ccx9qoqd z=Y;vJ+#m4XLcs-hzYEk##MPYKTDFD`kjP$K06Nam4A*RMV|<(R=pLJPq++&oVljVx zqwDU%I;*fI6PsE|%7n*ArMVK5YSEY1&>fW^nxCX{g74yobLD6qQoZfcYL?Rmu3$no z)U!%ilD9SL?6Z+b!!4zT5<~(!`|sbs6)VjY)&c)fCyS^(9MkGWX1W}>@3i7qG^%>Z z1`?1DA+gs9U9&cJjq)rv>Lx%dRt^<1C5ZN~)UQ?#HIs!rs+nfpsZlON&&>u}&UJ#l zj9i2?knnh8+uPg7(sYgZ1#_PX>Reryv?J8)iM~$}x$H&qno~jlF`xztV8`g4?|$&% z;OlPEMn(ZWDT0c#=>qFXrbix`;rB6;-BQ)Ib4~3RRe2xd*mNd0y=H1`_0H@Ug}mO# zB97y|WE8_O1<Dp}6-$c|lKBfhF>2{PKZ*jzT;Z|GPcBG4krY3XBXg59IX1VkDMWP( z?SBbqy!iHrr}!y3LeRLKx#Mi+qO4}Ga!6-03ZJ25HhCzcTV@5l${QB>Zfk@8O6@~8 zB6};dg33YkG<vW7vs}_LIn#lulKjEAqffnH{gI{O$ybcAVom#sUF?&i?{!x>qq^~! zs}uZBd8Z+6Z<2zq(8Bw5^{F(;O-;gOVv6U3&7Etqhr@a`x#h*k{N)6nZM%Kf&%)=v z2O;^}`%V~lS?5w}Xs7qM{8u2#OWc~OX?||MBuQQ4##Z1K<6wA4oZYsH=-#AYW8G8P z5_Y}bExLqi;>ZuT1iFX3!vv-M`tI$R&iYA<U5y=P$@W?(vS)=qFSz%VyAWSmUcV)A zauiP-u-RB0lPuoRq!M(M->zLGt{Cktc*-(qkyk7@=5X*~QapIV^$wnO*}iHJ&4=v{ z3l%~8rH|7dXn48BD02j2i`6@%dMtrei)Yw!h<$SZ$i31(W6F%ZrOsh>2r)qLG0-NL zHM2fdWgS^!gRxBJc!!6*A~Qh;u1+gV`*ZX@7<b1?>6Hpu9?$tSzey9EC=#4vvFE1| zX+U+=^Hdt^G5ip3(<=3`#W*yl%|r}Od8-wv|5gDHl~PV&!bC8AVdCFS5%@I0_{%G6 zSE0O>t5Vs0^n84$Nn0+hoi?UGR6S+epwj0p*yCBmdT1<7_ExWybw~5lm~@${S(Tzy zF=e7WyB2U}W@EEBDu%3zhvOYB&l^vhH-5V&5Pym*XZUP9DJQMXx<6jYY0D~7n^iNt zi<vTN`}ku2Fm;M!TDydNYok;sxhYk(y^359F}PJs^Wh=ltPAc_%XQ)8!K}ryId)pn zja*c!+dHg>3w2D6O#$ZPe9;9L7q=82AHQ^KylgSsd25o|_V(TL;Z2$_#VWOyg2qyc zk(Xn{w-QJZ4U~)yk=nD*<eN0+WBti5C=t$6J5ciAS3)r380c+{=0ds(!6ND*?Md#! z;u<RM<}GzbN;ML~S~4<qhES2Wvv={lU{y7nOlM#7bq@J|y>9+4+uSxedn=>AETRlq z;%y5HYK;4B{v}HFyz0l6c^%wIYS3_O@qGspHRxp_6L%pfc)s&fI8fAsaFdkLN&Px@ z7a5=f-F1PZ$vJU8ER$SE>$&OON^(NRm$sG>X-Czk4nh;9D#e~C4ncB1({!(~)l20A zFY4Tyi;b$aQpiaIdRo}X?03(uZZKh$?LBsxm8B*cJfV&wsNooDNOv)L5SCFqI%Zfn zI%6S*oOVaBnq1e=8Z$&GOU|ikom7zG=`F8wq~%^-s=4hnc|1Bu<usA;agJNC=`Bp^ z_}v5;a()bFu`fwTDQh6jiQyTikT=G1z;MLSNyIyhz>oOZo@zBQbZB(~f$W$>&7+(= zJcz~LhjCo)+VW;)C>Cp0@qn&h*RdMTo6J7OJeSo;p|Vgts=9OaZcd`yL6PMY9n>UY zZ1Ax&7q+z5*J^Jjbx*^>D%0T>PsB$KmeX7A0o^CgVw{CC)EWY{fGfa@3#3T>VBFjC z*rcw0`)BO?PnL=ZAg<>AkmW3|uNh{6`}P!pJ&-nD#{wH>*FCX8zp>ld!Mcg9Uv;$x z9IqY@=Pa>32SB8b84ng%gjn#6@j6sVgHc}!A5B8ToX|@T8b>qVKw{g0kdHOUOaLXr z@d*$`3^x#KP`!AMy?E@!LdHvbfBkxCK9UzTam_S>+f=j^x@E3pm&WH{QjLs(TWv9o z1mSswbL$E=T(}9y+G0i<w$=yeJ=lGDp*t>fZsv-13BQOnvh)|b>*{QX{bo&+gFQ6y zGT>$WFZWG)pzlk;DESNtT;tw&dk;rXAMr)$MCL_)bPF4Z|DaPdmvyPWPtEPfZhx}7 zG;S#o{?kh}#K|nIdQU6D>0^|zUNE&e!!%r6q`(mVCeB(<JOh@q+24!`pX#N#WowM0 zx_R8)csPzk9UV~x%un_)p1>8LK2wkntU5_*aynx*3LDeg(DEk}6GP44P4hgT<-)VJ zsf;>X<R7*t?`{9KcSCZV?q<%Go4m~Gc~-4wt$d*N!2i2}zLJJ{XA9n<8;i9NnD)T@ zNsPcqEYnTyw((%M8u~c@Q+TqZ<If}$5;6J14gR183ZJ+}R?rw_4R@#nt)+2>6KZTF zI6n|zqZq}XKXyrVF@N|7bmq5ROlbMB1*zwgdf8fH=m}>%9@)=86dMk>-I&B%+d5Q_ zNp@fc)zfZGd=KJScQwJHVTIxu$dc+L)Jr)_&hNUkKydbkcE8k&-LLO=*S33kLb372 zcSx8M+;u9QyM1oT&V8!%NMa*3peQ7#yS@RUZj5O_H`0NQs3wlf-cSj>P@8ieIh$JZ za0D)HZz<k4JZpPP>QA&dmB>29zpFxPnXSgM!7nJm*t{|BZkhMFI!UWvg>Rr?QG0x^ z<WzlG40*~d$8xMWQGHYl2l0E)6_9y6fHhl7zjhF8aw6pK)6<$mhMUK%j~|q6n~pZv zdEfFQUOaVIu&*Cj^DZhEjI$=X+EuPQKCHjE?QgY8LI=8(5?eJ9GtO}&xHL0I2XR)& zP$$k5mlVm~j3GJWj)uwbCktIGpJKYUhrTT_8&^5=aLGq2xHDm20AY|BEy7w>{RU0- z6tn6ad-ZgSnU)Y7b1Jma)d5RNw0|a&pXT|zGLdiE%&zpzq~G8B)?NnBSH&6=?)^Sk zmB0VDm}utdc0C3(fgks|1WSAUo4MMmDLt(phd(Roq2ByV>`Y8uR{1sUa~9XdYesL@ zPksY1ZqK-{9T_kj#~+D@eqV)%X5&4?8QC`6Qxh_N5)}y$xw#9afm&#x-ygGV7<#d` zA2N~%9YC;VQVROLgz`df?9<-aRcUdJrXSL>uRiTCS0(@0NvJNN7<O&T;dbLzfBND< zwI2M&VHr(nQ|@?rZbvct+1O0i`GkuuDIVrt%=%86O{&03H~V9yg9~L3TcP*E0iwgD z#&0Y39-M4&nY>czsMSJMGU&0?PbQTtZfx}vm8efr#ps>ozh+>f=kQ7e0-QGOn$fN* z&9uwP_8k;@QXIW*BchqMojcSl{pDvWz(;<D*=fC=PAT4^?!*xTh@Vh0BG<kyw|5o& zWs+%Fp5eG$NM&U!0uJBa3}`_De$2izHoP@^)saY};sxJxYvU_<jq!?b1#??E%i!0Y zyKzD(oIB{>IpEH;sFF}lhtpw~<;@(wau0Wb#8G$}6rB3#Fy`IfeutNF$1hbA5`SWf zq&Y5S=eHJ2ujk}qRX!vqA(ROYoU^Et@snL#^R+T9Fj3E1k9Y2MX^GF@EY9+9UmUy3 zZyU2yncbVd?ILG9&a$Y=l2N+MCuC!ba0rn#8JW5}$;dVL(WCSs2;ACRI}2RzhPl0} zki&7pb5r{V_u=s4+G8B;!ejsG$DpG%olo8u@8n7vxAN}UoE<~VP&LFIyOpw9rNv*_ zw>iHewto7ZGs$_73kr3pvDDS<d2TTZJS%5jR+Ve1dV-OT2&VD3{8jmDzGlVw)&x(D z)=Z@}nnzMgptk7^N?C>{{8N-3&jI4;we&E16SSGBFeR&b(0%PQ$AFYM;g{YRqc0Pm zBTXcK*$Uj~I;M3_sFG;Ag3DIDg`Ug>>F)guPBnIuHgpL0CuT{SD$IY$oyX+lU*If7 zaH~F|S#tKCfAXNcxov8{&1tVVBNu9SE%Fh3G1A!&HI4<^-;?dIKmIWN5L9>S0k$uM zoM?S=zUSZg;8^uc@OA*5N6zE1g6B0JoktX(TFXtf4NsjV95iCJ)sFhC*b`icoQO#| zja!&-%3VTP47t3K%O<6MM>LHn&v5AV{B*)+Z=8KoFts)3^>w9LTWjq3Q)k^#uc(2m zPtXeM8vw>mv4NVS+pj-9K+A9GUIL(`ET7#%fEx?HPr}?A#}mKVnU}#*>sbg&Ri=O7 zJOAXzAom11_^_-u1ka20jNu)CmXP^t=xkV}Pv*ya@@0S0KFf<s(V7@5YC&w@?jvZL zV408h?dM*6c@*YwInq&oUh%ANOPSye^!|3r$0C;}liZR<rXii-xb#yPsg3yAy~Amq z@=Dul4oyE6(hiNJF&V^!6ykqyIvj#V$eNcS?4swwO$-bck3=O-Fr8E}QCrv~jaJ1| zB~h@ImsE9j1hv_0{cdcC<bEm1a><N~X{St_581`6E~Xkp&MI*X@%=KZsYqx^i9PSq zhk<Y8-14(RJxt(bM5u9Tbz|T#BgNncoF#7$ot37z8wJ#q@4mb=cr?}@`<DtVW>gXe znQpuRU~bSSEj=3#_J)Ai0yT?PVca@7|M)x?Qb{^7GMM-4*zO2oW;_?|$NtzPJj9O) zWH^)6!T_3t?R3#Cl0<8OjV#&g8k;hy5+?+m>>?)34X0Fjt$yt`Xw!q(m*<6Qg#HJ@ zN!QQ$km;n(Zp&Y_bVKd<hur6fJ~4;8^pwirJ1?sppE2KI>Z8Gvxp5@N$vJVTl-;ty z^j^xZ0phvwfHO<{J68pyvx9nhZ|`FTV~5(=?}pYZf?jT00x&KB2mQrTMIrwFKgP4% zNy05DpPMdb@aOjXKu+}lhFp#yR_j*E^B(u(FkgXH;(Xb2jb66R-;yEF-oMFtv-LeP z@~fCe5FuY+#)mBL@y&5|(z)}E+}p<f*t8D-Qvj&~09qG+|3OMxy586-IpfpRjq6^R zso>ip-Df;J&@}_)*#^oux6HjJ)7pwXpLwB&N~t1mnZ7K+z(ErMqKxFnya5@d3MRHN zaP+IOsu&qG@5x5OE;&yMjqYPQky~Qw>f>IwZ{IF9G%(l((iH!NIWI926MNRJ<Uh0R zfggy)EGBw@wZ*?@<|=&UVBSloh&yLz{Orly%XEDm4k~d2rAOEivzG^mqB#%N^%v`| zRS>ks)6iRLBHHR&@%uvEfjh`gJ?7*&4>0}1hYj}?-?w%a0oZ)`|CFS5>-z0%nKYW+ zA&-0akXL+$#D12Ykqn@QQ0en+T!}!RT8C|44-&Dn)F6qvrqBAd`)se=gQ1p}EyT$8 zU#;PxUiX(v!=tWxi;lv|(88wpB3G_9_xul0$mBXjDEQW`hT%xR(y)�?E9#H1_bo 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 X?E)*)L#|uB2U+3i>gTe~DWM4fWOCxu literal 40306 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 Z3XP=4&l+RdW9~@TZq8qSb<-*E+~4F#ey0Ec From ee3fa07f96acda22432586ee85839f89333b3049 Mon Sep 17 00:00:00 2001 From: Qiang Xue <qiang.xue@gmail.com> Date: Mon, 3 Nov 2014 20:51:36 -0500 Subject: [PATCH 063/144] typo fix [skip ci] --- docs/guide/README.md | 2 +- docs/guide/runtime-routing.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/README.md b/docs/guide/README.md index 6629072..3c0c2dc 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -49,7 +49,7 @@ Handling Requests * [Overview](runtime-overview.md) * [Bootstrapping](runtime-bootstrapping.md) -* [Routing and Url Creation](runtime-routing.md) +* [Routing and URL Creation](runtime-routing.md) * [Requests](runtime-requests.md) * [Responses](runtime-responses.md) * [Sessions and Cookies](runtime-sessions-cookies.md) diff --git a/docs/guide/runtime-routing.md b/docs/guide/runtime-routing.md index a3fdbe7..861e336 100644 --- a/docs/guide/runtime-routing.md +++ b/docs/guide/runtime-routing.md @@ -94,7 +94,7 @@ failure of the routing process. ### Default Route <a name="default-route"></a> When a request is parsed into an empty route, the so-called *default route* will be used, instead. By default, -the default route is `site/index`, which refers to the `index` action of the `site` controller. You may customize +the default route is `site/index`, which refers to the `index` action of the `site` controller. You may customize it by configuring the [[yii\web\Application::defaultRoute|defaultRoute]] property of the application in the application configuration like the following: From c0c7d951d00231c264200d1269dfac737890e1fc Mon Sep 17 00:00:00 2001 From: keltstr <keltstr@gmail.com> Date: Tue, 4 Nov 2014 11:44:12 +0300 Subject: [PATCH 064/144] Update structure-applications.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit опечатки в названиях событий --- docs/guide-ru/structure-applications.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide-ru/structure-applications.md b/docs/guide-ru/structure-applications.md index 5b9bcac..96833c0 100644 --- a/docs/guide-ru/structure-applications.md +++ b/docs/guide-ru/structure-applications.md @@ -500,7 +500,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; от некоторых параметров. -### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_AFTER_REQUEST]] <a name="afterRequest"></a> +### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] <a name="afterRequest"></a> Данное событие возникает *после* того как приложение заканчивает обработку запроса, но *до* того как произойдет отправка ответа. Настоящее имя события - `afterRequest`. @@ -512,7 +512,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; конечному пользователю. Эти события возникают *после* текущего события. -### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_ACTION]] <a name="beforeAction"></a> +### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] <a name="beforeAction"></a> Событие возникает *до* того как будет выполнено [действие контроллера](structure-controllers.md). Настоящее имя события - `beforeAction`. @@ -539,7 +539,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; свойство [[yii\base\ActionEvent::isValid]] равным `false`, все последующие события не возникнут. -### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_AFTER_ACTION]] <a name="afterAction"></a> +### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] <a name="afterAction"></a> Событие возникает *после* выполнения [действия контроллера](structure-controllers.md). Настоящее имя события - `afterAction`. From 33b760eca2138de3f7e5287493f9228e3c630c57 Mon Sep 17 00:00:00 2001 From: munawer <munawer@xminds.in> Date: Tue, 4 Nov 2014 13:29:00 +0530 Subject: [PATCH 065/144] [ci skip] Guide typos fixed --- extensions/jui/CHANGELOG.md | 4 ++-- extensions/redis/README.md | 4 ++-- extensions/smarty/CHANGELOG.md | 2 +- framework/base/Security.php | 2 +- framework/console/controllers/FixtureController.php | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extensions/jui/CHANGELOG.md b/extensions/jui/CHANGELOG.md index 27ba8fa..438e615 100644 --- a/extensions/jui/CHANGELOG.md +++ b/extensions/jui/CHANGELOG.md @@ -17,7 +17,7 @@ Yii Framework 2 jui extension Change Log --------------------------- - Chg #1551: Jui datepicker has a new property `$dateFormat` which is used to set the clientOption `dateFormat`. - The new property does not use the datepicker formatting synax anymore but uses the same as the `yii\i18n\Formatter` + The new property does not use the datepicker formatting syntax anymore but uses the same as the `yii\i18n\Formatter` class which is the ICU syntax for date formatting, you have to adjust all your DatePicker widgets to use the new property instead of setting the dateFormat in the clientOptions (cebe) @@ -27,7 +27,7 @@ Yii Framework 2 jui extension Change Log - Bug #1550: fixed the issue that JUI input widgets did not property input IDs. (qiangxue) - Bug #2514: Jui sortable clientEvents were not working because of wrong naming assumptions. (cebe) -- Enh #2573: Jui datepicker now uses the current appliaction language by default. (andy5) +- Enh #2573: Jui datepicker now uses the current application language by default. (andy5) 2.0.0-alpha, December 1, 2013 ----------------------------- diff --git a/extensions/redis/README.md b/extensions/redis/README.md index 0e76b00..c67fd98 100644 --- a/extensions/redis/README.md +++ b/extensions/redis/README.md @@ -2,7 +2,7 @@ Redis Cache, Session and ActiveRecord for Yii 2 =============================================== This extension provides the [redis](http://redis.io/) key-value store support for the Yii2 framework. -It includes a `Cache` and `Session` storage handler and implents the `ActiveRecord` pattern that allows +It includes a `Cache` and `Session` storage handler and implements the `ActiveRecord` pattern that allows you to store active records in redis. To use this extension, you have to configure the Connection class in your application configuration: @@ -87,7 +87,7 @@ return [ Using the Session component --------------------------- -To use the `Session` component, in addtition to configuring the connection as described above, +To use the `Session` component, in addition to configuring the connection as described above, you also have to configure the `session` component to be `yii\redis\Session`: ```php diff --git a/extensions/smarty/CHANGELOG.md b/extensions/smarty/CHANGELOG.md index 3c8a701..a32bed5 100644 --- a/extensions/smarty/CHANGELOG.md +++ b/extensions/smarty/CHANGELOG.md @@ -19,7 +19,7 @@ Yii Framework 2 smarty extension Change Log - Enh #4619 (samdark, hwmaier) - New functions: - `url` generates absolute URL. - - `set` allows setting commonly used view paramters: `title`, `theme` and `layout`. + - `set` allows setting commonly used view parameters: `title`, `theme` and `layout`. - `meta` registers meta tag. - `registerJsFile` registers JavaScript file. - `registerCssFile` registers CSS file. diff --git a/framework/base/Security.php b/framework/base/Security.php index eac00a5..55bfe2c 100644 --- a/framework/base/Security.php +++ b/framework/base/Security.php @@ -85,7 +85,7 @@ class Security extends Component * The encrypted data includes a keyed message authentication code (MAC) so there is no need * to hash input or output data. * > Note: Avoid encrypting with passwords wherever possible. Nothing can protect against - * poor-quality or compromosed passwords. + * poor-quality or compromised passwords. * @param string $data the data to encrypt * @param string $password the password to use for encryption * @return string the encrypted data diff --git a/framework/console/controllers/FixtureController.php b/framework/console/controllers/FixtureController.php index 2f83134..a1a6a36 100644 --- a/framework/console/controllers/FixtureController.php +++ b/framework/console/controllers/FixtureController.php @@ -423,7 +423,7 @@ class FixtureController extends Controller /** * Filters fixtures by splitting them in two categories: one that should be applied and not. * If fixture is prefixed with "-", for example "-User", that means that fixture should not be loaded, - * if it is not prefixed it is considered as one to be loaded. Returs array: + * if it is not prefixed it is considered as one to be loaded. Returns array: * * ~~~ * [ From 3e3407837abfb1c032e6099089733ace6b42679b Mon Sep 17 00:00:00 2001 From: Maxim Chistyakov <Ximich@users.noreply.github.com> Date: Tue, 4 Nov 2014 13:35:14 +0300 Subject: [PATCH 066/144] Create russian translation of runtime-request.md --- docs/guide-ru/runtime-requests.md | 126 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 docs/guide-ru/runtime-requests.md diff --git a/docs/guide-ru/runtime-requests.md b/docs/guide-ru/runtime-requests.md new file mode 100644 index 0000000..eee2bec --- /dev/null +++ b/docs/guide-ru/runtime-requests.md @@ -0,0 +1,126 @@ +Запросы +======== + +Запросы, сделанные к приложению, представлены в терминах [[yii\web\Request]] объектов, которые предоставляют информацию о параметрах запроса, HTTP заголовках, cookies и т.д. Для получения доступа к текущему запросу вы должны обратиться к объекту `request` [application component](structure-application-components.md), который по умолчанию является экземпляром [[yii\web\Request]]. + + +## Параметры запроса <a name="request-parameters"></a> + +Чтобы получить параметры запроса, вы должны вызвать методы [[yii\web\Request::get()|get()]] и [[yii\web\Request::post()|post()]] компонента `request`. Они возвращают значения переменных `$_GET` и `$_POST` соответственно. Например, + +```php +$request = Yii::$app->request; + +$get = $request->get(); +// эквивалентно: $get = $_GET; + +$id = $request->get('id'); +// эквивалентно: $id = isset($_GET['id']) ? $_GET['id'] : null; + +$id = $request->get('id', 1); +// эквивалентно: $id = isset($_GET['id']) ? $_GET['id'] : 1; + +$post = $request->post(); +// эквивалентно: $post = $_POST; + +$name = $request->post('name'); +// эквивалентно: $name = isset($_POST['name']) ? $_POST['name'] : null; + +$name = $request->post('name', ''); +// эквивалентно: $name = isset($_POST['name']) ? $_POST['name'] : ''; +``` + +> Информация: Вместо того, чтобы обращаться напрямую к переменным `$_GET` и `$_POST` для получения параметров запроса, рекомендуется + чтобы вы обращались к ним через компонент `request` как было показано выше. Это упростит написание тестов, поскольку вы можете создать mock компонент запроса с не настоящими данными запроса. + +При реализации [RESTful API](rest-quick-start.md), зачастую вам требуется получить параметры, которые были отправлены через PUT, PATCH или другие [методы запроса](#request-methods). Вы можете получить эти параметры, вызвав метод [[yii\web\Request::getBodyParam()]]. Например, + +```php +$request = Yii::$app->request; + +// возвращает все параметры +$params = $request->bodyParams; + +// возвращает параметр "id" +$param = $request->getBodyParam('id'); +``` + +> Информация: В отличии от `GET` параметров, параметры, которые были переданы через `POST`, `PUT`, `PATCH` и д.р. отправляются в теле запроса. + Компонент `request` будет обрабатывать эти параметры, когда вы попробуете к ним обратиться через методы, описанные выше. + Вы можете настроить способ обработки этих параметров через настройку свойства [[yii\web\Request::parsers]]. + + +## Методы запроса <a name="request-methods"></a> + +Вы можете получить названия HTTP метода, используемого в текущем запросе, обратившись к выражению `Yii::$app->request->method`. +Также имеется целый набор логических свойств для проверки соответствует ли текущий метод определённому типу запроса. +Например, + +```php +$request = Yii::$app->request; + +if ($request->isAjax) { // является ли текущий запрос AJAX запросом } +if ($request->isGet) { // является ли текущий запрос GET запросом } +if ($request->isPost) { // является ли текущий запрос POST запросом } +if ($request->isPut) { // является ли текущий запрос PUT запросом } +``` + +## URL запроса <a name="request-urls"></a> + +Компонент `request` предоставляет множество способов изучения текущего запрашиваемого URL. + +Если предположить, что URL запроса будет `http://example.com/admin/index.php/product?id=100`, то вы можете получить различные части этого адреса так как это показано ниже: + +* [[yii\web\Request::url|url]]: вернёт адрес `/admin/index.php/product?id=100`, который содержит URL без информации об имени хоста. +* [[yii\web\Request::absoluteUrl|absoluteUrl]]: вернёт адрес `http://example.com/admin/index.php/product?id=100`, + который содержит полный URL, включая имя хоста. +* [[yii\web\Request::hostInfo|hostInfo]]: вернёт адрес `http://example.com`, который содержит только имя хоста. +* [[yii\web\Request::pathInfo|pathInfo]]: вернёт адрес `/product`, который содержит часть между адресом начального скрипта и параметрами запроса, которые идут после знака вопроса. +* [[yii\web\Request::queryString|queryString]]: вернёт адрес `id=100`, который содержит часть URL после знака вопроса. +* [[yii\web\Request::baseUrl|baseUrl]]: вернёт адрес `/admin`, который является частью URL после информации о хосте и перед именем входного скрипта. +* [[yii\web\Request::scriptUrl|scriptUrl]]: вернёт адрес `/admin/index.php`, который содержит URL без информации о хосте и параметрах запроса. +* [[yii\web\Request::serverName|serverName]]: вернёт адрес `example.com`, который содержит имя хоста в URL. +* [[yii\web\Request::serverPort|serverPort]]: вернёт 80, что является адресом порта, который использует веб-сервер. + + +## HTTP заголовки <a name="http-headers"></a> + +Вы можете получить информацию о HTTP заголовках через [[yii\web\HeaderCollection|header collection]], возвращаемыми свойством [[yii\web\Request::headers]]. Например, + +```php +// переменная $headers является объектом yii\web\HeaderCollection +$headers = Yii::$app->request->headers; + +// возвращает значения заголовка Accept +$accept = $headers->get('Accept'); + +if ($headers->has('User-Agent')) { // есть ли в запросе заголовок User-Agent } +``` + +Компонент `request` также предоставляет доступ к некоторым часто используемым заголовкам, включая + +* [[yii\web\Request::userAgent|userAgent]]: возвращает значение заголовка `User-Agent`. +* [[yii\web\Request::contentType|contentType]]: возвращает значение заголовка `Content-Type`, который указывает на MIME тип данных в теле запроса. +* [[yii\web\Request::acceptableContentTypes|acceptableContentTypes]]: возвращает список MIME типов данных, которые принимаются пользователем. + Возвращаемый список типов будет отсортирован по показателю качества. Типы с более высокими показателями будут первыми в списке. +* [[yii\web\Request::acceptableLanguages|acceptableLanguages]]: возвращает языки, которые поддерживает пользователь. + Список языков будет отсортирован по уровню предпочтения. Наиболее предпочитаемый язык будет первым в списке. + +Если ваше приложение поддерживает множество языков и вы хотите показать страницу на языке, который предпочитает пользователь, +то вы можете воспользоваться языковым методом согласования (negotiation) [[yii\web\Request::getPreferredLanguage()]]. +Этот метод принимает список поддерживаемых языков в вашем приложении, сравнивает их с [[yii\web\Request::acceptableLanguages|acceptableLanguages]] +и возвращает наиболее подходящий язык. + +> Подсказка: Вы также можете использовать фильтр [[yii\filters\ContentNegotiator|ContentNegotiator]] для динамического определения + какой тип содержимого и язык должен использоваться в ответе. Фильтр реализует согласование содержимого на основе свойств и методов, описанных выше. + + +## Информация о клиенте <a name="client-information"></a> + +Вы можете получить имя хоста и IP адрес пользователя через свойства [[yii\web\Request::userHost|userHost]] +и [[yii\web\Request::userIP|userIP]] соответственно. Например, + +```php +$userHost = Yii::$app->request->userHost; +$userIP = Yii::$app->request->userIP; +``` From b0c88d337e70732c12c457db72e31ec3dc77bdfa Mon Sep 17 00:00:00 2001 From: Alexander Makarov <sam@rmcreative.ru> Date: Tue, 4 Nov 2014 13:49:47 +0300 Subject: [PATCH 067/144] Fixed typo in test class --- tests/unit/framework/helpers/ConsoleTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/framework/helpers/ConsoleTest.php b/tests/unit/framework/helpers/ConsoleTest.php index 2ff72fe..70344df 100644 --- a/tests/unit/framework/helpers/ConsoleTest.php +++ b/tests/unit/framework/helpers/ConsoleTest.php @@ -65,10 +65,10 @@ class ConsoleTest extends TestCase echo 'a'; Console::endAnsiFormat(); echo 'a'; - $ouput = Console::stripAnsiFormat(ob_get_clean()); + $output = Console::stripAnsiFormat(ob_get_clean()); ob_implicit_flush(true); - // $output = str_replace("\033", 'X003', $ouput );// uncomment for debugging - $this->assertEquals(str_repeat('a', 25), $ouput); + // $output = str_replace("\033", 'X003', $output );// uncomment for debugging + $this->assertEquals(str_repeat('a', 25), $output); } /* public function testScreenSize() From a7df9155fc8ab3fee15d25d2bb663be45531348a Mon Sep 17 00:00:00 2001 From: Agrumas <agrumuldis@gmail.com> Date: Tue, 4 Nov 2014 22:12:44 +0200 Subject: [PATCH 068/144] fixed twig example in tpl engines tutorial --- docs/guide/tutorial-template-engines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/tutorial-template-engines.md b/docs/guide/tutorial-template-engines.md index 019fdd8..eeef031 100644 --- a/docs/guide/tutorial-template-engines.md +++ b/docs/guide/tutorial-template-engines.md @@ -106,7 +106,7 @@ Class import: {{ use('/yii/widgets/ActiveForm') }} Aliased class import: -{{ use({'alias' => '/app/widgets/MyWidget'}) }} +{{ use({'alias' : '/app/widgets/MyWidget'}) }} ``` #### Referencing other templates From cddf691c9a233f52c8cf11d926141865b43172c2 Mon Sep 17 00:00:00 2001 From: Carsten Brandt <mail@cebe.cc> Date: Wed, 5 Nov 2014 00:33:17 +0100 Subject: [PATCH 069/144] made gii getManifest more robust against corrupt index file --- extensions/debug/CHANGELOG.md | 1 + extensions/debug/controllers/DefaultController.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/debug/CHANGELOG.md b/extensions/debug/CHANGELOG.md index 26c59c6..819b9a5 100644 --- a/extensions/debug/CHANGELOG.md +++ b/extensions/debug/CHANGELOG.md @@ -7,6 +7,7 @@ Yii Framework 2 debug extension Change Log - Bug #5402: Debugger was not loading when there were closures in asset classes (samdark) - Bug #5745: Gii and debug modules may cause 404 exception when the route contains dashes (qiangxue) - Enh #5600: Allow configuring debug panels in `yii\debug\Module::panels` as panel class name strings (qiangxue) +- Enh: Made `DefaultController::getManifest()` more robust against corrupt files (cebe) 2.0.0 October 12, 2014 diff --git a/extensions/debug/controllers/DefaultController.php b/extensions/debug/controllers/DefaultController.php index dbb42d3..62381ae 100644 --- a/extensions/debug/controllers/DefaultController.php +++ b/extensions/debug/controllers/DefaultController.php @@ -118,8 +118,8 @@ class DefaultController extends Controller clearstatcache(); } $indexFile = $this->module->dataPath . '/index.data'; - if (is_file($indexFile) && is_readable($indexFile)) { - $this->_manifest = array_reverse(unserialize(file_get_contents($indexFile)), true); + if (is_file($indexFile) && is_readable($indexFile) && ($content = file_get_contents($indexFile)) !== false) { + $this->_manifest = array_reverse(unserialize($content), true); } else { $this->_manifest = []; } From 48f25347c55bc4f45f33529914025610d1939fe8 Mon Sep 17 00:00:00 2001 From: Alexander Makarov <sam@rmcreative.ru> Date: Wed, 5 Nov 2014 02:35:36 +0300 Subject: [PATCH 070/144] Clarified on how to execute RbacController::actionInit() --- docs/guide/security-authorization.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/security-authorization.md b/docs/guide/security-authorization.md index 901f366..ad7d46b 100644 --- a/docs/guide/security-authorization.md +++ b/docs/guide/security-authorization.md @@ -265,7 +265,7 @@ class RbacController extends Controller } ``` -After executing the command we'll get the following hierarchy: +After executing the command with `yii rbac/init` we'll get the following hierarchy: ![Simple RBAC hierarchy](images/rbac-hierarchy-1.png "Simple RBAC hierarchy") From 6debbf39ec2eb7696444135acbceec92309e1e8a Mon Sep 17 00:00:00 2001 From: Nikola Basic <basic.nikola@gmail.com> Date: Wed, 5 Nov 2014 12:11:34 +0100 Subject: [PATCH 071/144] Translations update --- framework/messages/sr-Latn/yii.php | 28 ++++++++++++++-------------- framework/messages/sr/yii.php | 32 ++++++++++++++++---------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/framework/messages/sr-Latn/yii.php b/framework/messages/sr-Latn/yii.php index b86d27c..fcc87a6 100644 --- a/framework/messages/sr-Latn/yii.php +++ b/framework/messages/sr-Latn/yii.php @@ -18,11 +18,11 @@ */ return [ 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Samo sledeći MIME tipovi su dozvoljeni: {mimeTypes}.', - 'The requested view "{name}" was not found.' => 'Traženi pogled "{name}" nije nađen.', + 'The requested view "{name}" was not found.' => 'Traženi prikaz "{name}" nije pronađen.', 'in {delta, plural, =1{a day} other{# days}}' => 'za {delta, plural, =1{dan} one{# dan} few{# dana} many{# dana} other{# dana}}', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'za {delta, plural, =1{minut} one{# minut} few{# minuta} many{# minut} other{# minuta}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'za {delta, plural, =1{minut} one{# minut} few{# minuta} many{# minuta} other{# minuta}}', 'in {delta, plural, =1{a month} other{# months}}' => 'za {delta, plural, =1{mesec} one{# mesec} few{# meseca} many{# meseci} other{# meseci}}', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'za {delta, plural, =1{sekund} one{# sekund} few{# sekundi} many{# sekundi} other{# sekundi}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'za {delta, plural, =1{sekundu} one{# sekundu} few{# sekunde} many{# sekundi} other{# sekundi}}', 'in {delta, plural, =1{a year} other{# years}}' => 'za {delta, plural, =1{godinu} one{# godinu} few{# godine} many{# godina} other{# godina}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'za {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sati}}', '{delta, plural, =1{a day} other{# days}} ago' => 'pre {delta, plural, =1{dan} one{dan} few{# dana} many{# dana} other{# dana}}', @@ -30,12 +30,12 @@ return [ '{delta, plural, =1{a month} other{# months}} ago' => 'pre {delta, plural, =1{meseca} one{# meseca} few{# meseca} many{# meseci} other{# meseci}}', '{delta, plural, =1{a second} other{# seconds}} ago' => 'pre {delta, plural, =1{sekunde} one{# sekunde} few{# sekunde} many{# sekundi} other{# sekundi}}', '{delta, plural, =1{a year} other{# years}} ago' => 'pre {delta, plural, =1{godine} one{# godine} few{# godine} many{# godina} other{# godina}}', - '{delta, plural, =1{an hour} other{# hours}} ago' => 'pre {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sata}}', + '{delta, plural, =1{an hour} other{# hours}} ago' => 'pre {delta, plural, =1{sat} one{# sat} few{# sata} many{# sati} other{# sati}}', '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, one{# bajt} few{# bajta} many{# bajtova} other{# bajta}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, one{# gigabajt} few{# gigabajta} many{# gigabajtova} other{# gigabajta}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, one{# kilobajt} few{# kilobajta} many{# kilobajtova} other{# kilobajta}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, one{# megabajt} few{# megabajta} many{# megabajtova} other{# megabajta}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, one{# petabajt} few{# petabajta} many{# petabajtova} other{# petabajta}}', + '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, one{# gigabajt} few{# gigabajta} many{# gigabajta} other{# gigabajta}}', + '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, one{# kilobajt} few{# kilobajta} many{# kilobajta} other{# kilobajta}}', + '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, one{# megabajt} few{# megabajta} many{# megabajta} other{# megabajta}}', + '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, one{# petabajt} few{# petabajta} many{# petabajta} other{# petabajta}}', '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, one{# terabajt} few{# terabajta} many{# terabajta} other{# terabajta}}', '{n} B' => '{n} B', '{n} GB' => '{n} GB', @@ -62,22 +62,22 @@ return [ 'Page not found.' => 'Stranica nije pronađena.', 'Please fix the following errors:' => 'Molimo vas ispravite sledeće greške:', 'Please upload a file.' => 'Molimo vas postavite fajl.', - 'Showing <b>{begin, number}-{end, number}</b> of <b>{totalCount, number}</b> {totalCount, plural, one{item} other{items}}.' => 'Prikazano <b>{begin, number}-{end, number}</b> od <b>{totalCount, plural, =1{# stavke} one{# stavka} few{# stavke} many{# stavki} other{# stavki}}</b>.', + 'Showing <b>{begin, number}-{end, number}</b> of <b>{totalCount, number}</b> {totalCount, plural, one{item} other{items}}.' => 'Prikazano <b>{begin, number}-{end, number}</b> od <b>{totalCount, plural, =1{# stavke} one{# stavke} few{# stavke} many{# stavki} other{# stavki}}</b>.', 'The file "{file}" is not an image.' => 'Fajl "{file}" nije slika.', - 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Fajl "{file}" je prevelik. Veličina ne može biti veća od {limit, number} {limit, plural, one{bajt} few{bajta} other{bajtova}}.', - 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Fajl "{file}" je premali. Veličina ne može biti manja od {limit, number} {limit, plural, one{bajt} few{bajta} other{bajtova}}.', + 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Fajl "{file}" je prevelik. Veličina ne može biti veća od {limit, number} {limit, plural, one{bajt} few{bajta} other{bajta}}.', + 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Fajl "{file}" je premali. Veličina ne može biti manja od {limit, number} {limit, plural, one{bajt} few{bajta} other{bajta}}.', 'The format of {attribute} is invalid.' => 'Format atributa "{attribute}" je neispravan.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Visina ne sme biti veća od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Širina ne sme biti veća od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premala. Visina ne sme biti manja od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premala. Širina ne sme biti manja od {limit, number} {limit, plural, one{piksel} other{piksela}}.', 'The verification code is incorrect.' => 'Kod za potvrdu nije ispravan.', - 'Total <b>{count, number}</b> {count, plural, one{item} other{items}}.' => 'Ukupno <b>{count, number}</b> {count, plural, one{stavka} other{stavki}}.', + 'Total <b>{count, number}</b> {count, plural, one{item} other{items}}.' => 'Ukupno <b>{count, number}</b> {count, plural, one{stavka} few{stavke} other{stavki}}.', 'Unable to verify your data submission.' => 'Nije moguće verifikovati vaše poslate podatke.', 'Unknown command "{command}".' => 'Nepoznata komanda "{command}".', 'Unknown option: --{name}' => 'Nepoznata opcija: --{name}', 'Update' => 'Ispravi', - 'View' => 'Pregled', + 'View' => 'Prikaz', 'Yes' => 'Da', 'You are not allowed to perform this action.' => 'Nemate prava da izvršite ovu akciju.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Možete postaviti najviše {limit, number} {limit, plural, one{fajl} few{fajla} other{fajlova}}.', @@ -103,4 +103,4 @@ return [ '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} treba da sadrži bar {min, number} {min, plural, one{karakter} other{karaktera}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} treba da sadrži najviše {max, number} {max, plural, one{karakter} other{karaktera}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} treba da sadrži {length, number} {length, plural, one{karakter} other{karaktera}}.' -]; \ No newline at end of file +]; diff --git a/framework/messages/sr/yii.php b/framework/messages/sr/yii.php index b2c0fdc..86a61bc 100644 --- a/framework/messages/sr/yii.php +++ b/framework/messages/sr/yii.php @@ -18,24 +18,24 @@ */ return [ 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Само следећи MIME типови су дозвољени: {mimeTypes}.', - 'The requested view "{name}" was not found.' => 'Тражени поглед "{name}" није нађен.', + 'The requested view "{name}" was not found.' => 'Тражени приказ "{name}" није пронађен.', 'in {delta, plural, =1{a day} other{# days}}' => 'за {delta, plural, =1{дан} one{# дан} few{# дана} many{# дана} other{# дана}}', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'за {delta, plural, =1{минут} one{# минут} few{# минута} many{# минут} other{# минута}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'за {delta, plural, =1{минут} one{# минут} few{# минута} many{# минута} other{# минута}}', 'in {delta, plural, =1{a month} other{# months}}' => 'за {delta, plural, =1{месец} one{# месец} few{# месеца} many{# месеци} other{# месеци}}', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'за {delta, plural, =1{секунд} one{# секунд} few{# секунди} many{# секунди} other{# секунди}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'за {delta, plural, =1{секунду} one{# секунду} few{# секундe} many{# секунди} other{# секунди}}', 'in {delta, plural, =1{a year} other{# years}}' => 'за {delta, plural, =1{годину} one{# годину} few{# године} many{# година} other{# година}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'за {delta, plural, =1{сат} one{# сат} few{# сата} many{# сати} other{# сати}}', '{delta, plural, =1{a day} other{# days}} ago' => 'пре {delta, plural, =1{дан} one{дан} few{# дана} many{# дана} other{# дана}}', '{delta, plural, =1{a minute} other{# minutes}} ago' => 'пре {delta, plural, =1{минут} one{# минут} few{# минута} many{# минута} other{# минута}}', - '{delta, plural, =1{a month} other{# months}} ago' => 'пре {delta, plural, =1{месеца} one{# месеца} few{# месеца} many{# месеци} other{# месеци}}', + '{delta, plural, =1{a month} other{# months}} ago' => 'пре {delta, plural, =1{месец} one{# месец} few{# месеца} many{# месеци} other{# месеци}}', '{delta, plural, =1{a second} other{# seconds}} ago' => 'пре {delta, plural, =1{секунде} one{# секунде} few{# секунде} many{# секунди} other{# секунди}}', '{delta, plural, =1{a year} other{# years}} ago' => 'пре {delta, plural, =1{године} one{# године} few{# године} many{# година} other{# година}}', - '{delta, plural, =1{an hour} other{# hours}} ago' => 'пре {delta, plural, =1{сат} one{# сат} few{# сата} many{# сати} other{# сата}}', + '{delta, plural, =1{an hour} other{# hours}} ago' => 'пре {delta, plural, =1{сат} one{# сат} few{# сата} many{# сати} other{# сати}}', '{n, plural, =1{# byte} other{# bytes}}' => '{n, plural, one{# бајт} few{# бајта} many{# бајтова} other{# бајта}}', - '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, one{# гигабајт} few{# гигабајта} many{# гигабајтова} other{# гигабајта}}', - '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, one{# килобајт} few{# килобајта} many{# килобајтова} other{# килобајта}}', - '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, one{# мегабајт} few{# мегабајта} many{# мегабајтова} other{# мегабајта}}', - '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, one{# петабајт} few{# петабајта} many{# петабајтова} other{# петабајта}}', + '{n, plural, =1{# gigabyte} other{# gigabytes}}' => '{n, plural, one{# гигабајт} few{# гигабајта} many{# гигабајта} other{# гигабајта}}', + '{n, plural, =1{# kilobyte} other{# kilobytes}}' => '{n, plural, one{# килобајт} few{# килобајта} many{# килобајта} other{# килобајта}}', + '{n, plural, =1{# megabyte} other{# megabytes}}' => '{n, plural, one{# мегабајт} few{# мегабајта} many{# мегабајта} other{# мегабајта}}', + '{n, plural, =1{# petabyte} other{# petabytes}}' => '{n, plural, one{# петабајт} few{# петабајта} many{# петабајта} other{# петабајта}}', '{n, plural, =1{# terabyte} other{# terabytes}}' => '{n, plural, one{# терабајт} few{# терабајта} many{# терабајта} other{# терабајта}}', '{n} B' => '{n} Б', '{n} GB' => '{n} ГБ', @@ -62,22 +62,22 @@ return [ 'Page not found.' => 'Страница није пронађена.', 'Please fix the following errors:' => 'Молимо вас исправите следеће грешке:', 'Please upload a file.' => 'Молимо вас поставите фајл.', - 'Showing <b>{begin, number}-{end, number}</b> of <b>{totalCount, number}</b> {totalCount, plural, one{item} other{items}}.' => 'Приказано <b>{begin, number}-{end, number}</b> од <b>{totalCount, plural, =1{# ставке} one{# ставка} few{# ставке} many{# ставки} other{# ставки}}</b>.', + 'Showing <b>{begin, number}-{end, number}</b> of <b>{totalCount, number}</b> {totalCount, plural, one{item} other{items}}.' => 'Приказано <b>{begin, number}-{end, number}</b> од <b>{totalCount, plural, =1{# ставке} one{# ставкe} few{# ставке} many{# ставки} other{# ставки}}</b>.', 'The file "{file}" is not an image.' => 'Фајл "{file}" није слика.', - 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Фајл "{file}" је превелик. Величина не може бити већа од {limit, number} {limit, plural, one{бајт} few{бајтa} other{бајтова}}.', - 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Фајл "{file}" је премали. Величина не може бити мања од {limit, number} {limit, plural, one{бајт} few{бајтa} other{бајтова}}.', + 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Фајл "{file}" је превелик. Величина не може бити већа од {limit, number} {limit, plural, one{бајт} few{бајтa} other{бајтa}}.', + 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Фајл "{file}" је премали. Величина не може бити мања од {limit, number} {limit, plural, one{бајт} few{бајтa} other{бајтa}}.', 'The format of {attribute} is invalid.' => 'Формат атрибута "{attribute}" је неисправан.', 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Слика "{file}" је превелика. Висина не сме бити већа од {limit, number} {limit, plural, one{пиксел} other{пиксела}}.', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Слика "{file}" је превелика. Ширина не сме бити већа од {limit, number} {limit, plural, one{пиксел} other{пиксела}}.', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Слика "{file}" је премала. Висина не сме бити мања од {limit, number} {limit, plural, one{пиксел} other{пиксела}}.', 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Слика "{file}" је премала. Ширина не сме бити мања од {limit, number} {limit, plural, one{пиксел} other{пиксела}}.', 'The verification code is incorrect.' => 'Код за потврду није исправан.', - 'Total <b>{count, number}</b> {count, plural, one{item} other{items}}.' => 'Укупно <b>{count, number}</b> {count, plural, one{ставка} other{ставки}}.', + 'Total <b>{count, number}</b> {count, plural, one{item} other{items}}.' => 'Укупно <b>{count, number}</b> {count, plural, one{ставка} few{ставке} other{ставки}}.', 'Unable to verify your data submission.' => 'Није могуће верификовати ваше послате податке.', 'Unknown command "{command}".' => 'Непозната команда "{command}".', 'Unknown option: --{name}' => 'Непозната опција: --{name}', 'Update' => 'Исправи', - 'View' => 'Преглед', + 'View' => 'Приказ', 'Yes' => 'Да', 'You are not allowed to perform this action.' => 'Немате права да извршите ову акцију.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Можете поставити највише {limit, number} {limit, plural, one{фајл} few{фајлa} other{фајлова}}.', @@ -100,7 +100,7 @@ return [ '{attribute} must be no less than {min}.' => '{attribute} не сме бити мањи од {min}.', '{attribute} must be repeated exactly.' => '{attribute} мора бити исправно поновљен.', '{attribute} must not be equal to "{compareValue}".' => '{attribute} не сме бити једнак "{compareValue}".', - '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} треба да садржи бар {min, number} {min, plural, one{карактер} other{карактера}}.', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} треба да садржи барем {min, number} {min, plural, one{карактер} other{карактера}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} треба да садржи највише {max, number} {max, plural, one{карактер} other{карактера}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} треба да садржи {length, number} {length, plural, one{карактер} other{карактера}}.' -]; \ No newline at end of file +]; From 3e613987f708e3c580072a8aef18532b551efb0a Mon Sep 17 00:00:00 2001 From: Nobuo Kihara <softark@gmail.com> Date: Sun, 2 Nov 2014 16:18:04 +0900 Subject: [PATCH 072/144] docs/guide-ja/structure-views.md prepared for translation [ci skip] --- docs/guide-ja/structure-views.md | 722 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 722 insertions(+) create mode 100644 docs/guide-ja/structure-views.md diff --git a/docs/guide-ja/structure-views.md b/docs/guide-ja/structure-views.md new file mode 100644 index 0000000..b8553d8 --- /dev/null +++ b/docs/guide-ja/structure-views.md @@ -0,0 +1,722 @@ +Views +===== + +Views are part of the [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) architecture. +They are code responsible for presenting data to end users. In a Web application, views are usually created +in terms of *view templates* which are PHP script files containing mainly HTML code and presentational PHP code. +They are managed by the [[yii\web\View|view]] [application component](structure-application-components.md) which provides commonly used methods +to facilitate view composition and rendering. For simplicity, we often call view templates or view template files +as views. + + +## Creating Views <a name="creating-views"></a> + +As aforementioned, a view is simply a PHP script mixed with HTML and PHP code. The following is the view +that presents a login form. As you can see, PHP code is used to generate the dynamic content, such as the +page title and the form, while HTML code organizes them into a presentable HTML page. + +```php +<?php +use yii\helpers\Html; +use yii\widgets\ActiveForm; + +/* @var $this yii\web\View */ +/* @var $form yii\widgets\ActiveForm */ +/* @var $model app\models\LoginForm */ + +$this->title = 'Login'; +?> +<h1><?= Html::encode($this->title) ?></h1> + +<p>Please fill out the following fields to login:</p> + +<?php $form = ActiveForm::begin(); ?> + <?= $form->field($model, 'username') ?> + <?= $form->field($model, 'password')->passwordInput() ?> + <?= Html::submitButton('Login') ?> +<?php ActiveForm::end(); ?> +``` + +Within a view, you can access `$this` which refers to the [[yii\web\View|view component]] managing +and rendering this view template. + +Besides `$this`, there may be other predefined variables in a view, such as `$model` in the above +example. These variables represent the data that are *pushed* into the view by [controllers](structure-controllers.md) +or other objects whose trigger the [view rendering](#rendering-views). + +> Tip: The predefined variables are listed in a comment block at beginning of a view so that they can + be recognized by IDEs. It is also a good way of documenting your views. + + +### Security <a name="security"></a> + +When creating views that generate HTML pages, it is important that you encode and/or filter the data coming +from end users before presenting them. Otherwise, your application may be subject to +[cross-site scripting](http://en.wikipedia.org/wiki/Cross-site_scripting) attacks. + +To display a plain text, encode it first by calling [[yii\helpers\Html::encode()]]. For example, the following code +encodes the user name before displaying it: + +```php +<?php +use yii\helpers\Html; +?> + +<div class="username"> + <?= Html::encode($user->name) ?> +</div> +``` + +To display HTML content, use [[yii\helpers\HtmlPurifier]] to filter the content first. For example, the following +code filters the post content before displaying it: + +```php +<?php +use yii\helpers\HtmlPurifier; +?> + +<div class="post"> + <?= HtmlPurifier::process($post->text) ?> +</div> +``` + +> Tip: While HTMLPurifier does excellent job in making output safe, it is not fast. You should consider + [caching](caching-overview.md) the filtering result if your application requires high performance. + + +### Organizing Views <a name="organizing-views"></a> + +Like [controllers](structure-controllers.md) and [models](structure-models.md), there are conventions to organize views. + +* For views rendered by a controller, they should be put under the directory `@app/views/ControllerID` by default, + where `ControllerID` refers to the [controller ID](structure-controllers.md#routes). For example, if + the controller class is `PostController`, the directory would be `@app/views/post`; If it is `PostCommentController`, + the directory would be `@app/views/post-comment`. In case the controller belongs to a module, the directory + would be `views/ControllerID` under the [[yii\base\Module::basePath|module directory]]. +* For views rendered in a [widget](structure-widgets.md), they should be put under the `WidgetPath/views` directory by + default, where `WidgetPath` stands for the directory containing the widget class file. +* For views rendered by other objects, it is recommended that you follow the similar convention as that for widgets. + +You may customize these default view directories by overriding the [[yii\base\ViewContextInterface::getViewPath()]] +method of controllers or widgets. + + +## Rendering Views <a name="rendering-views"></a> + +You can render views in [controllers](structure-controllers.md), [widgets](structure-widgets.md), or any +other places by calling view rendering methods. These methods share a similar signature shown as follows, + +``` +/** + * @param string $view view name or file path, depending on the actual rendering method + * @param array $params the data to be passed to the view + * @return string rendering result + */ +methodName($view, $params = []) +``` + + +### Rendering in Controllers <a name="rendering-in-controllers"></a> + +Within [controllers](structure-controllers.md), you may call the following controller methods to render views: + +* [[yii\base\Controller::render()|render()]]: renders a [named view](#named-views) and applies a [layout](#layouts) + to the rendering result. +* [[yii\base\Controller::renderPartial()|renderPartial()]]: renders a [named view](#named-views) without any layout. +* [[yii\web\Controller::renderAjax()|renderAjax()]]: renders a [named view](#named-views) without any layout, + and injects all registered JS/CSS scripts and files. It is usually used in response to AJAX Web requests. +* [[yii\base\Controller::renderFile()|renderFile()]]: renders a view specified in terms of a view file path or + [alias](concept-aliases.md). + +For example, + +```php +namespace app\controllers; + +use Yii; +use app\models\Post; +use yii\web\Controller; +use yii\web\NotFoundHttpException; + +class PostController extends Controller +{ + public function actionView($id) + { + $model = Post::findOne($id); + if ($model === null) { + throw new NotFoundHttpException; + } + + // renders a view named "view" and applies a layout to it + return $this->render('view', [ + 'model' => $model, + ]); + } +} +``` + + +### Rendering in Widgets <a name="rendering-in-widgets"></a> + +Within [widgets](structure-widgets.md), you may call the following widget methods to render views. + +* [[yii\base\Widget::render()|render()]]: renders a [named view](#named-views). +* [[yii\base\Widget::renderFile()|renderFile()]]: renders a view specified in terms of a view file path or + [alias](concept-aliases.md). + +For example, + +```php +namespace app\components; + +use yii\base\Widget; +use yii\helpers\Html; + +class ListWidget extends Widget +{ + public $items = []; + + public function run() + { + // renders a view named "list" + return $this->render('list', [ + 'items' => $this->items, + ]); + } +} +``` + + +### Rendering in Views <a name="rendering-in-views"></a> + +You can render a view within another view by calling one of the following methods provided by the [[yii\base\View|view component]]: + +* [[yii\base\View::render()|render()]]: renders a [named view](#named-views). +* [[yii\web\View::renderAjax()|renderAjax()]]: renders a [named view](#named-views) and injects all registered + JS/CSS scripts and files. It is usually used in response to AJAX Web requests. +* [[yii\base\View::renderFile()|renderFile()]]: renders a view specified in terms of a view file path or + [alias](concept-aliases.md). + +For example, the following code in a view renders the `_overview.php` view file which is in the same directory +as the view being currently rendered. Remember that `$this` in a view refers to the [[yii\base\View|view]] component: + +```php +<?= $this->render('_overview') ?> +``` + + +### Rendering in Other Places <a name="rendering-in-other-places"></a> + +In any place, you can get access to the [[yii\base\View|view]] application component by the expression +`Yii::$app->view` and then call its aforementioned methods to render a view. For example, + +```php +// displays the view file "@app/views/site/license.php" +echo \Yii::$app->view->renderFile('@app/views/site/license.php'); +``` + + +### Named Views <a name="named-views"></a> + +When you render a view, you can specify the view using either a view name or a view file path/alias. In most cases, +you would use the former because it is more concise and flexible. We call views specified using names as *named views*. + +A view name is resolved into the corresponding view file path according to the following rules: + +* A view name may omit the file extension name. In this case, `.php` will be used as the extension. For example, + the view name `about` corresponds to the file name `about.php`. +* If the view name starts with double slashes `//`, the corresponding view file path would be `@app/views/ViewName`. + That is, the view is looked for under the [[yii\base\Application::viewPath|application's view path]]. + For example, `//site/about` will be resolved into `@app/views/site/about.php`. +* If the view name starts with a single slash `/`, the view file path is formed by prefixing the view name + with the [[yii\base\Module::viewPath|view path]] of the currently active [module](structure-modules.md). + If there is no active module, `@app/views/ViewName` will be used. For example, `/user/create` will be resolved into + `@app/modules/user/views/user/create.php`, if the currently active module is `user`. If there is no active module, + the view file path would be `@app/views/user/create.php`. +* If the view is rendered with a [[yii\base\View::context|context]] and the context implements [[yii\base\ViewContextInterface]], + the view file path is formed by prefixing the [[yii\base\ViewContextInterface::getViewPath()|view path]] of the + context to the view name. This mainly applies to the views rendered within controllers and widgets. For example, + `site/about` will be resolved into `@app/views/site/about.php` if the context is the controller `SiteController`. +* If a view is rendered within another view, the directory containing the other view file will be prefixed to + the new view name to form the actual view file path. For example, `item` will be resolved into `@app/views/post/item` + if it is being rendered in the view `@app/views/post/index.php`. + +According to the above rules, calling `$this->render('view')` in a controller `app\controllers\PostController` will +actually render the view file `@app/views/post/view.php`, while calling `$this->render('_overview')` in that view +will render the view file `@app/views/post/_overview.php`. + + +### Accessing Data in Views <a name="accessing-data-in-views"></a> + +There are two approaches to access data within a view: push and pull. + +By passing the data as the second parameter to the view rendering methods, you are using the push approach. +The data should be represented as an array of name-value pairs. When the view is being rendered, the PHP +`extract()` function will be called on this array so that the array is extracted into variables in the view. +For example, the following view rendering code in a controller will push two variables to the `report` view: +`$foo = 1` and `$bar = 2`. + +```php +echo $this->render('report', [ + 'foo' => 1, + 'bar' => 2, +]); +``` + +The pull approach actively retrieves data from the [[yii\base\View|view component]] or other objects accessible +in views (e.g. `Yii::$app`). Using the code below as an example, within the view you can get the controller object +by the expression `$this->context`. And as a result, it is possible for you to access any properties or methods +of the controller in the `report` view, such as the controller ID shown in the following: + +```php +The controller ID is: <?= $this->context->id ?> +?> +``` + +The push approach is usually the preferred way of accessing data in views, because it makes views less dependent +on context objects. Its drawback is that you need to manually build the data array all the time, which could +become tedious and error prone if a view is shared and rendered in different places. + + +### Sharing Data among Views <a name="sharing-data-among-views"></a> + +The [[yii\base\View|view component]] provides the [[yii\base\View::params|params]] property that you can use +to share data among views. + +For example, in an `about` view, you can have the following code which specifies the current segment of the +breadcrumbs. + +```php +$this->params['breadcrumbs'][] = 'About Us'; +``` + +Then, in the [layout](#layouts) file, which is also a view, you can display the breadcrumbs using the data +passed along [[yii\base\View::params|params]]: + +```php +<?= yii\widgets\Breadcrumbs::widget([ + 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], +]) ?> +``` + + +## Layouts <a name="layouts"></a> + +Layouts are a special type of views that represent the common parts of multiple views. For example, the pages +for most Web applications share the same page header and footer. While you can repeat the same page header and footer +in every view, a better way is to do this once in a layout and embed the rendering result of a content view at +an appropriate place in the layout. + + +### Creating Layouts <a name="creating-layouts"></a> + +Because layouts are also views, they can be created in the similar way as normal views. By default, layouts +are stored in the directory `@app/views/layouts`. For layouts used within a [module](structure-modules.md), +they should be stored in the `views/layouts` directory under the [[yii\base\Module::basePath|module directory]]. +You may customize the default layout directory by configuring the [[yii\base\Module::layoutPath]] property of +the application or modules. + +The following example shows how a layout looks like. Note that for illustrative purpose, we have greatly simplified +the code in the layout. In practice, you may want to add more content to it, such as head tags, main menu, etc. + +```php +<?php +use yii\helpers\Html; + +/* @var $this yii\web\View */ +/* @var $content string */ +?> +<?php $this->beginPage() ?> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"/> + <?= Html::csrfMetaTags() ?> + <title><?= Html::encode($this->title) ?> + head() ?> + + +beginBody() ?> +
My Company
+ +
© 2014 by My Company
+endBody() ?> + + +endPage() ?> +``` + +As you can see, the layout generates the HTML tags that are common to all pages. Within the `` section, +the layout echoes the `$content` variable which represents the rendering result of content views and is pushed +into the layout when [[yii\base\Controller::render()]] is called. + +Most layouts should call the following methods like shown in the above code. These methods mainly trigger events +about the rendering process so that scripts and tags registered in other places can be properly injected into +the places where these methods are called. + +- [[yii\base\View::beginPage()|beginPage()]]: This method should be called at the very beginning of the layout. + It triggers the [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]] event which indicates the beginning of a page. +- [[yii\base\View::endPage()|endPage()]]: This method should be called at the end of the layout. + It triggers the [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] event which indicates the end of a page. +- [[yii\web\View::head()|head()]]: This method should be called within the `` section of an HTML page. + It generates a placeholder which will be replaced with the registered head HTML code (e.g. link tags, meta tags) + when a page finishes rendering. +- [[yii\web\View::beginBody()|beginBody()]]: This method should be called at the beginning of the `` section. + It triggers the [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]] event and generates a placeholder which will + be replaced by the registered HTML code (e.g. JavaScript) targeted at the body begin position. +- [[yii\web\View::endBody()|endBody()]]: This method should be called at the end of the `` section. + It triggers the [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]] event and generates a placeholder which will + be replaced by the registered HTML code (e.g. JavaScript) targeted at the body end position. + + +### Accessing Data in Layouts + +Within a layout, you have access to two predefined variables: `$this` and `$content`. The former refers to +the [[yii\base\View|view]] component, like in normal views, while the latter contains the rendering result of a content +view which is rendered by calling the [[yii\base\Controller::render()|render()]] method in controllers. + +If you want to access other data in layouts, you have to use the pull method as described in +the [Accessing Data in Views](#accessing-data-in-views) subsection. If you want to pass data from a content view +to a layout, you may use the method described in the [Sharing Data among Views](#sharing-data-among-views) subsection. + + +### Using Layouts + +As described in the [Rendering in Controllers](#rendering-in-controllers) subsection, when you render a view +by calling the [[yii\base\Controller::render()|render()]] method in a controller, a layout will be applied +to the rendering result. By default, the layout `@app/views/layouts/main.php` will be used. + +You may use a different layout by configuring either [[yii\base\Application::layout]] or [[yii\base\Controller::layout]]. +The former governs the layout used by all controllers, while the latter overrides the former for individual controllers. +For example, the following code makes the `post` controller to use `@app/views/layouts/post.php` as the layout +when rendering its views. Other controllers, assuming their `layout` property is untouched, will still use the default +`@app/views/layouts/main.php` as the layout. + +```php +namespace app\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + public $layout = 'post'; + + // ... +} +``` + +For controllers belonging to a module, you may also configure the module's [[yii\base\Module::layout|layout]] property to +use a particular layout for these controllers. + +Because the `layout` property may be configured at different levels (controllers, modules, application), +behind the scene Yii takes two steps to determine what is the actual layout file being used for a particular controller. + +In the first step, it determines the layout value and the context module: + +- If the [[yii\base\Controller::layout]] property of the controller is not null, use it as the layout value and + the [[yii\base\Controller::module|module]] of the controller as the context module. +- If [[yii\base\Controller::layout|layout]] is null, search through all ancestor modules (including the application itself) of the controller and + find the first module whose [[yii\base\Module::layout|layout]] property is not null. Use that module and + its [[yii\base\Module::layout|layout]] value as the context module and the chosen layout value. + If such a module cannot be found, it means no layout will be applied. + +In the second step, it determines the actual layout file according to the layout value and the context module +determined in the first step. The layout value can be: + +- a path alias (e.g. `@app/views/layouts/main`). +- an absolute path (e.g. `/main`): the layout value starts with a slash. The actual layout file will be + looked for under the application's [[yii\base\Application::layoutPath|layout path]] which defaults to + `@app/views/layouts`. +- a relative path (e.g. `main`): the actual layout file will be looked for under the context module's + [[yii\base\Module::layoutPath|layout path]] which defaults to the `views/layouts` directory under the + [[yii\base\Module::basePath|module directory]]. +- the boolean value `false`: no layout will be applied. + +If the layout value does not contain a file extension, it will use the default one `.php`. + + +### Nested Layouts + +Sometimes you may want to nest one layout in another. For example, in different sections of a Web site, you +want to use different layouts, while all these layouts share the same basic layout that generates the overall +HTML5 page structure. You can achieve this goal by calling [[yii\base\View::beginContent()|beginContent()]] and +[[yii\base\View::endContent()|endContent()]] in the child layouts like the following: + +```php +beginContent('@app/views/layouts/base.php'); ?> + +...child layout content here... + +endContent(); ?> +``` + +As shown above, the child layout content should be enclosed within [[yii\base\View::beginContent()|beginContent()]] and +[[yii\base\View::endContent()|endContent()]]. The parameter passed to [[yii\base\View::beginContent()|beginContent()]] +specifies what is the parent layout. It can be either a layout file or alias. + +Using the above approach, you can nest layouts in more than one levels. + + +### Using Blocks + +Blocks allow you to specify the view content in one place while displaying it in another. They are often used together +with layouts. For example, you can define a block in a content view and display it in the layout. + +You call [[yii\base\View::beginBlock()|beginBlock()]] and [[yii\base\View::endBlock()|endBlock()]] to define a block. +The block can then be accessed via `$view->blocks[$blockID]`, where `$blockID` stands for a unique ID that you assign +to the block when defining it. + +The following example shows how you can use blocks to customize specific parts of a layout in a content view. + +First, in a content view, define one or multiple blocks: + +```php +... + +beginBlock('block1'); ?> + +...content of block1... + +endBlock(); ?> + +... + +beginBlock('block3'); ?> + +...content of block3... + +endBlock(); ?> +``` + +Then, in the layout view, render the blocks if they are available, or display some default content if a block is +not defined. + +```php +... +blocks['block1'])): ?> + blocks['block1'] ?> + + ... default content for block1 ... + + +... + +blocks['block2'])): ?> + blocks['block2'] ?> + + ... default content for block2 ... + + +... + +blocks['block3'])): ?> + blocks['block3'] ?> + + ... default content for block3 ... + +... +``` + + +## Using View Components + +[[yii\base\View|View components]] provides many view-related features. While you can get view components +by creating individual instances of [[yii\base\View]] or its child class, in most cases you will mainly use +the `view` application component. You can configure this component in [application configurations](structure-applications.md#application-configurations) +like the following: + +```php +[ + // ... + 'components' => [ + 'view' => [ + 'class' => 'app\components\View', + ], + // ... + ], +] +``` + +View components provide the following useful view-related features, each described in more details in a separate section: + +* [theming](output-theming.md): allows you to develop and change the theme for your Web site. +* [fragment caching](caching-fragment.md): allows you to cache a fragment within a Web page. +* [client script handling](output-client-scripts.md): supports CSS and JavaScript registration and rendering. +* [asset bundle handling](structure-assets.md): supports registering and rendering of [asset bundles](structure-assets.md). +* [alternative template engines](tutorial-template-engines.md): allows you to use other template engines, such as + [Twig](http://twig.sensiolabs.org/), [Smarty](http://www.smarty.net/). + +You may also frequently use the following minor yet useful features when you are developing Web pages. + + +### Setting Page Titles + +Every Web page should have a title. Normally the title tag is being displayed in a [layout](#layouts). However, in practice +the title is often determined in content views rather than layouts. To solve this problem, [[yii\web\View]] provides +the [[yii\web\View::title|title]] property for you to pass the title information from content views to layouts. + +To make use of this feature, in each content view, you can set the page title like the following: + +```php +title = 'My page title'; +?> +``` + +Then in the layout, make sure you have the following code in the `` section: + +```php +<?= Html::encode($this->title) ?> +``` + + +### Registering Meta Tags + +Web pages usually need to generate various meta tags needed by different parties. Like page titles, meta tags +appear in the `` section and are usually generated in layouts. + +If you want to specify what meta tags to generate in content views, you can call [[yii\web\View::registerMetaTag()]] +in a content view, like the following: + +```php +registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php']); +?> +``` + +The above code will register a "keywords" meta tag with the view component. The registered meta tag is +rendered after the layout finishes rendering. By then, the following HTML code will be inserted +at the place where you call [[yii\web\View::head()]] in the layout and generate the following HTML code: + +```php + +``` + +Note that if you call [[yii\web\View::registerMetaTag()]] multiple times, it will register multiple meta tags, +regardless whether the meta tags are the same or not. + +To make sure there is only a single instance of a meta tag type, you can specify a key as a second parameter when calling the method. +For example, the following code registers two "description" meta tags. However, only the second one will be rendered. + +```html +$this->registerMetaTag(['name' => 'description', 'content' => 'This is my cool website made with Yii!'], 'description'); +$this->registerMetaTag(['name' => 'description', 'content' => 'This website is about funny raccoons.'], 'description'); +``` + + +### Registering Link Tags + +Like [meta tags](#adding-meta-tags), link tags are useful in many cases, such as customizing favicon, pointing to +RSS feed or delegating OpenID to another server. You can work with link tags in the similar way as meta tags +by using [[yii\web\View::registerLinkTag()]]. For example, in a content view, you can register a link tag like follows, + +```php +$this->registerLinkTag([ + 'title' => 'Live News for Yii', + 'rel' => 'alternate', + 'type' => 'application/rss+xml', + 'href' => 'http://www.yiiframework.com/rss.xml/', +]); +``` + +The code above will result in + +```html + +``` + +Similar as [[yii\web\View::registerMetaTag()|registerMetaTags()]], you can specify a key when calling +[[yii\web\View::registerLinkTag()|registerLinkTag()]] to avoid generated repeated link tags. + + +## View Events + +[[yii\base\View|View components]] trigger several events during the view rendering process. You may respond +to these events to inject content into views or process the rendering results before they are sent to end users. + +- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: triggered at the beginning of rendering a file + in a controller. Handlers of this event may set [[yii\base\ViewEvent::isValid]] to be false to cancel the rendering process. +- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: triggered after rendering a file by the call of [[yii\base\View::afterRender()]]. + Handlers of this event may obtain the rendering result through [[yii\base\ViewEvent::output]] and may modify + this property to change the rendering result. +- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: triggered by the call of [[yii\base\View::beginPage()]] in layouts. +- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: triggered by the call of [[yii\base\View::endPage()]] in layouts. +- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: triggered by the call of [[yii\web\View::beginBody()]] in layouts. +- [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]]: triggered by the call of [[yii\web\View::endBody()]] in layouts. + +For example, the following code injects the current date at the end of the page body: + +```php +\Yii::$app->view->on(View::EVENT_END_BODY, function () { + echo date('Y-m-d'); +}); +``` + + +## Rendering Static Pages + +Static pages refer to those Web pages whose main content are mostly static without the need of accessing +dynamic data pushed from controllers. + +You can output static pages by putting their code in the view, and then using the code like the following in a controller: + +```php +public function actionAbout() +{ + return $this->render('about'); +} +``` + +If a Web site contains many static pages, it would be very tedious repeating the similar code many times. +To solve this problem, you may introduce a [standalone action](structure-controllers.md#standalone-actions) +called [[yii\web\ViewAction]] in a controller. For example, + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public function actions() + { + return [ + 'page' => [ + 'class' => 'yii\web\ViewAction', + ], + ]; + } +} +``` + +Now if you create a view named `about` under the directory `@app/views/site/pages`, you will be able to +display this view by the following URL: + +``` +http://localhost/index.php?r=site/page&view=about +``` + +The `GET` parameter `view` tells [[yii\web\ViewAction]] which view is requested. The action will then look +for this view under the directory `@app/views/site/pages`. You may configure [[yii\web\ViewAction::viewPrefix]] +to change the directory for searching these views. + + +## Best Practices + +Views are responsible for presenting models in the format that end users desire. In general, views + +* should mainly contain presentational code, such as HTML, and simple PHP code to traverse, format and render data. +* should not contain code that performs DB queries. Such code should be done in models. +* should avoid direct access to request data, such as `$_GET`, `$_POST`. This belongs to controllers. + If request data is needed, they should be pushed into views by controllers. +* may read model properties, but should not modify them. + +To make views more manageable, avoid creating views that are too complex or contain too much redundant code. +You may use the following techniques to achieve this goal: + +* use [layouts](#layouts) to represent common presentational sections (e.g. page header, footer). +* divide a complicated view into several smaller ones. The smaller views can be rendered and assembled into a bigger + one using the rendering methods that we have described. +* create and use [widgets](structure-widgets.md) as building blocks of views. +* create and use helper classes to transform and format data in views. + From e8cbf89ce9f1eb23286c3a958c3cb9472f6e6a40 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 2 Nov 2014 23:00:02 +0900 Subject: [PATCH 073/144] docs/guide-ja/structure-views.md - WIP [ci skip] --- docs/guide-ja/structure-views.md | 251 +++++++++++++++++++++------------------ 1 file changed, 137 insertions(+), 114 deletions(-) diff --git a/docs/guide-ja/structure-views.md b/docs/guide-ja/structure-views.md index b8553d8..714f359 100644 --- a/docs/guide-ja/structure-views.md +++ b/docs/guide-ja/structure-views.md @@ -1,19 +1,20 @@ -Views -===== +ビュー +====== -Views are part of the [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) architecture. -They are code responsible for presenting data to end users. In a Web application, views are usually created -in terms of *view templates* which are PHP script files containing mainly HTML code and presentational PHP code. -They are managed by the [[yii\web\View|view]] [application component](structure-application-components.md) which provides commonly used methods -to facilitate view composition and rendering. For simplicity, we often call view templates or view template files -as views. +ビューは [MVC](http://ja.wikipedia.org/wiki/Model_View_Controller) アーキテクチャの一部を成すものです。 +ビューはエンドユーザにデータを表示することに責任を持つコードです。 +ウェブアプリケーションにおいては、ビューは、通常、主として HTML コードと表示目的の PHP コードを含む PHP スクリプトファイルである、 +*ビューテンプレート* の形式で作成されます。 +そして、ビューテンプレートを管理する [[yii\web\View|ビュー]] [アプリケーションコンポーネント](structure-application-components.md) は、 +ビューの構築とレンダリングを助けるためによく使われるメソッドを提供します。 +なお、簡潔さを重視して、ビューテンプレートまたはビューテンプレートファイルを単にビューと呼ぶことがよくあります。 -## Creating Views +## ビューを作成する -As aforementioned, a view is simply a PHP script mixed with HTML and PHP code. The following is the view -that presents a login form. As you can see, PHP code is used to generate the dynamic content, such as the -page title and the form, while HTML code organizes them into a presentable HTML page. +前述のように、ビューは HTML と PHP コードが混ざった単なる PHP スクリプトです。 +次に示すのは、ログインフォームを表示するビューです。 +見ると分るように、PHP コードがタイトルやフォームなど動的なコンテンツを生成するのに使われ、HTML コードがそれらを編成して表示可能な HTML ページを作っています。 ```php title = 'Login'; +$this->title = 'ログイン'; ?>

title) ?>

-

Please fill out the following fields to login:

+

次の項目を入力してログインしてください:

field($model, 'username') ?> field($model, 'password')->passwordInput() ?> - + ``` -Within a view, you can access `$this` which refers to the [[yii\web\View|view component]] managing -and rendering this view template. +ビューの中でアクセスできる `$this` は、このビューテンプレートを管理し表示している [[yii\web\View|ビューコンポーネント]] を参照します。 -Besides `$this`, there may be other predefined variables in a view, such as `$model` in the above -example. These variables represent the data that are *pushed* into the view by [controllers](structure-controllers.md) -or other objects whose trigger the [view rendering](#rendering-views). +`$this` 以外に、上記の例の `$model` のように、前もって定義された変数がビューの中にあることがあります。 +このような変数は、[コントローラ](structure-controllers.md) または [ビューのレンダリング](#rendering-views) をトリガするオブジェクトによってビューに *プッシュ* されたデータを表します。 -> Tip: The predefined variables are listed in a comment block at beginning of a view so that they can - be recognized by IDEs. It is also a good way of documenting your views. +> Tip|ヒント: 上の例では、事前に定義された変数は、IDE に認識されるように、 + ビューの先頭のコメントブロックの中にリストされています。これは、ビューに + ドキュメントを加えるためにも良い方法です。 -### Security +### セキュリティ -When creating views that generate HTML pages, it is important that you encode and/or filter the data coming -from end users before presenting them. Otherwise, your application may be subject to -[cross-site scripting](http://en.wikipedia.org/wiki/Cross-site_scripting) attacks. +HTML ページを生成するビューを作成するときは、エンドユーザから受け取るデータを +表示する前に エンコード および/または フィルター することが重要です。 +そうしなければ、あなたのアプリケーションは [クロスサイトスクリプティング](http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0) 攻撃をこうむるおそれがあります。 -To display a plain text, encode it first by calling [[yii\helpers\Html::encode()]]. For example, the following code -encodes the user name before displaying it: +平文テキストを表示するためには、まず [[yii\helpers\Html::encode()]] を呼んでエンコードします。 +例えば、次のコードはユーザの名前を表示する前にエンコードしています: ```php ``` -To display HTML content, use [[yii\helpers\HtmlPurifier]] to filter the content first. For example, the following -code filters the post content before displaying it: +HTML コンテンツを表示するためには、[[yii\helpers\HtmlPurifier]] を使って、最初にコンテンツをフィルターします。 +例えば、次のコードは、投稿のコンテンツを表示する前にフィルターしています: ```php ``` -> Tip: While HTMLPurifier does excellent job in making output safe, it is not fast. You should consider - [caching](caching-overview.md) the filtering result if your application requires high performance. +> Tip|ヒント: HTMLPurifier は、出力を安全なものにすることにおいては素晴らしい仕事をしますが、 + 速くはありません。アプリケーションが高いパフォーマンスを要求する場合は、 + フィルター結果を [キャッシュ](caching-overview.md) することを考慮すべきです。 -### Organizing Views +### ビューを整理する -Like [controllers](structure-controllers.md) and [models](structure-models.md), there are conventions to organize views. +[コントローラ](structure-controllers.md) や [モデル](structure-models.md) と同じように、 +ビューを整理するための規約があります。. -* For views rendered by a controller, they should be put under the directory `@app/views/ControllerID` by default, - where `ControllerID` refers to the [controller ID](structure-controllers.md#routes). For example, if - the controller class is `PostController`, the directory would be `@app/views/post`; If it is `PostCommentController`, - the directory would be `@app/views/post-comment`. In case the controller belongs to a module, the directory - would be `views/ControllerID` under the [[yii\base\Module::basePath|module directory]]. -* For views rendered in a [widget](structure-widgets.md), they should be put under the `WidgetPath/views` directory by - default, where `WidgetPath` stands for the directory containing the widget class file. -* For views rendered by other objects, it is recommended that you follow the similar convention as that for widgets. +* コントローラによって表示されるビューは、既定では、ディレクトリ + `@app/views/ControllerID` の下に置かれるべきものです。 + ここで、`ControllerID` は [コントローラ ID](structure-controllers.md#routes) を指します。 + 例えば、コントローラクラスが `PostController` である場合、ディレクトリは `@app/views/post` + となります。`PostCommentController` の場合は、ディレクトリは `@app/views/post-comment` です。 + また、コントローラがモジュールに属する場合は、ディレクトリは [[yii\base\Module::basePath|モジュールディレクトリ]] + の下の `views/ControllerID` です。 +* [ウィジェット](structure-widgets.md) で表示されるビューは、既定では、`WidgetPath/views` + ディレクトリの下に置かれるべきものです。ここで、`WidgetPath` は、ウィジェットのクラスファイル + を含んでいるディレクトリを指します。 +* 他のオブジェクトによって表示されるビューについても、ウィジェットの場合と規約に従うことが + 推奨されます。 -You may customize these default view directories by overriding the [[yii\base\ViewContextInterface::getViewPath()]] -method of controllers or widgets. +これらの既定のビューディレクトリは、コントローラやウィジェットの [[yii\base\ViewContextInterface::getViewPath()]] +メソッドをオーバーライドすることでカスタマイズすることが可能です。 -## Rendering Views +## ビューをレンダリングする -You can render views in [controllers](structure-controllers.md), [widgets](structure-widgets.md), or any -other places by calling view rendering methods. These methods share a similar signature shown as follows, +[コントローラ](structure-controllers.md) の中でも、[ウィジェット](structure-widgets.md) の中でも、 +または、その他のどんな場所でも、ビューのレンダリングメソッドを呼ぶことによって +ビューをレンダリングすることが出来ます。 +これらのメソッドは、下記に示されるような類似のシグニチャを共有します。 ``` /** - * @param string $view view name or file path, depending on the actual rendering method - * @param array $params the data to be passed to the view - * @return string rendering result + * @param string $view ビュー名またはファイルパス、実際のレンダリングメソッドに依存する + * @param array $params ビューに引き渡されるデータ + * @return string レンダリングの結果 */ methodName($view, $params = []) ``` -### Rendering in Controllers +### コントローラでのレンダリング -Within [controllers](structure-controllers.md), you may call the following controller methods to render views: +[コントローラ](structure-controllers.md) の中では、ビューをレンダリングするために +次のコントローラメソッドを呼ぶことが出来ます: -* [[yii\base\Controller::render()|render()]]: renders a [named view](#named-views) and applies a [layout](#layouts) - to the rendering result. -* [[yii\base\Controller::renderPartial()|renderPartial()]]: renders a [named view](#named-views) without any layout. -* [[yii\web\Controller::renderAjax()|renderAjax()]]: renders a [named view](#named-views) without any layout, - and injects all registered JS/CSS scripts and files. It is usually used in response to AJAX Web requests. -* [[yii\base\Controller::renderFile()|renderFile()]]: renders a view specified in terms of a view file path or - [alias](concept-aliases.md). +* [[yii\base\Controller::render()|render()]]: [名前付きビュー](#named-views) をレンダリングし、 + その結果に [レイアウト](#layouts) を適用する。 +* [[yii\base\Controller::renderPartial()|renderPartial()]]: [名前付きビュー](#named-views) を + レイアウトなしでレンダリングする。 +* [[yii\web\Controller::renderAjax()|renderAjax()]]: [名前付きビュー](#named-views) を + レイアウトなしでレンダリングし、登録されている全ての JS/CSS スクリプトおよびファイルを注入する。 + 通常、AJAX ウェブリクエストに対するレスポンスにおいて使用される。 +* [[yii\base\Controller::renderFile()|renderFile()]]: ビューファイルのパスまたは [エイリアス](concept-aliases.md) + の形式で指定されたビューをレンダリングする。 -For example, +例えば、 ```php namespace app\controllers; @@ -147,7 +158,7 @@ class PostController extends Controller throw new NotFoundHttpException; } - // renders a view named "view" and applies a layout to it + // "view" という名前のビューをレンダリングし、レイアウトを適用する return $this->render('view', [ 'model' => $model, ]); @@ -156,15 +167,16 @@ class PostController extends Controller ``` -### Rendering in Widgets +### ウィジェットでのレンダリング -Within [widgets](structure-widgets.md), you may call the following widget methods to render views. +[ウィジェット](structure-widgets.md) の中では、ビューをレンダリングするために、 +次のウィジェットメソッドを使用することが出来ます。 -* [[yii\base\Widget::render()|render()]]: renders a [named view](#named-views). -* [[yii\base\Widget::renderFile()|renderFile()]]: renders a view specified in terms of a view file path or - [alias](concept-aliases.md). +* [[yii\base\Widget::render()|render()]]: [名前付きのビュー](#named-views) をレンダリングする。 +* [[yii\base\Widget::renderFile()|renderFile()]]: ビューファイルのパスまたは [エイリアス](concept-aliases.md) + の形式で指定されたビューをレンダリングする。 -For example, +例えば、 ```php namespace app\components; @@ -178,7 +190,7 @@ class ListWidget extends Widget public function run() { - // renders a view named "list" + // "list" という名前のビューをレンダリングする return $this->render('list', [ 'items' => $this->items, ]); @@ -187,68 +199,79 @@ class ListWidget extends Widget ``` -### Rendering in Views +### ビューでのレンダリング -You can render a view within another view by calling one of the following methods provided by the [[yii\base\View|view component]]: +[[yii\base\View|ビューコンポーネント]] によって提供される下記のメソッドのどれかを使うと、 +ビューの中で、別のビューをレンダリングすることが出来ます: -* [[yii\base\View::render()|render()]]: renders a [named view](#named-views). -* [[yii\web\View::renderAjax()|renderAjax()]]: renders a [named view](#named-views) and injects all registered - JS/CSS scripts and files. It is usually used in response to AJAX Web requests. -* [[yii\base\View::renderFile()|renderFile()]]: renders a view specified in terms of a view file path or - [alias](concept-aliases.md). +* [[yii\base\View::render()|render()]]: [名前付きのビュー](#named-views) をレンダリングする。 +* [[yii\web\View::renderAjax()|renderAjax()]]: [名前付きビュー](#named-views) をレンダリングし、 + 登録されている全ての JS/CSS スクリプトおよびファイルを注入する。 + 通常、AJAX ウェブリクエストに対するレスポンスにおいて使用される。 +* [[yii\base\View::renderFile()|renderFile()]]: ビューファイルのパスまたは [エイリアス](concept-aliases.md) + の形式で指定されたビューをレンダリングする。 -For example, the following code in a view renders the `_overview.php` view file which is in the same directory -as the view being currently rendered. Remember that `$this` in a view refers to the [[yii\base\View|view]] component: +例えば、ビューの中の次のコードは、現在レンダリングされているビューと同じディレクトリにある +`_overview.php` というビューファイルをレンダリングします。 +ビューでは `$this` が [[yii\base\View|ビュー]] コンポーネントを参照することを思い出してください: ```php render('_overview') ?> ``` -### Rendering in Other Places +### 他の場所でのレンダリング -In any place, you can get access to the [[yii\base\View|view]] application component by the expression -`Yii::$app->view` and then call its aforementioned methods to render a view. For example, +場所がどこであれ、`Yii::$app->view` という式によって [[yii\base\View|ビュー]] アプリケーションコンポーネントにアクセスすることが出来ますから、 +前述の [[yii\base\View|ビュー]] コンポーネントメソッドを使ってビューをレンダリングすることが出来ます。 +例えば、 ```php -// displays the view file "@app/views/site/license.php" +// ビューファイル "@app/views/site/license.php" を表示 echo \Yii::$app->view->renderFile('@app/views/site/license.php'); ``` -### Named Views - -When you render a view, you can specify the view using either a view name or a view file path/alias. In most cases, -you would use the former because it is more concise and flexible. We call views specified using names as *named views*. - -A view name is resolved into the corresponding view file path according to the following rules: - -* A view name may omit the file extension name. In this case, `.php` will be used as the extension. For example, - the view name `about` corresponds to the file name `about.php`. -* If the view name starts with double slashes `//`, the corresponding view file path would be `@app/views/ViewName`. - That is, the view is looked for under the [[yii\base\Application::viewPath|application's view path]]. - For example, `//site/about` will be resolved into `@app/views/site/about.php`. -* If the view name starts with a single slash `/`, the view file path is formed by prefixing the view name - with the [[yii\base\Module::viewPath|view path]] of the currently active [module](structure-modules.md). - If there is no active module, `@app/views/ViewName` will be used. For example, `/user/create` will be resolved into - `@app/modules/user/views/user/create.php`, if the currently active module is `user`. If there is no active module, - the view file path would be `@app/views/user/create.php`. -* If the view is rendered with a [[yii\base\View::context|context]] and the context implements [[yii\base\ViewContextInterface]], - the view file path is formed by prefixing the [[yii\base\ViewContextInterface::getViewPath()|view path]] of the - context to the view name. This mainly applies to the views rendered within controllers and widgets. For example, - `site/about` will be resolved into `@app/views/site/about.php` if the context is the controller `SiteController`. -* If a view is rendered within another view, the directory containing the other view file will be prefixed to - the new view name to form the actual view file path. For example, `item` will be resolved into `@app/views/post/item` - if it is being rendered in the view `@app/views/post/index.php`. - -According to the above rules, calling `$this->render('view')` in a controller `app\controllers\PostController` will -actually render the view file `@app/views/post/view.php`, while calling `$this->render('_overview')` in that view -will render the view file `@app/views/post/_overview.php`. - - -### Accessing Data in Views - -There are two approaches to access data within a view: push and pull. +### 名前付きビュー + +ビューをレンダリングするとき、ビューを指定するのには、ビューの名前か、 +ビューファイルのパス/エイリアスか、どちらかを使うことが出来ます。 +たいていの場合は、より簡潔で柔軟な前者を使います。 +名前を使って指定されるビューを *名前付きビュー* と呼びます。 + +ビューの名前は、以下の規則に従って、対応するビューファイルのパスに解決されます。 + +* ビュー名はファイル拡張子を省略することが出来ます。その場合、`.php` が拡張子として使われます。 + 例えば、`about` というビュー名は `about.php` というファイル名に対応します。 +* ビュー名が二つのスラッシュ (`//`) で始まる場合は、対応するビューファイルのパスは `@app/views/ViewName` + となります。つまり、ビューファイルは [[yii\base\Application::viewPath|アプリケーションのビューパス]] + の下で探されます。例えば、`//site/about` は `@app/views/site/about.php` へと解決されます。 +* ビュー名が一つのスラッシュ (`/`) で始まる場合は、ビューファイルのパスは、ビュー名の前に、現在 + アクティブな [モジュール](structure-modules.md) の [[yii\base\Module::viewPath|ビューパス]] + を置くことによって形成されます。アクティブなモジュールが無い場合は、`@app/views/ViewName` + が使用されます。例えば、`/user/create` は、現在アクティブなモジュールが `user` である場合は、 + `@app/modules/user/views/user/create.php` へと解決されます。アクティブなモジュールが無い場合は、 + ビューファイルのパスは `@app/views/user/create.php` となります。 +* ビューが [[yii\base\View::context|コンテキスト]] を伴ってレンダリングされ、そのコンテキストが + [[yii\base\ViewContextInterface]] を実装している場合は、ビューファイルのパスは、コンテキストの + [[yii\base\ViewContextInterface::getViewPath()|ビューパス]] をビュー名の前に置くことによって + 形成されます。これは、主として、コントローラとウィジェットの中でレンダリングされるビューに当てはまります。 + 例えば、コンテキストが `SiteController` コントローラである場合、`site/about` は `@app/views/site/about.php` + へと解決されます。 +* あるビューが別のビューの中でレンダリングされる場合は、後者のビューファイルを含んでいるディレクトリが + 前者のビュー名の前に置かれて、実際のビューファイルのパスが形成されます。例えば、`item` は、 + `@app/views/post/index.php` というビューの中でレンダリングされる場合、`@app/views/post/item` + へと解決されます。 + +上記の規則によると、コントローラ `app\controllers\PostController` の中で `$this->render('view')` を呼ぶと、 +実際には、ビューファイル `@app/views/post/view.php` がレンダリングされ、一方、そのビューの中で +`$this->render('_overview')` を呼ぶと、ビューファイル `@app/views/post/_overview.php` +がレンダリングされることになります。 + + +### ビューの中でデータにアクセスする + +ビューの中でデータにアクセスするためのアプローチが二つあります: プッシュとプルです。 By passing the data as the second parameter to the view rendering methods, you are using the push approach. The data should be represented as an array of name-value pairs. When the view is being rendered, the PHP From 398d62a4cf37090db0a373639981177287dcc82d Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Tue, 4 Nov 2014 22:31:40 +0900 Subject: [PATCH 074/144] docs/guide-ja/structure-views.md - WIP [ci skip] --- docs/guide-ja/structure-views.md | 296 +++++++++++++++++++++------------------ 1 file changed, 156 insertions(+), 140 deletions(-) diff --git a/docs/guide-ja/structure-views.md b/docs/guide-ja/structure-views.md index 714f359..e849401 100644 --- a/docs/guide-ja/structure-views.md +++ b/docs/guide-ja/structure-views.md @@ -38,14 +38,15 @@ $this->title = 'ログイン'; ``` -ビューの中でアクセスできる `$this` は、このビューテンプレートを管理し表示している [[yii\web\View|ビューコンポーネント]] を参照します。 +ビューの中でアクセスできる `$this` は、このビューテンプレートを管理しレンダリングしている +[[yii\web\View|ビューコンポーネント]] を参照します。 `$this` 以外に、上記の例の `$model` のように、前もって定義された変数がビューの中にあることがあります。 このような変数は、[コントローラ](structure-controllers.md) または [ビューのレンダリング](#rendering-views) をトリガするオブジェクトによってビューに *プッシュ* されたデータを表します。 > Tip|ヒント: 上の例では、事前に定義された変数は、IDE に認識されるように、 ビューの先頭のコメントブロックの中にリストされています。これは、ビューに - ドキュメントを加えるためにも良い方法です。 + ドキュメントを付けるのにも良い方法です。 ### セキュリティ @@ -100,7 +101,7 @@ use yii\helpers\HtmlPurifier; * [ウィジェット](structure-widgets.md) で表示されるビューは、既定では、`WidgetPath/views` ディレクトリの下に置かれるべきものです。ここで、`WidgetPath` は、ウィジェットのクラスファイル を含んでいるディレクトリを指します。 -* 他のオブジェクトによって表示されるビューについても、ウィジェットの場合と規約に従うことが +* 他のオブジェクトによって表示されるビューについても、ウィジェットの場合と同じ規約に従うことが 推奨されます。 これらの既定のビューディレクトリは、コントローラやウィジェットの [[yii\base\ViewContextInterface::getViewPath()]] @@ -110,7 +111,7 @@ use yii\helpers\HtmlPurifier; ## ビューをレンダリングする [コントローラ](structure-controllers.md) の中でも、[ウィジェット](structure-widgets.md) の中でも、 -または、その他のどんな場所でも、ビューのレンダリングメソッドを呼ぶことによって +または、その他のどんな場所でも、ビューをレンダリングするメソッドを呼ぶことによって ビューをレンダリングすることが出来ます。 これらのメソッドは、下記に示されるような類似のシグニチャを共有します。 @@ -271,13 +272,14 @@ echo \Yii::$app->view->renderFile('@app/views/site/license.php'); ### ビューの中でデータにアクセスする -ビューの中でデータにアクセスするためのアプローチが二つあります: プッシュとプルです。 +ビューの中でデータにアクセスするためのアプローチが二つあります: 「プッシュ」と「プル」です。 -By passing the data as the second parameter to the view rendering methods, you are using the push approach. -The data should be represented as an array of name-value pairs. When the view is being rendered, the PHP -`extract()` function will be called on this array so that the array is extracted into variables in the view. -For example, the following view rendering code in a controller will push two variables to the `report` view: -`$foo = 1` and `$bar = 2`. +ビューをレンダリングするメソッドに二番目のパラメータとしてデータを渡すのが「プッシュ」のアプローチです。 +データは、「名前-値」のペアの配列として表されなければなりません。 +ビューがレンダリングされるときに、PHP の `extract()` 関数がこの配列に対して呼び出され、 +ビューの中でこの配列から変数が抽出されます。 +例えば、次のコードはコントローラの中でビューをレンダリングしていますが、`report` ビューに +二つの変数、すなわち、`$foo = 1` と `$bar = 2` をプッシュしています。 ```php echo $this->render('report', [ @@ -286,35 +288,38 @@ echo $this->render('report', [ ]); ``` -The pull approach actively retrieves data from the [[yii\base\View|view component]] or other objects accessible -in views (e.g. `Yii::$app`). Using the code below as an example, within the view you can get the controller object -by the expression `$this->context`. And as a result, it is possible for you to access any properties or methods -of the controller in the `report` view, such as the controller ID shown in the following: +「プル」のアプローチは、[[yii\base\View|ビューコンポーネント]] またはビューからアクセス出来るその他のオブジェクト (例えば `Yii::$app`) から +積極的にデータを読み出すものです。 +下記のコードを例として使って、ビューの中で `$this->context` という式でコントローラオブジェクト +を取得することが出来ます。その結果、`report` ビューの中でコントローラの全てのプロパティや +メソッドにアクセスすることが出来ます。次の例ではコントローラ ID にアクセスしています: ```php The controller ID is: context->id ?> ?> ``` -The push approach is usually the preferred way of accessing data in views, because it makes views less dependent -on context objects. Its drawback is that you need to manually build the data array all the time, which could -become tedious and error prone if a view is shared and rendered in different places. +通常は「プッシュ」アプローチが、ビューでデータにアクセスする方法として推奨されます。 +なぜなら、ビューのコンテキストオブジェクトに対する依存がより少ないからです。 +その短所は、常にデータ配列を手作業で作成する必要がある、ということです。 +ビューが共有されてさまざまな場所でレンダリングされる場合、その作業が面倒くさくなり、また、 +間違いも生じやすくなります。 -### Sharing Data among Views +### ビューの間でデータを共有する -The [[yii\base\View|view component]] provides the [[yii\base\View::params|params]] property that you can use -to share data among views. +[[yii\base\View|ビューコンポーネント]] が提供する [[yii\base\View::params|params]] プロパティを使うと +ビューの間でデータを共有することが出来ます。 -For example, in an `about` view, you can have the following code which specifies the current segment of the -breadcrumbs. +例えば、`about` というビューで、次のようなコードを使って、 +パン屑リストの現在の区分を指定することが出来ます。 ```php $this->params['breadcrumbs'][] = 'About Us'; ``` -Then, in the [layout](#layouts) file, which is also a view, you can display the breadcrumbs using the data -passed along [[yii\base\View::params|params]]: +そして、[レイアウト](#layouts) ファイル (これも一つのビューです) の中で、[[yii\base\View::params|params]] +によって渡されたデータを使って、パン屑リストを表示することが出来ます: ```php +## レイアウト -Layouts are a special type of views that represent the common parts of multiple views. For example, the pages -for most Web applications share the same page header and footer. While you can repeat the same page header and footer -in every view, a better way is to do this once in a layout and embed the rendering result of a content view at -an appropriate place in the layout. +レイアウトは、複数のビューの共通部分をあらわす特殊なタイプのビューです。 +例えば、たいていのウェブアプリケーションでは、ページは共通のヘッダとフッタを持っています。 +すべてのビューで同じヘッダとフッタを繰り返すことも出来ますが、もっと良い方法は、 +そういうことはレイアウトの中で一度だけして、コンテンツビューのレンダリング結果を +レイアウトの中の適切な場所に埋め込むことです。 -### Creating Layouts +### レイアウトを作成する -Because layouts are also views, they can be created in the similar way as normal views. By default, layouts -are stored in the directory `@app/views/layouts`. For layouts used within a [module](structure-modules.md), -they should be stored in the `views/layouts` directory under the [[yii\base\Module::basePath|module directory]]. -You may customize the default layout directory by configuring the [[yii\base\Module::layoutPath]] property of -the application or modules. +レイアウトもまたビューですので、通常のビューと同様な方法で作成することが出来ます。既定では、 +レイアウトは `@app/views/layouts` ディレクトリに保存されます。[モジュール](structure-modules.md) +の中で使用されるレイアウトについては、[[yii\base\Module::basePath|モジュールディレクトリ]] の下の +`views/layouts` ディレクトリに保存されるべきものとなります。既定のレイアウトディレクトリは、 +アプリケーションまたはモジュールの [[yii\base\Module::layoutPath]] プロパティを構成することで +カスタマイズすることが出来ます。 -The following example shows how a layout looks like. Note that for illustrative purpose, we have greatly simplified -the code in the layout. In practice, you may want to add more content to it, such as head tags, main menu, etc. +次の例は、レイアウトがどのようなものであるかを示すものです。説明のために、レイアウトの中のコードを +大幅に単純化していることに注意してください。実際には、ヘッドのタグやメインメニューなど、もっと +多くのコンテンツを追加する必要があるでしょう。 ```php endPage() ?> ``` -As you can see, the layout generates the HTML tags that are common to all pages. Within the `` section, -the layout echoes the `$content` variable which represents the rendering result of content views and is pushed -into the layout when [[yii\base\Controller::render()]] is called. - -Most layouts should call the following methods like shown in the above code. These methods mainly trigger events -about the rendering process so that scripts and tags registered in other places can be properly injected into -the places where these methods are called. - -- [[yii\base\View::beginPage()|beginPage()]]: This method should be called at the very beginning of the layout. - It triggers the [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]] event which indicates the beginning of a page. -- [[yii\base\View::endPage()|endPage()]]: This method should be called at the end of the layout. - It triggers the [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] event which indicates the end of a page. -- [[yii\web\View::head()|head()]]: This method should be called within the `` section of an HTML page. - It generates a placeholder which will be replaced with the registered head HTML code (e.g. link tags, meta tags) - when a page finishes rendering. -- [[yii\web\View::beginBody()|beginBody()]]: This method should be called at the beginning of the `` section. - It triggers the [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]] event and generates a placeholder which will - be replaced by the registered HTML code (e.g. JavaScript) targeted at the body begin position. -- [[yii\web\View::endBody()|endBody()]]: This method should be called at the end of the `` section. - It triggers the [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]] event and generates a placeholder which will - be replaced by the registered HTML code (e.g. JavaScript) targeted at the body end position. - - -### Accessing Data in Layouts - -Within a layout, you have access to two predefined variables: `$this` and `$content`. The former refers to -the [[yii\base\View|view]] component, like in normal views, while the latter contains the rendering result of a content -view which is rendered by calling the [[yii\base\Controller::render()|render()]] method in controllers. - -If you want to access other data in layouts, you have to use the pull method as described in -the [Accessing Data in Views](#accessing-data-in-views) subsection. If you want to pass data from a content view -to a layout, you may use the method described in the [Sharing Data among Views](#sharing-data-among-views) subsection. - - -### Using Layouts - -As described in the [Rendering in Controllers](#rendering-in-controllers) subsection, when you render a view -by calling the [[yii\base\Controller::render()|render()]] method in a controller, a layout will be applied -to the rendering result. By default, the layout `@app/views/layouts/main.php` will be used. - -You may use a different layout by configuring either [[yii\base\Application::layout]] or [[yii\base\Controller::layout]]. -The former governs the layout used by all controllers, while the latter overrides the former for individual controllers. -For example, the following code makes the `post` controller to use `@app/views/layouts/post.php` as the layout -when rendering its views. Other controllers, assuming their `layout` property is untouched, will still use the default -`@app/views/layouts/main.php` as the layout. +見ると分かるように、レイアウトはすべてのページに共通な HTML タグを生成しています。`` +セクションの中でレイアウトが `$content` という変数をエコーしていますが、これは、 +コンテンツビューのレンダリング結果を表すものであり、[[yii\base\Controller::render()]] が呼ばれるときに、レイアウトにプッシュされるものです。 + +上記のコードに示されているように、たいていのレイアウトは次に挙げるメソッドを呼び出すべきです。 +これらのメソッドは主としてレンダリングの過程に関するイベントをトリガして、他の場所で登録された +スクリプトやタグが、メソッドが呼ばれた場所に正しく注入されるようにするためのものです。 + +- [[yii\base\View::beginPage()|beginPage()]]: このメソッドがレイアウトの一番初めに呼ばれるべきです。 + これは、ページの開始を示す [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]] イベントをトリガします。 +- [[yii\base\View::endPage()|endPage()]]: このメソッドがレイアウトの最後で呼ばれるべきです。 + これは、ページの終了を示す [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] イベントをトリガします。 +- [[yii\web\View::head()|head()]]: このメソッドが HTML ページの `` セクションの中で呼ばれるべきです。 + このメソッドは、ページのレンダリングが完了したときに、登録された head の HTML コード (リンクタグ、メタタグなど) に置き換えられるプレースホルダを生成します。 +- [[yii\web\View::beginBody()|beginBody()]]: このメソッドが `` セクションの最初で呼ばれるべきです。 + このメソッドは [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]] イベントをトリガし、 + body の開始位置を目的とする登録された HTML コード (JavaScript など) によって置き換えられる + プレースホルダを生成します。 +- [[yii\web\View::endBody()|endBody()]]: このメソッドが ` セクションの最後で呼ばれるべきです。 + このメソッドは [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]] イベントをトリガし、 + body の終了位置を目的とする登録された HTML コード (JavaScript など) によって置き換えられる + プレースホルダを生成します。 + + +### レイアウトでデータにアクセスする + +レイアウトの中では、事前定義された二つの変数にアクセス出来ます: `$this` と `$content` です。前者は、 +通常のビューにおいてと同じく、[[yii\base\View|ビュー]] コンポーネントを参照します。一方、後者は、 +コントローラの中で [[yii\base\Controller::render()|render()]] メソッドを呼ぶことによってレンダリングされる、 +コンテンツビューのレンダリング結果を含むものです。 + +レイアウトの中で他のデータにアクセスする必要があるときは、[ビューの中でデータにアクセスする](#accessing-data-in-views) +の項で説明されている「プル」の方法を使う必要があります。コンテンツビューからレイアウトにデータを渡す必要があるときは、 +[ビューの間でデータを共有する](#sharing-data-among-views) の項で説明されている方法を使うことが出来ます。 + + +### レイアウトを使う + +[コントローラでのレンダリング](#rendering-in-controllers) の項で説明されているように、コントローラの中で +[[yii\base\Controller::render()|render()]] メソッドを呼んでビューをレンダリングすると、レンダリング結果に +レイアウトが適用されます。既定では、`@app/views/layouts/main.php` というレイアウトが使用されます。 + +[[yii\base\Application::layout]] または [[yii\base\Controller::layout]] のどちらかを構成することによって、異なるレイアウトを +使うことが出来ます。前者は全てのコントローラによって使用されるレイアウトを決定するものですが、後者は個々のコントローラについて +前者をオーバーライドするものです。例えば、次のコードは、`post` コントローラがビューをレンダリングするときに +`@app/views/layouts/post.php` をレイアウトとして使うようにするものです。その他のコントローラは、`layout` プロパティに +触れられていないと仮定すると、引き続き既定の `@app/views/layouts/main.php` をレイアウトとして使います。 ```php namespace app\controllers; @@ -428,77 +438,82 @@ class PostController extends Controller } ``` -For controllers belonging to a module, you may also configure the module's [[yii\base\Module::layout|layout]] property to -use a particular layout for these controllers. +モジュールに属するコントローラについては、モジュールの [[yii\base\Module::layout|layout]] プロパティを構成して、モジュール内の +コントローラに特定のレイアウトを使用することも出来ます。 + +`layout` プロパティは異なるレベル (コントローラ、モジュール、アプリケーション) で構成されうるものですので、 +Yii は舞台裏で二つのステップを践んで、特定のコントローラで実際に使われるレイアウトファイルが何であるかを決定します。 -Because the `layout` property may be configured at different levels (controllers, modules, application), -behind the scene Yii takes two steps to determine what is the actual layout file being used for a particular controller. +最初のステップで、Yii はレイアウトの値とコンテキストモジュールを決定します: -In the first step, it determines the layout value and the context module: +- コントローラの [[yii\base\Controller::layout]] プロパティが null でないときは、それをレイアウトの値として使い、 + コントローラの [[yii\base\Controller::module|モジュール]] をコンテキストモジュールとして使う。 +- [[yii\base\Controller::layout|layout]] が null のときは、コントローラの祖先となっている全てのモジュール + (アプリケーション自体も含む) を探して、[[yii\base\Module::layout|layout]] プロパティが null でない最初のモジュールを見つける。 + 見つかったモジュールとその [[yii\base\Module::layout|layout]] の値をコンテキストモジュールと選ばれたレイアウトの値とする。 + そのようなモジュールが見つからなかったときは、レイアウトは適用されないということを意味する。 -- If the [[yii\base\Controller::layout]] property of the controller is not null, use it as the layout value and - the [[yii\base\Controller::module|module]] of the controller as the context module. -- If [[yii\base\Controller::layout|layout]] is null, search through all ancestor modules (including the application itself) of the controller and - find the first module whose [[yii\base\Module::layout|layout]] property is not null. Use that module and - its [[yii\base\Module::layout|layout]] value as the context module and the chosen layout value. - If such a module cannot be found, it means no layout will be applied. - -In the second step, it determines the actual layout file according to the layout value and the context module -determined in the first step. The layout value can be: +第二のステップでは、最初のステップで決定されたレイアウトの値とコンテキストモジュールに従って、実際のレイアウトファイルを決定します。 +レイアウトの値は下記のいずれかであり得ます: -- a path alias (e.g. `@app/views/layouts/main`). -- an absolute path (e.g. `/main`): the layout value starts with a slash. The actual layout file will be - looked for under the application's [[yii\base\Application::layoutPath|layout path]] which defaults to - `@app/views/layouts`. -- a relative path (e.g. `main`): the actual layout file will be looked for under the context module's - [[yii\base\Module::layoutPath|layout path]] which defaults to the `views/layouts` directory under the - [[yii\base\Module::basePath|module directory]]. -- the boolean value `false`: no layout will be applied. +- パスエイリアス (例えば、`@app/views/layouts/main`)。 +- 絶対パス (例えば、`/main`): すなわち、スラッシュで始まるレイアウトの値の場合。 + 実際のレイアウトファイルはアプリケーションの [[yii\base\Application::layoutPath|レイアウトパス]] + (デフォルトでは `@app/views/layouts`) の下で探される。 +- 相対パス (例えば、`main`): 実際のレイアウトファイルはコンテキストモジュールの [[yii\base\Module::layoutPath|レイアウトパス]] + (デフォルトでは [[yii\base\Module::basePath|モジュールディレクトリ]] の下の `views/layouts` ディレクトリ) の下で探される。 +- 真偽値 `false`: レイアウトは適用されない。 -If the layout value does not contain a file extension, it will use the default one `.php`. +レイアウトの値がファイル拡張子を含んでいない場合は、デフォルト値である `.php` を使います。 -### Nested Layouts +### 入れ子のレイアウト -Sometimes you may want to nest one layout in another. For example, in different sections of a Web site, you -want to use different layouts, while all these layouts share the same basic layout that generates the overall -HTML5 page structure. You can achieve this goal by calling [[yii\base\View::beginContent()|beginContent()]] and -[[yii\base\View::endContent()|endContent()]] in the child layouts like the following: +ときとして、あるレイアウトの中に別のレイアウトを入れたい場合があるでしょう。例えば、 +ウェブサイトの別々のセクションにおいて、違うレイアウトを使いたいけれども、 +それらのレイアウトは全て、全体としての HTML5 ページ構造を生成する同一の基本レイアウトを +共有している、という場合です。この目的を達することは、次のように、子レイアウトの中で +[[yii\base\View::beginContent()|beginContent()]] と [[yii\base\View::endContent()|endContent()]] +を呼ぶことで可能になります: ```php beginContent('@app/views/layouts/base.php'); ?> -...child layout content here... +... 子レイアウトのコンテンツをここに ... endContent(); ?> ``` -As shown above, the child layout content should be enclosed within [[yii\base\View::beginContent()|beginContent()]] and -[[yii\base\View::endContent()|endContent()]]. The parameter passed to [[yii\base\View::beginContent()|beginContent()]] -specifies what is the parent layout. It can be either a layout file or alias. +上のコードが示すように、子レイアウトのコンテンツは [[yii\base\View::beginContent()|beginContent()]] と +[[yii\base\View::endContent()|endContent()]] によって囲まれなければなりません。 +[[yii\base\View::beginContent()|beginContent()]] に渡されるパラメータは、 +親レイアウトで何であるかを指定するものです。レイアウトのファイルまたはエイリアスのどちらかを使うことが出来ます。 -Using the above approach, you can nest layouts in more than one levels. +上記のアプローチを使って、2レベル以上のレイアウトを入れ子にすることも出来ます。 -### Using Blocks +### ブロックを使う -Blocks allow you to specify the view content in one place while displaying it in another. They are often used together -with layouts. For example, you can define a block in a content view and display it in the layout. +ブロックを使うと、ある場所でビューコンテンツを規定して、別の場所でそれを表示することが可能になります。 +ブロックはたいていはレイアウトと一緒に使われます。例えば、ブロックをコンテンツビューで定義して、 +それをレイアウトで表示する、ということが出来ます。 -You call [[yii\base\View::beginBlock()|beginBlock()]] and [[yii\base\View::endBlock()|endBlock()]] to define a block. -The block can then be accessed via `$view->blocks[$blockID]`, where `$blockID` stands for a unique ID that you assign -to the block when defining it. +[[yii\base\View::beginBlock()|beginBlock()]] と [[yii\base\View::endBlock()|endBlock()]] +を呼んでブロックを定義します。 +すると、そのブロックを `$view->blocks[$blockID]` によってアクセス出来るようになります。 +ここで `$blockID` は、定義したときにブロックに割り当てたユニークな ID を指します。 -The following example shows how you can use blocks to customize specific parts of a layout in a content view. +次の例は、どのようにブロックを使えば、レイアウトの特定の部分をコンテンツビューで +カスタマイズすることが出来るかを示すものです。 -First, in a content view, define one or multiple blocks: +最初に、コンテンツビューで、一つまたは複数のブロックを定義します。 ```php ... beginBlock('block1'); ?> -...content of block1... +... block1 のコンテンツ ... endBlock(); ?> @@ -506,20 +521,20 @@ First, in a content view, define one or multiple blocks: beginBlock('block3'); ?> -...content of block3... +... block3 のコンテンツ ... endBlock(); ?> ``` -Then, in the layout view, render the blocks if they are available, or display some default content if a block is -not defined. +次に、レイアウトビューで、得ることが出来ればブロックをレンダリングし、ブロックが定義されていないときは +何らかの既定のコンテンツを表示します。 ```php ... blocks['block1'])): ?> blocks['block1'] ?> - ... default content for block1 ... + ... block1 の既定のコンテンツ ... ... @@ -527,7 +542,7 @@ not defined. blocks['block2'])): ?> blocks['block2'] ?> - ... default content for block2 ... + ... block2 の既定のコンテンツ ... ... @@ -535,18 +550,18 @@ not defined. blocks['block3'])): ?> blocks['block3'] ?> - ... default content for block3 ... + ... block3 の既定のコンテンツ ... ... ``` -## Using View Components +## ビューコンポーネントを使う -[[yii\base\View|View components]] provides many view-related features. While you can get view components -by creating individual instances of [[yii\base\View]] or its child class, in most cases you will mainly use -the `view` application component. You can configure this component in [application configurations](structure-applications.md#application-configurations) -like the following: +[[yii\base\View|ビューコンポーネント]] はビューに関連する多くの機能を提供します。 +ビューコンポーネントは、[[yii\base\View]] またはその子クラスの個別のインスタンスを作成することによっても取得できますが、 +たいていの場合は、`view` アプリケーションコンポーネントを主として使うことになるでしょう。 +このコンポーネントは [アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の中で、次のようにして構成することが出来ます: ```php [ @@ -560,12 +575,13 @@ like the following: ] ``` -View components provide the following useful view-related features, each described in more details in a separate section: +ビューコンポーネントは、次に挙げるビュー関連の有用な機能を提供します。それぞれについては、 +独立の節で更に詳細に説明されます。 -* [theming](output-theming.md): allows you to develop and change the theme for your Web site. -* [fragment caching](caching-fragment.md): allows you to cache a fragment within a Web page. -* [client script handling](output-client-scripts.md): supports CSS and JavaScript registration and rendering. -* [asset bundle handling](structure-assets.md): supports registering and rendering of [asset bundles](structure-assets.md). +* [テーマ](output-theming.md): ウェブサイトのテーマを開発し変更することを可能にします。 +* [フラグメントキャッシュ](caching-fragment.md): ウェブページの中の断片をキャッシュすることを可能にします。 +* [クライアントスクリプトの取り扱い](output-client-scripts.md): CSS と JavaScript の登録とレンダリングをサポートします。 +* [アセットバンドルの取り扱い](structure-assets.md): [アセットバンドル](structure-assets.md) の登録とレンダリングをサポート. * [alternative template engines](tutorial-template-engines.md): allows you to use other template engines, such as [Twig](http://twig.sensiolabs.org/), [Smarty](http://www.smarty.net/). From 509f5b64e9774a4cb7c81672e6be3669d5aea1ac Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Wed, 5 Nov 2014 21:09:07 +0900 Subject: [PATCH 075/144] docs/guide-ja/structure-views.md - completed [ci skip] --- docs/guide-ja/structure-views.md | 146 ++++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 72 deletions(-) diff --git a/docs/guide-ja/structure-views.md b/docs/guide-ja/structure-views.md index e849401..c214fa9 100644 --- a/docs/guide-ja/structure-views.md +++ b/docs/guide-ja/structure-views.md @@ -581,20 +581,20 @@ Yii は舞台裏で二つのステップを践んで、特定のコントロー * [テーマ](output-theming.md): ウェブサイトのテーマを開発し変更することを可能にします。 * [フラグメントキャッシュ](caching-fragment.md): ウェブページの中の断片をキャッシュすることを可能にします。 * [クライアントスクリプトの取り扱い](output-client-scripts.md): CSS と JavaScript の登録とレンダリングをサポートします。 -* [アセットバンドルの取り扱い](structure-assets.md): [アセットバンドル](structure-assets.md) の登録とレンダリングをサポート. -* [alternative template engines](tutorial-template-engines.md): allows you to use other template engines, such as - [Twig](http://twig.sensiolabs.org/), [Smarty](http://www.smarty.net/). +* [アセットバンドルの取り扱い](structure-assets.md): [アセットバンドル](structure-assets.md) の登録とレンダリングをサポートします。 +* [代替のテンプレートエンジン](tutorial-template-engines.md): [Twig](http://twig.sensiolabs.org/)、[Smarty](http://www.smarty.net/) など、他のテンプレートエンジンを使用することを可能にします。 -You may also frequently use the following minor yet useful features when you are developing Web pages. +次に挙げるマイナーではあっても有用な諸機能は、ウェブページを開発するときに頻繁に使用するでしょう: -### Setting Page Titles +### ページタイトルを設定する -Every Web page should have a title. Normally the title tag is being displayed in a [layout](#layouts). However, in practice -the title is often determined in content views rather than layouts. To solve this problem, [[yii\web\View]] provides -the [[yii\web\View::title|title]] property for you to pass the title information from content views to layouts. +どんなウェブページにもタイトルが無ければなりません。通常、タイトルタグは [layout](#layouts) の中で表示されます。しかし、 +実際においては、多くの場合、タイトルはレイアウトではなくコンテンツビューで決められます。この問題を解決するために、 +[[yii\web\View]] は、タイトル情報をコンテンツビューからレイアウトに渡すための [[yii\web\View::title|title]] プロパティを +提供しています。 -To make use of this feature, in each content view, you can set the page title like the following: +この機能を利用するためには、全てのコンテンツビューにおいて、次のようにタイトルを設定します: ```php title = 'My page title'; ?> ``` -Then in the layout, make sure you have the following code in the `` section: +そして、レイアウトビューで、`` セクションに次のコードを忘れずに書くようにします: ```php <?= Html::encode($this->title) ?> ``` -### Registering Meta Tags +### メタタグを登録する -Web pages usually need to generate various meta tags needed by different parties. Like page titles, meta tags -appear in the `` section and are usually generated in layouts. +ウェブページは、通常、いろいろな関係者によって必要とされるさまざまなメタタグを生成する必要があります。ページタイトルと同じように、 +メタタグは `` セクションに出現して、通常はレイアウトの中で生成されます。 -If you want to specify what meta tags to generate in content views, you can call [[yii\web\View::registerMetaTag()]] -in a content view, like the following: +どのようなメタタグを生成するかをコンテンツビューの中で指定したい場合は、下記のように、 +[[yii\web\View::registerMetaTag()]] をコンテンツビューの呼ぶことが出来ます: ```php registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php' ?> ``` -The above code will register a "keywords" meta tag with the view component. The registered meta tag is -rendered after the layout finishes rendering. By then, the following HTML code will be inserted -at the place where you call [[yii\web\View::head()]] in the layout and generate the following HTML code: +上記のコードは、ビューコンポーネントによって "keywords" メタタグを登録するものです。登録されたメタタグは、 +レイアウトがレンダリングを完了した後でレンダリングされます。すなわち、レイアウトの中で [[yii\web\View::head()]] +を呼び出した場所に、次の HTML コードが生成されて挿入されます: ```php ``` -Note that if you call [[yii\web\View::registerMetaTag()]] multiple times, it will register multiple meta tags, -regardless whether the meta tags are the same or not. +[[yii\web\View::registerMetaTag()]] を複数回呼び出した場合は、メタタグが同じものか否かに関係なく、 +複数のメタタグが登録されることに注意してください。 -To make sure there is only a single instance of a meta tag type, you can specify a key as a second parameter when calling the method. -For example, the following code registers two "description" meta tags. However, only the second one will be rendered. +ある型のメタタグのインスタンスが一つだけになることを保証したい場合は、このメソッドを呼ぶときに第二のパラメータとして +キーを指定することが出来ます。例えば、次のコードでは、二つの "description" メタタグを登録していますが、 +二番目のものだけがレンダリングされることになります。 ```html -$this->registerMetaTag(['name' => 'description', 'content' => 'This is my cool website made with Yii!'], 'description'); -$this->registerMetaTag(['name' => 'description', 'content' => 'This website is about funny raccoons.'], 'description'); +$this->registerMetaTag(['name' => 'description', 'content' => '俺が Yii で作ったクールなウェブサイトだぜぃ!!'], 'description'); +$this->registerMetaTag(['name' => 'description', 'content' => '面白いアライグマに関するウェブサイトです。'], 'description'); ``` -### Registering Link Tags +### リンクタグを登録する -Like [meta tags](#adding-meta-tags), link tags are useful in many cases, such as customizing favicon, pointing to -RSS feed or delegating OpenID to another server. You can work with link tags in the similar way as meta tags -by using [[yii\web\View::registerLinkTag()]]. For example, in a content view, you can register a link tag like follows, +[メタタグ](#registering-meta-tags) と同じように、リンクタグも多くの場合において有用なものです。例えば、favicon をカスタマイズしたり、 +RSS フィードを指し示したり、OpenID を別のサーバに委任したり、等々。リンクタグも、[[yii\web\View::registerLinkTag()]] を使って、 +メタタグと同じような方法で取り扱うことが出来ます。例えば、コンテンツビューにおいて、次のようにしてリンクタグを登録することが出来ます。 ```php $this->registerLinkTag([ - 'title' => 'Live News for Yii', + 'title' => 'Yii ライブニューズ', 'rel' => 'alternate', 'type' => 'application/rss+xml', 'href' => 'http://www.yiiframework.com/rss.xml/', ]); ``` -The code above will result in +上記のコードは、次の結果になります。 ```html - + ``` -Similar as [[yii\web\View::registerMetaTag()|registerMetaTags()]], you can specify a key when calling -[[yii\web\View::registerLinkTag()|registerLinkTag()]] to avoid generated repeated link tags. +[[yii\web\View::registerMetaTag()|registerMetaTags()]] と同じように、[[yii\web\View::registerLinkTag()|registerLinkTag()]] +を呼ぶときにキーを指定すると、同じリンクタグを繰り返して生成するのを避けることが出来ます。 -## View Events +## ビューのイベント -[[yii\base\View|View components]] trigger several events during the view rendering process. You may respond -to these events to inject content into views or process the rendering results before they are sent to end users. +[[yii\base\View|ビューコンポーネント]] はビューをレンダリングする過程においていくつかのイベントをトリガします。 +これらのイベントに反応することによって、ビューにコンテンツを注入したり、 +エンドユーザに送信される前にレンダリング結果を加工したりすることが出来ます。 -- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: triggered at the beginning of rendering a file - in a controller. Handlers of this event may set [[yii\base\ViewEvent::isValid]] to be false to cancel the rendering process. -- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: triggered after rendering a file by the call of [[yii\base\View::afterRender()]]. - Handlers of this event may obtain the rendering result through [[yii\base\ViewEvent::output]] and may modify - this property to change the rendering result. -- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: triggered by the call of [[yii\base\View::beginPage()]] in layouts. -- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: triggered by the call of [[yii\base\View::endPage()]] in layouts. -- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: triggered by the call of [[yii\web\View::beginBody()]] in layouts. -- [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]]: triggered by the call of [[yii\web\View::endBody()]] in layouts. +- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: コントローラでファイルをレンダリングする前にトリガされます。 + このイベントのハンドラは、[[yii\base\ViewEvent::isValid]] を false にセットして、レンダリングのプロセスをキャンセルすることが出来ます。 +- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: ファイルのレンダリングの後、[[yii\base\View::afterRender()]] を呼ぶことによってトリガされます。 + このイベントのハンドラは、レンダリング結果を [[yii\base\ViewEvent::output]] によって取得することが出来、 + このプロパティを修正してレンダリング結果を変更することが出来ます。 +- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: レイアウトの中で [[yii\base\View::beginPage()]] を呼ぶことによってトリガされます。 +- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: レイアウトの中で [[yii\base\View::endPage()]] を呼ぶことによってトリガされます。 +- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: レイアウトの中で [[yii\web\View::beginBody()]] を呼ぶことによってトリガされます。 +- [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]]: レイアウトの中で [[yii\web\View::endBody()]] を呼ぶことによってトリガされます。 -For example, the following code injects the current date at the end of the page body: +例えば、次のコードはページの body の最後に現在の日付を注入するものです: ```php \Yii::$app->view->on(View::EVENT_END_BODY, function () { @@ -692,12 +694,12 @@ For example, the following code injects the current date at the end of the page ``` -## Rendering Static Pages +## 静的なページをレンダリングする -Static pages refer to those Web pages whose main content are mostly static without the need of accessing -dynamic data pushed from controllers. +静的なページというのは、主たるコンテンツのほとんどが静的なもので、コントローラからプッシュされる動的なデータに +アクセスする必要がないページを指します。 -You can output static pages by putting their code in the view, and then using the code like the following in a controller: +静的なページは、そのコードをビューに置き、そして、コントローラで次のようなコードを使うと表示することが出来ます: ```php public function actionAbout() @@ -706,9 +708,9 @@ public function actionAbout() } ``` -If a Web site contains many static pages, it would be very tedious repeating the similar code many times. -To solve this problem, you may introduce a [standalone action](structure-controllers.md#standalone-actions) -called [[yii\web\ViewAction]] in a controller. For example, +ウェブサイトが多くの静的なページを含んでいる場合、同じようなコードを何度も繰り返すのは非常に面倒くさいでしょう。 +この問題を解決するために、[[yii\web\ViewAction]] という [スタンドアロンアクション](structure-controllers.md#standalone-actions) +をコントローラに導入することが出来ます。例えば、 ```php namespace app\controllers; @@ -728,34 +730,34 @@ class SiteController extends Controller } ``` -Now if you create a view named `about` under the directory `@app/views/site/pages`, you will be able to -display this view by the following URL: +このようにすると、ディレクトリ `@app/views/site/pages` の下に `about` という名前のビューを作成したときに、 +次の URL によってこのビューを表示することが出来るようになります: ``` http://localhost/index.php?r=site/page&view=about ``` -The `GET` parameter `view` tells [[yii\web\ViewAction]] which view is requested. The action will then look -for this view under the directory `@app/views/site/pages`. You may configure [[yii\web\ViewAction::viewPrefix]] -to change the directory for searching these views. +`view` という `GET` パラメータが、どのビューがリクエストされているかを [[yii\web\ViewAction]] に教えます。 +そこで、アクションはこのビューをディレクトリ `@app/views/site/pages` の下で探します。 +[[yii\web\ViewAction::viewPrefix]] を構成して、ビューを探すディレクトリを変更することが出来ます。 -## Best Practices +## 最善の慣行 -Views are responsible for presenting models in the format that end users desire. In general, views +ビューはエンドユーザが望む形式でモデルを表現することに対して責任を持ちます。一般的に、ビューは -* should mainly contain presentational code, such as HTML, and simple PHP code to traverse, format and render data. -* should not contain code that performs DB queries. Such code should be done in models. -* should avoid direct access to request data, such as `$_GET`, `$_POST`. This belongs to controllers. - If request data is needed, they should be pushed into views by controllers. -* may read model properties, but should not modify them. +* 主として表示目的のコードを含むべきです。例えば、HTML、そしてデータをたどり、書式化してレンダリングする簡単な PHP コードなど。 +* DB クエリを実行するコードは含むべきではありません。そのようなコードはモデルの中で実行されるべきです。 +* `$_GET` や `$_POST` のようなリクエストデータに直接アクセスするべきではありません。それはコントローラの仕事です。 + リクエストデータが必要な場合は、コントローラからビューにプッシュされるべきです。 +* モデルのプロパティを読み出すことが出来ます。しかし、それを修正するべきではありません。 -To make views more manageable, avoid creating views that are too complex or contain too much redundant code. -You may use the following techniques to achieve this goal: +ビューを管理しやすいものにするために、複雑すぎるビューや、冗長なコードをあまりに多く含むビューを作ることは避けましょう。 +この目的を達するために、次のテクニックを使うことが出来ます: -* use [layouts](#layouts) to represent common presentational sections (e.g. page header, footer). -* divide a complicated view into several smaller ones. The smaller views can be rendered and assembled into a bigger - one using the rendering methods that we have described. -* create and use [widgets](structure-widgets.md) as building blocks of views. -* create and use helper classes to transform and format data in views. +* 共通の表示セクション (ページのヘッダやフッタなど) を表すために [レイアウト](#layouts) を使う。 +* 複雑なビューはいくつかの小さなビューに分割する。既に説明したレンダリングのメソッドを使えば、 + 小さなビューをレンダリングして大きなビューを組み上げることが出来る。 +* ビューの構成要素として [ウィジェット](structure-widgets.md) を使う。 +* ビューでデータを変換し書式化するためのヘルパークラスを作成して使う。 From 112755989137d97684996a769ca489700ec4a731 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Wed, 5 Nov 2014 21:24:41 +0900 Subject: [PATCH 076/144] docs/guide-ja/structure-controllers.md - small changes [ci skip] --- docs/guide-ja/structure-controllers.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guide-ja/structure-controllers.md b/docs/guide-ja/structure-controllers.md index c199b67..f19863b 100644 --- a/docs/guide-ja/structure-controllers.md +++ b/docs/guide-ja/structure-controllers.md @@ -446,8 +446,8 @@ class SiteController extends Controller 要約すると、コントローラは、 -* [リクエスト](runtime-requests.md) データにアクセスすることが出来る; -* リクエストデータを使って [モデル](structure-models.md) や他のサービスコンポーネントのメソッドを呼ぶことが出来る; -* [ビュー](structure-views.md) を使ってレスポンスを構成することが出来る; -* リクエストデータを処理するべきではない - それは [モデル](structure-models.md) において処理されるべきである; -* HTML を埋め込むなどの表示に関わるコードは避けるべきである - それは [ビュー](structure-views.md) で行う方が良い。 +* [リクエスト](runtime-requests.md) データにアクセスすることが出来ます; +* リクエストデータを使って [モデル](structure-models.md) や他のサービスコンポーネントのメソッドを呼ぶことが出来ます; +* [ビュー](structure-views.md) を使ってレスポンスを構成することが出来ます; +* リクエストされたデータの処理をするべきではありません - データは [モデル](structure-models.md) において処理されるべきです; +* HTML を埋め込むなどの表示に関わるコードは避けるべきです - 表示は [ビュー](structure-views.md) で行う方が良いです。 From 189902b1a7cd72d302a280acd5310a963c69cafa Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Wed, 5 Nov 2014 21:25:10 +0900 Subject: [PATCH 077/144] docs/guide-ja/structure-models.md - small changes [ci skip] --- docs/guide-ja/structure-models.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/guide-ja/structure-models.md b/docs/guide-ja/structure-models.md index 5b62910..f87767e 100644 --- a/docs/guide-ja/structure-models.md +++ b/docs/guide-ja/structure-models.md @@ -470,18 +470,18 @@ public function fields() ## 最善の慣行 モデルは、業務のデータ、規則、ロジックを表わす中心的なオブジェクトです。 -モデルは、他の場所で再利用する必要がよくあります。 +モデルは、さまざまな場所で再利用される必要がよくあります。 良く設計されたアプリケーションでは、通常、モデルは [コントローラ](structure-controllers.md) よりもはるかに重いものになります。 要約すると、モデルは、 -* ビジネスデータを表現する属性を含むことが出来る; -* データの有効性と整合性を保証する検証規則を含むことが出来る; -* ビジネスロジックを実装するメソッドを含むことが出来る; -* リクエスト、セッション、または他の環境データに直接アクセスするべきではない。 - これらのデータは、[コントローラ](structure-controllers.md) によってモデルに注入されるべきである; -* HTML を埋め込むなどの表示用のコードは避けるべきである - これは [ビュー](structure-views.md) で行う方が良い; -* あまりに多くの [シナリオ](#scenarios) を単一のモデルで持つことは避ける。 +* ビジネスデータを表現する属性を含むことが出来ます; +* データの有効性と整合性を保証する検証規則を含むことが出来ます; +* ビジネスロジックを実装するメソッドを含むことが出来ます; +* リクエスト、セッション、または他の環境データに直接アクセスするべきではありません。 + これらのデータは、[コントローラ](structure-controllers.md) によってモデルに注入されるべきです; +* HTML を埋め込むなどの表示用のコードは避けるべきです - 表示は [ビュー](structure-views.md) で行う方が良いです; +* あまりに多くの [シナリオ](#scenarios) を単一のモデルで持つことは避けましょう。 大規模で複雑なシステムを開発するときには、たいてい、上記の最後にあげた推奨事項を考慮するのが良いでしょう。 そういうシステムでは、モデルは数多くの場所で使用され、それに従って、数多くの規則セットやビジネスロジックを含むため、非常に大きくて重いものになり得ます。 @@ -489,11 +489,11 @@ public function fields() モデルのコードの保守性を高めるために、以下の戦略をとることが出来ます: * 異なる [アプリケーション](structure-applications.md) や [モジュール](structure-modules.md) - によって共有される一連の基底モデルクラスを定義する。 - これらのモデルクラスは、すべてで共通に使用される最小限の規則セットとロジックのみを含むべきである。 + によって共有される一連の基底モデルクラスを定義します。 + これらのモデルクラスは、すべてで共通に使用される最小限の規則セットとロジックのみを含むべきです。 * モデルを使用するそれぞれの [アプリケーション](structure-applications.md) または [モジュール](structure-modules.md) において、 - 対応する基底モデルクラスから拡張した具体的なモデルクラスを定義する。 - この具体的なモデルクラスが、そのアプリケーションやモジュールに固有の規則やロジックを含むべきである。 + 対応する基底モデルクラスから拡張した具体的なモデルクラスを定義します。 + この具体的なモデルクラスが、そのアプリケーションやモジュールに固有の規則やロジックを含むべきです。 例えば、[アドバンストアプリケーションテンプレート](tutorial-advanced-app.md) の中で、 基底モデルクラス `common\models\Post` を定義することが出来ます。 From ec48a61cb3af4142b597b0f4168ea628d862f27c Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Wed, 5 Nov 2014 17:14:59 +0200 Subject: [PATCH 078/144] MongoDB PHP extension min version raised up to 1.4.0 --- extensions/mongodb/README.md | 2 +- extensions/mongodb/composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/mongodb/README.md b/extensions/mongodb/README.md index 445962c..20597c9 100644 --- a/extensions/mongodb/README.md +++ b/extensions/mongodb/README.md @@ -7,7 +7,7 @@ This extension provides the [MongoDB](http://www.mongodb.org/) integration for t Installation ------------ -This extension requires [MongoDB PHP Extension](http://us1.php.net/manual/en/book.mongo.php) version 1.3.0 or higher. +This extension requires [MongoDB PHP Extension](http://us1.php.net/manual/en/book.mongo.php) version 1.4.0 or higher. The preferred way to install this extension is through [composer](http://getcomposer.org/download/). diff --git a/extensions/mongodb/composer.json b/extensions/mongodb/composer.json index 142567c..b939fe6 100644 --- a/extensions/mongodb/composer.json +++ b/extensions/mongodb/composer.json @@ -19,7 +19,7 @@ ], "require": { "yiisoft/yii2": "*", - "ext-mongo": ">=1.3.0" + "ext-mongo": ">=1.4.0" }, "autoload": { "psr-4": { "yii\\mongodb\\": "" } From ba68986df0451b4cf31c7c91cb5f31f954a0aa6f Mon Sep 17 00:00:00 2001 From: Vasiliy Baukin Date: Wed, 5 Nov 2014 15:32:42 +0300 Subject: [PATCH 079/144] Update BaseArrayHelper.php Recursive method call must have the same parameters as the first call. --- framework/helpers/BaseArrayHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/helpers/BaseArrayHelper.php b/framework/helpers/BaseArrayHelper.php index 2108717..e06a68d 100644 --- a/framework/helpers/BaseArrayHelper.php +++ b/framework/helpers/BaseArrayHelper.php @@ -462,7 +462,7 @@ class BaseArrayHelper if (is_string($value)) { $d[$key] = htmlspecialchars($value, ENT_QUOTES, $charset); } elseif (is_array($value)) { - $d[$key] = static::htmlEncode($value, $charset); + $d[$key] = static::htmlEncode($value, $valuesOnly, $charset); } } From 3800872bed4468314ee35156baf8285a690f8ad0 Mon Sep 17 00:00:00 2001 From: Vasiliy Baukin Date: Wed, 5 Nov 2014 17:37:28 +0300 Subject: [PATCH 080/144] Update input-validation.md You are validating the data, not users. --- docs/guide/input-validation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/input-validation.md b/docs/guide/input-validation.md index 902374a..7bd8bc5 100644 --- a/docs/guide/input-validation.md +++ b/docs/guide/input-validation.md @@ -1,8 +1,8 @@ Validating Input ================ -As a rule of thumb, you should never trust the data received from end users and should always validate them -before putting them to good use. +As a rule of thumb, you should never trust the data received from end users and should always validate it +before putting it to good use. Given a [model](structure-models.md) populated with user inputs, you can validate the inputs by calling the [[yii\base\Model::validate()]] method. The method will return a boolean value indicating whether the validation From f423f15781322af6771189f15de5f59b8f62f915 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Wed, 5 Nov 2014 11:01:02 -0500 Subject: [PATCH 081/144] Fixes #5925: `ArrayHelper::htmlEncode()` does not work properly when the value being encoded is a nested array --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 61c07fb..8fd1da4 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -17,6 +17,7 @@ Yii Framework 2 Change Log - Bug #5745: Gii and debug modules may cause 404 exception when the route contains dashes (qiangxue) - Bug #5780: `QueryBuilder::batchInsert()` may cause "undefined index" error (qiangxue) - Bug #5833: The `message` command fails with a FK constraint error when trying to update messages (qiangxue) +- Bug #5925: `ArrayHelper::htmlEncode()` does not work properly when the value being encoded is a nested array (tebazil) - Bug: Gii console command help information does not contain global options (qiangxue) - Bug: `yii\web\UrlRule` was unable to create URLs for rules containing unicode characters (samdark) - Enh #5223: Query builder now supports selecting sub-queries as columns (qiangxue) From 001d5b1603161a6d0e8418b310ac3be4c92fd2ea Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Wed, 5 Nov 2014 18:24:20 +0200 Subject: [PATCH 082/144] Fixed `yii\sphinx\QueryBuilder` does not support comparison operators (>,<,>= etc) in where specification --- extensions/sphinx/CHANGELOG.md | 1 + extensions/sphinx/QueryBuilder.php | 69 ++++++++++++----------- tests/unit/extensions/sphinx/ActiveRecordTest.php | 5 ++ 3 files changed, 41 insertions(+), 34 deletions(-) diff --git a/extensions/sphinx/CHANGELOG.md b/extensions/sphinx/CHANGELOG.md index cc40646..2c12cdd 100644 --- a/extensions/sphinx/CHANGELOG.md +++ b/extensions/sphinx/CHANGELOG.md @@ -5,6 +5,7 @@ Yii Framework 2 sphinx extension Change Log ----------------------- - Bug #5601: Simple conditions in Query::where() and ActiveQuery::where() did not allow `yii\db\Expression` to be used as the value (cebe, stevekr) +- Bug #5634: Fixed `yii\sphinx\QueryBuilder` does not support comparison operators (>,<,>= etc) in where specification (klimov-paul) - Enh #5223: Query builder now supports selecting sub-queries as columns (qiangxue) diff --git a/extensions/sphinx/QueryBuilder.php b/extensions/sphinx/QueryBuilder.php index 801cc3f..2049110 100644 --- a/extensions/sphinx/QueryBuilder.php +++ b/extensions/sphinx/QueryBuilder.php @@ -956,6 +956,41 @@ class QueryBuilder extends Object } /** + * Creates an SQL expressions like `"column" operator value`. + * @param IndexSchema[] $indexes list of indexes, which affected by query + * @param string $operator the operator to use. Anything could be used e.g. `>`, `<=`, etc. + * @param array $operands contains two column names. + * @param array $params the binding parameters to be populated + * @return string the generated SQL expression + * @throws InvalidParamException if count($operands) is not 2 + */ + public function buildSimpleCondition($indexes, $operator, $operands, &$params) + { + if (count($operands) !== 2) { + throw new InvalidParamException("Operator '$operator' requires two operands."); + } + + list($column, $value) = $operands; + + if (strpos($column, '(') === false) { + $column = $this->db->quoteColumnName($column); + } + + if ($value === null) { + return "$column $operator NULL"; + } elseif ($value instanceof Expression) { + foreach ($value->params as $n => $v) { + $params[$n] = $v; + } + return "$column $operator {$value->expression}"; + } else { + $phName = self::PARAM_PREFIX . count($params); + $params[$phName] = $value; + return "$column $operator $phName"; + } + } + + /** * @param array $columns * @return string the ORDER BY clause built from [[query]]. */ @@ -1067,40 +1102,6 @@ class QueryBuilder extends Object } /** - * Creates an SQL expressions like `"column" operator value`. - * @param string $operator the operator to use. Anything could be used e.g. `>`, `<=`, etc. - * @param array $operands contains two column names. - * @param array $params the binding parameters to be populated - * @return string the generated SQL expression - * @throws InvalidParamException if count($operands) is not 2 - */ - public function buildSimpleCondition($operator, $operands, &$params) - { - if (count($operands) !== 2) { - throw new InvalidParamException("Operator '$operator' requires two operands."); - } - - list($column, $value) = $operands; - - if (strpos($column, '(') === false) { - $column = $this->db->quoteColumnName($column); - } - - if ($value === null) { - return "$column $operator NULL"; - } elseif ($value instanceof Expression) { - foreach ($value->params as $n => $v) { - $params[$n] = $v; - } - return "$column $operator {$value->expression}"; - } else { - $phName = self::PARAM_PREFIX . count($params); - $params[$phName] = $value; - return "$column $operator $phName"; - } - } - - /** * @param array $indexes index names. * @return IndexSchema[] index schemas. */ diff --git a/tests/unit/extensions/sphinx/ActiveRecordTest.php b/tests/unit/extensions/sphinx/ActiveRecordTest.php index 872f504..e5e2dd8 100644 --- a/tests/unit/extensions/sphinx/ActiveRecordTest.php +++ b/tests/unit/extensions/sphinx/ActiveRecordTest.php @@ -58,6 +58,11 @@ class ActiveRecordTest extends SphinxTestCase $this->assertTrue($article instanceof ArticleIndex); $this->assertEquals(2, $article->id); + // find by comparison + $article = ArticleIndex::find()->where(['>', 'author_id', 1])->one(); + $this->assertTrue($article instanceof ArticleIndex); + $this->assertEquals(2, $article->id); + // find custom column $article = ArticleIndex::find()->select(['*', '(5*2) AS custom_column']) ->where(['author_id' => 1])->one(); From dd0caa3fddbc06d1894adc400c02731097586209 Mon Sep 17 00:00:00 2001 From: Nikola Basic Date: Wed, 5 Nov 2014 17:41:07 +0100 Subject: [PATCH 083/144] Fixed broken link [skip ci] --- docs/guide/db-query-builder.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/db-query-builder.md b/docs/guide/db-query-builder.md index 13026bd..772bf67 100644 --- a/docs/guide/db-query-builder.md +++ b/docs/guide/db-query-builder.md @@ -3,7 +3,7 @@ Query Builder and Query > Note: This section is under development. -Yii provides a basic database access layer as described in the [Database basics](database-basics.md) section. +Yii provides a basic database access layer as described in the [Database basics](db-dao.md) section. The database access layer provides a low-level way to interact with the database. While useful in some situations, it can be tedious and error-prone to write raw SQLs. An alternative approach is to use the Query Builder. The Query Builder provides an object-oriented vehicle for generating queries to be executed. From 1900249861646dee75c205e3aec6f2206d78f987 Mon Sep 17 00:00:00 2001 From: xpardan Date: Thu, 6 Nov 2014 11:54:04 +0800 Subject: [PATCH 084/144] Update structure-views.md --- docs/guide-zh-CN/structure-views.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/structure-views.md b/docs/guide-zh-CN/structure-views.md index f0e7a4b..9468a9e 100644 --- a/docs/guide-zh-CN/structure-views.md +++ b/docs/guide-zh-CN/structure-views.md @@ -610,7 +610,7 @@ $this->registerLinkTag([ ## 渲染静态页面 -静态页面值得是大部分内容为静态的不需要控制器传递动态数据的Web页面。 +静态页面指的是大部分内容为静态的不需要控制器传递动态数据的Web页面。 可将HTML代码放置在视图中,在控制器中使用以下代码输出静态页面: From 2451d8068f892628523768b415f0b31e1fb1aa1b Mon Sep 17 00:00:00 2001 From: pana1990 Date: Thu, 6 Nov 2014 06:53:35 +0100 Subject: [PATCH 085/144] Update README.md [skip ci] --- docs/guide-es/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/guide-es/README.md b/docs/guide-es/README.md index f431ffd..21f57f8 100644 --- a/docs/guide-es/README.md +++ b/docs/guide-es/README.md @@ -49,11 +49,10 @@ Gestión de las peticiones * [Información general](runtime-overview.md) * [Bootstrapping](runtime-bootstrapping.md) -* [Routing](runtime-routing.md) +* [Routing y Creación de las URL](runtime-routing.md) * [Peticiones (Requests)](runtime-requests.md) * [Respuestas (Responses)](runtime-responses.md) * [Sesiones (Sessions) y Cookies](runtime-sessions-cookies.md) -* **TBD** [Procesamiento y generación de las URL](runtime-url-handling.md) * **TBD** [Gestión de errores](runtime-handling-errors.md) * **TBD** [Registro de anotaciones](runtime-logging.md) @@ -126,7 +125,7 @@ Caché * [Caché HTTP](caching-http.md) -Servicios Web RESTful +Servicios Web RESTful --------------------- * **TBD** [Guía breve](rest-quick-start.md) From 4a3c8338f8d554d7d820e0cfa80a4f8e23300563 Mon Sep 17 00:00:00 2001 From: aminking2005 Date: Thu, 6 Nov 2014 10:45:49 +0330 Subject: [PATCH 086/144] Update structure-extensions.md --- docs/guide/structure-extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-extensions.md b/docs/guide/structure-extensions.md index b0d472a..460673b 100644 --- a/docs/guide/structure-extensions.md +++ b/docs/guide/structure-extensions.md @@ -243,7 +243,7 @@ To avoid name collisions and make the classes in your extension autoloadable, yo name the classes in your extension by following the [PSR-4 standard](http://www.php-fig.org/psr/psr-4/) or [PSR-0 standard](http://www.php-fig.org/psr/psr-0/). -You class namespaces should start with `vendorName\extensionName`, where `extensionName` is similar to the project name +Your class namespaces should start with `vendorName\extensionName`, where `extensionName` is similar to the project name in the package name except that it should not contain the `yii2-` prefix. For example, for the `yiisoft/yii2-imagine` extension, we use `yii\imagine` as the namespace its classes. From 38bf6c5ce8003c98998211f853c108eac05960b2 Mon Sep 17 00:00:00 2001 From: RichWeber Date: Thu, 6 Nov 2014 09:41:11 +0200 Subject: [PATCH 087/144] add structure-controllers.md [UK] --- docs/guide-uk/structure-controllers.md | 414 +++++++++++++++++++++++++++++++++ 1 file changed, 414 insertions(+) create mode 100644 docs/guide-uk/structure-controllers.md diff --git a/docs/guide-uk/structure-controllers.md b/docs/guide-uk/structure-controllers.md new file mode 100644 index 0000000..6a0b617 --- /dev/null +++ b/docs/guide-uk/structure-controllers.md @@ -0,0 +1,414 @@ +Контролери +=========== + +Контролери є частиною [MVC](https://ru.wikipedia.org/wiki/Model-View-Controller) архітектури. Це об’єкти класів, успадкованих +від [[yii\base\Controller]] і відповідають за опрацювання запиту і генерації відповіді. По суті, після опрацювання запиту [додатками](structure-applications.md), +контролери проаналізують вхідні дані, передадуть їх в [моделі](structure-models.md), додадуть результати моделі в [представлення](structure-views.md), +і в кінцевому підсумку згенерують вихідні відповіді. + + +## Події + +Контролери складаються з *подій*, які є основними блоками, до яких може звертатись кінцевий користувач і запитувати виконання того або іншого функціоналу. В контролері може бути одна або декілька подій. + +Наступний приклад показує `post` контролер з двома подіями: `view` і `create`: + +```php +namespace app\controllers; + +use Yii; +use app\models\Post; +use yii\web\Controller; +use yii\web\NotFoundHttpException; + +class PostController extends Controller +{ + public function actionView($id) + { + $model = Post::findOne($id); + if ($model === null) { + throw new NotFoundHttpException; + } + + return $this->render('view', [ + 'model' => $model, + ]); + } + + public function actionCreate() + { + $model = new Post; + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', 'id' => $model->id]); + } else { + return $this->render('create', [ + 'model' => $model, + ]); + } + } +} +``` + +В події `view` (визначено методом `actionView()`), код спочатку завантажує [модель](structure-models.md) +згідно запитуваної ID моделі; Якщо модель успішно завантажена, то код відобразить її за допомогою [представлення](structure-views.md) +під назвою `view`. В іншому випадку буде визване виключення. + +В події `create` (визначено методом `actionCreate()`), код аналогічний. Він спочатку намагається завантажити [модель](structure-models.md) за допомогою даних із запиту і зберегти модель. Якщо все пройшло успішно, то код перенаправить браузер на подію `view` з ID щойно створеної моделі. В іншому випадку він відобразить предаставлення `create`, через яке користувач зможе вказати необхідні дані. + + +## Маршрути + +Кінцеві користувачі звертаються до подій з допомогою так названих *маршрутів*. Маршрут це рядок, який складається з наступних частин: + +* ID модуля: він існує, тільки якщо контролер належить не додатку, а [модулю](structure-modules.md); +* ID контролера: рядок, який унікально ідентифікує контролер серед всіх інших контролерів одного і того ж додатка + (або одного й того ж модуля, якщо контролер належить модулю); +* ID події: рядок, який унікально идентифікує подію серед всіх інших подій одного й того ж конторолера. + +Маршрути можуть мати наступний формат: + +``` +ControllerID/ActionID +``` + +або наступний формат, якщо контролер належить модулю: + +```php +ModuleID/ControllerID/ActionID +``` + +Таким чином, якщо користувач звертається до URL `http://hostname/index.php?r=site/index`, то `index` подія в `site` контролері яку буде викликано. +Секція [Маршрутизація](runtime-routing.md) містить більш детальну інформацію про те як маршрути співставляються з подіями. + + +## Створення контролерів + +В [[yii\web\Application|Веб додатках]], контролери мусять бути успадковані від [[yii\web\Controller]] або його потомків. +Аналогічно для [[yii\console\Application|консольних додатків]], контролери мусять бути успадковані від [[yii\console\Controller]] або його потомків. Наступний код визначає `site` контролер: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ +} +``` + + +### ID контролерів + +За звичай контролер зроблений таким чином, що він мусить опрацьовувати запити, які пов’язані з певним ресурсом. +Саме через дані причини, ID контролерів за завичай є іменниками, які посилаються на ресурс, який вони опрацьовують. +Наприклад, ви можете використовувати `article` в якості ID контролера, який відповідає за опрацювання даних публікацій. + +За замовчуванням, ID контролерів мають містити тільки наступні символи: Англійські букви в нижньому регістрі, цифри, підкреслення, +тире и слеш. Наприклад, обидва `article` і `post-comment` є прийнятними ID контролерів, в той час як `article?`, `PostComment`, +`admin\post` не являються такими. + +ID контролерів також можуть містити префікс субдиректорії. Наприклад, в `admin/article` частина `article` є контролером в +субдиректорії `admin` в [[yii\base\Application::controllerNamespace|порсторі імен]]. +Допустимими символами для префіксів субдиректорій є: Англійські букви в нижньому і верхньому регістрі, символи підкреслення і слеш, де слеш використовується в якості розділителя для багатовкладених субдиректорій (наприклад `panels/admin`). + + + +### Правила найменування класів контролерів + +Назви класів контролерів можуть бути отримані з ID контролерів наступними способами: + +* Привести в верхній регістр перший символ в кожному слові, розділеному дефісами. Зверніть увагу що, якщо ID контролера +містить слеш, то дане правило поширюється тільки на частину після останнього слеша в ID контролера; +* Прибрати дефіси і замінити будь-який прямий слеш на зворотний; +* Додати суфікс `Controller`; +* Додати в початок [[yii\base\Application::controllerNamespace|простір імен контролерів]]. + +Нижче наведено декілька прикладів, з урахуванням того, що [[yii\base\Application::controllerNamespace|простір імен контролерів]] має значення за замовчуванням `app\controllers`: + +* `article` відповідає `app\controllers\ArticleController`; +* `post-comment` відповідає `app\controllers\PostCommentController`; +* `admin/post-comment` відповідає `app\controllers\admin\PostCommentController`; +* `adminPanels/post-comment` відповідає `app\controllers\adminPanels\PostCommentController`. + +Класи контролерів мають бути [автозавантаженими](concept-autoloading.md). Саме по цій причині, у вищенаведених прикладах, +контролер `article` має бути збереженим у файл, [псевдонім](concept-aliases.md) якого `@app/controllers/ArticleController.php`; +в той час як контролер `admin/post2-comment` має знаходитись у файлі `@app/controllers/admin/Post2CommentController.php`. + +> Інформація: Останній приклад `admin/post2-comment` показує яким чином ви можете розташувати контролер в директорії + [[yii\base\Application::controllerNamespace|простору імен контролерів]]. Це дуже зручно, коли ви хочете організувати свої контролери в декілька категорій і не хочете використовувати [модулі](structure-modules.md). + + +### Мапа контролерів + +Ви можете налаштувати [[yii\base\Application::controllerMap|Мапу контролерів]] для того, щоб подолати +описані вище обмеження іменування ID контролерів і назв класів. В основному це дуже зручно, коли ви використовуєте +сторонні контролери, іменування яких ви не можете контролювати. + +Ви можете налаштувати [[yii\base\Application::controllerMap|мапу контролерів]] в [налаштуваннях додатка](structure-applications.md#application-configurations) +наступним чином: + +```php +[ + 'controllerMap' => [ + [ + // оголошує "account" контролер, використовуючи назву класу + 'account' => 'app\controllers\UserController', + + // оголошує "article" контролер, використовуючи масив конфігурації + 'article' => [ + 'class' => 'app\controllers\PostController', + 'enableCsrfValidation' => false, + ], + ], + ], +] +``` + +### Контролер за замовчуванням + +Кожний додаток має контролер за замовчуванням, вказаний через властивість [[yii\base\Application::defaultRoute]]. +Коли в запиті не вказаний [маршрут](#ids-routes), тоді буде використаний маршрут вказаний в даній властивості. +Для [[yii\web\Application|Веб додатків]], це значення `'site'`, в той час як для [[yii\console\Application|консольних додатків]], +це `'help'`. Таким чином, якщо вказаний URL `http://hostname/index.php`, це значить, що контролер `site` виконає обробку запиту. + +Ви можете змінити контролер за замовчуванням наступним чином в [налаштуваннях додатку](structure-applications.md#application-configurations): + +```php +[ + 'defaultRoute' => 'main', +] +``` + + +## Створення подій + +Створення подій не містить складнощів також як і оголошення так званих *методов подій* в класі контролера. Метод події це *public* метод, ім’я якого починається за слова `action`. Значення, що повертаються методу події являють собою відповідні дані, які будуть вислані кінцевому користувачу. Наведений нижче код визначає дві події `index` і `hello-world`: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public function actionIndex() + { + return $this->render('index'); + } + + public function actionHelloWorld() + { + return 'Hello World'; + } +} +``` + + +### ID подій + +В основному події розробляються для певної конкретної обробки ресурса. По цій причині, ID подій в основному +є дієсловами, такими як `view`, `update`, і т. д. + +За замовчуванням, ID події повинен містити тільки такі символи: Англійські букви в нижньому регістрі, цифри, +підкреслення і дефіси. Дефіси в ID подій використовуються для поділу слів. Наприклад, `view`, `update2`, `comment-post` є допустимими ID подій, в той час як `view?`, `Update` не являються такими. + +Ви можете створювати події двома способами: вбудовані події і окремі події. Вбудована подія є методом, визначеним +в класі контролера, тоді як окрема подія є екземпляром класу, успадкованого від [[yii\base\Action]] або його потомків. +Вбудовані події вимагають менше зусиль для створення і в основному використовуються якщо у вас немає потреби в повторному використанні подій. +Окремі події, з іншого боку, в основному створюються для використання в різних контролерах або при використанні в [розширеннях](structure-extensions.md). + + +### Вбудовані події + +Вбудовані події це ті події, які визначені в рамках методів контролера, як ми це вже обговорили. + +Назви методів подій можуть бути отримані з ID подій наступним чином: + +* Привести перший символ кожного слова в ID події у верхній регістр; +* Прибрати дефіси; +* Додати префікс `action`. + +Наприклад, `index` відповідає `actionIndex`, а `hello-world` відповідає `actionHelloWorld`. + +> Примітка: Назви імен подій є *регістрозалежними*. Якщо у вас є метод `ActionIndex`, він не буде врахований як метод події, таким чином, запит до події `index` призведе до зображення виключення. Також слід врахувати, що методи подій повинні мати область видимості public. Методи, що мають область видимості private або protected НЕ визначають методи вбудованих подій. + + +Вбудовані події в основному використовуються, тому що для їх створення не потрібного багато зусиль. Тим не менше, якщо ви плануєте повторно використовувати деякі події в різних місцях, або якщо ви хочете перерозподілити події, ви повинні визначити їх як *окремі події*. + + +### Окремі події + +Окремі події визначаються в якості класів, успадкованих від [[yii\base\Action]] або його потомків. +Наприклад, в Yii релізах, присутні [[yii\web\ViewAction]] і [[yii\web\ErrorAction]], обидва з яких є окремими подіями. + +Для використання окремої події, ви маєте вказати її в *мапі подій*, з допомогою перевизначення метода +[[yii\base\Controller::actions()]] у вашому класі контролера, наступним чином: + +```php +public function actions() +{ + return [ + // оголошує "error" подію з допомогою назви класу + 'error' => 'yii\web\ErrorAction', + + // оголошує "view" подію з допомогою конфігураційного масиву + 'view' => [ + 'class' => 'yii\web\ViewAction', + 'viewPrefix' => '', + ], + ]; +} +``` + +Як ви можете бачити, метод `actions()` мусить повернути масив, ключами якого є ID подій, а значенями - відповідні назви класу події або [конфігурація](concept-configurations.md). На відміну від вбудованих подій, ID окремих подій можуть містити довільні символи, до тих пір поки вони визначені в методі `actions()`. + +Для створення окремої події, ви мусите успадкуватись від класу [[yii\base\Action]] або його потомків, і реалізувати +метод `run()` з областю видимості public. Роль метода `run()` аналогічна іншим методам подій. Наприклад, + +```php + + +Значення, що повертається методами подій або методом `run()` окремої події дуже важливе. Воно є результатом +виконання відповідної події. + +Значення, що повертається може бути об’єктом [response](runtime-responses.md), який буде направлений кінцевому користувачу в якості відповіді. + +* Для [[yii\web\Application|Веб додатків]], значення, що повертається також може бути довільними даними, яким будуть + назначені [[yii\web\Response::data]], а потім конвертовані в рядок, що представляє тіло відповіді. +* Для [[yii\console\Application|Консольних додатків]], значення, що повертається також може бути числом, що представляє + [[yii\console\Response::exitStatus|статус виходу]] виконання команди. + +В вищенаведених прикладах, всі результати подій є рядками, які будуть використані в якості тіла відповіді, +висланого користувачеві. Наступний приклад, показує подію, що може перенаправити браузер користувача на новий URL, за допомогою +повернення response об'єкта ([[yii\web\Controller::redirect()|redirect()]] метод повертає response об’єкт): + +```php +public function actionForward() +{ + // перенаправляємо браузер користувача на http://example.com + return $this->redirect('http://example.com'); +} +``` + + +### Параметри подій + +Методи подій для вбудованих подій і методи `run()` для окремих подій можуть приймати параметри, які називають *параметри подій*. Їх значення беруться із запитів. Для [[yii\web\Application|Веб додатків]], значення кожного з параметрів події береться з `$_GET`, використовуючи назву параметра в якості ключа; +для [[yii\console\Application|консольних додатків]], вони відповідають аргументам командної строки. + +В наведеному нижче прикладі, подія `view` (вбудовона подія) визначає два параметра: `$id` і `$version`. + +```php +namespace app\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + public function actionView($id, $version = null) + { + // ... + } +} +``` + +Для різних запитів параметри події будуть визначені наступним чином: + +* `http://hostname/index.php?r=post/view&id=123`: параметр `$id` буде присвоєне значення `'123'`, в той час як `$version` буде мати значення null, так як рядок запиту не містить параметра `version`; +* `http://hostname/index.php?r=post/view&id=123&version=2`: параметрам `$id` і `$version` будуть присвоєні + значення `'123'` і `'2'` відповідно; +* `http://hostname/index.php?r=post/view`: буде вкинуте виключення [[yii\web\BadRequestHttpException]], так як + обов’язковий параметр `$id` не був вказаний в запиті; +* `http://hostname/index.php?r=post/view&id[]=123`: буде вкинуте виключення [[yii\web\BadRequestHttpException]], так як + параметр `$id` отримав невірне значення `['123']`. + +Якщо ви хочите, щою параметр події приймав масив значеннь, ви мусите використовувати type-hint значення `array`, як зображено нажче: + +```php +public function actionView(array $id, $version = null) +{ + // ... +} +``` + +Тепер, якщо запит буде містити URL `http://hostname/index.php?r=post/view&id[]=123`, то параметр `$id` отримає значення +`['123']`. Якщо запит буде містити URL `http://hostname/index.php?r=post/view&id=123`, то параметр `$id` все рівно буде містити масив, так як скалярне значення `'123'` буде автоматично сконвертовано в масив. + +Вищенаведені приклади в основному показують як параметри подій працюють для Веб додатків. Більше інформації +про параметри консольних додатків наведено в секції [Консольні команди](tutorial-console.md). + + +### Події за замовчуванням + +Кожний контролер містить події, визначені через властивість [[yii\base\Controller::defaultAction]]. +Коли [маршрут](#ids-routes) містить тільки ID контролера, то розуміється, що було запрошено подію контролера за замовчуванням. + +За замовчуванням, ця подія має значення `index`. Якщо ви хочите змінити це значення, просто перевизначте дану властивість в класі контролера наступним чином: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public $defaultAction = 'home'; + + public function actionHome() + { + return $this->render('home'); + } +} +``` + + +## Життєвий цикл контролера + +При опрацюванні запиту, [додаток](structure-applications.md) створить контролер, базуючись на +запрошеному [маршруті](#routes). Для виконання запиту, контролер пройде через наступні етапи життєвого циклу: + +1. Метод [[yii\base\Controller::init()]] буде викликаний після того як контролер буде створений і сконфігурований; +2. Контролер створить об’єкт події, базуючись на запрошеному ID події: + * Якщо ID події не вказано, то буде використано [[yii\base\Controller::defaultAction|ID події за замовчуванням]]; + * Якщо ID події знайдено в [[yii\base\Controller::actions()|мапі подій]], то буде створено окрему подію; + * Якщо ID події відповідає методу події, то буде створено вбудовану подію; + * В іншому випадку, буде вкинуте виключення [[yii\base\InvalidRouteException]]. +3. Контролер послідовно викликає метод `beforeAction()` додатка, модуля (якщо контролер належить модулю) і + самого контролера. + * Якщо один із методів повернув `false`, то решта, невикликані методи `beforeAction` будуть пропущені, а виконання події буде відмінено; + * За замовчуванням, кожний виклик метода `beforeAction()` викликає подію `beforeAction`, на яку ви можете призначити обробників. +4. Контролер запускає подію: + * Параметри події будуть проаналізовані і заповнені з даних запиту. +5. Контролер послідовно викликає методи `afterAction` контролера, модуля (якщо контролер належить модулю) і додатка. + * За замовчуванням, кожний виклик метода `afterAction()` викликає подію `afterAction`, на яку ви можете призначити обробників. +6. Додаток, отримавши результат виконання події, присвоює його об’єкту [response](runtime-responses.md). + + +## Кращі практики + +В добре організованих додатках, контролери за звичай дуже тонкі, і містять лише декілька рядків коду. +Якщо ваш контролер дуже складний, це за звичай означає, що вам потрібно провести рефакторинг його і перенести будь-який код в інші місце. + +В цілому, контролери + +* можуть мати доступ до даних [запиту](runtime-requests.md); +* можуть викликати методи [моделей](structure-models.md) і інших компонентів системи з даними запиту; +* можуть використовувати [представлення](structure-views.md) для формування відповіді; +* не повинні займатись опрацюванням даних, це має відбуватись в [моделях](structure-models.md); +* мають уникати використання HTML або іншої розмітки, краще це робити в [представленнях](structure-views.md). From 8848d76918d1290efe4e46fa24d54cfa6a1bdc64 Mon Sep 17 00:00:00 2001 From: Tomoki Morita Date: Thu, 6 Nov 2014 21:18:35 +0900 Subject: [PATCH 088/144] Add docs/guide-ja/caching-*.md [ci skip] --- docs/guide-ja/caching-data.md | 288 ++++++++++++++++++++++++++++++++++++ docs/guide-ja/caching-fragment.md | 140 ++++++++++++++++++ docs/guide-ja/caching-http.md | 105 +++++++++++++ docs/guide-ja/caching-overview.md | 13 ++ docs/guide-ja/caching-page.md | 32 ++++ docs/internals/translation-teams.md | 1 + 6 files changed, 579 insertions(+) create mode 100644 docs/guide-ja/caching-data.md create mode 100644 docs/guide-ja/caching-fragment.md create mode 100644 docs/guide-ja/caching-http.md create mode 100644 docs/guide-ja/caching-overview.md create mode 100644 docs/guide-ja/caching-page.md diff --git a/docs/guide-ja/caching-data.md b/docs/guide-ja/caching-data.md new file mode 100644 index 0000000..7462783 --- /dev/null +++ b/docs/guide-ja/caching-data.md @@ -0,0 +1,288 @@ +データキャッシュ +============ + +データキャッシュは PHP の変数をキャッシュに格納し、あとでキャッシュからそれらを読み込みます。 +[クエリキャッシュ](#query-caching) や [ページキャッシュ](caching-page.md) などのより高度なキャッシュ機能の基礎でもあります。 + +以下はデータキャッシュの典型的な利用パターンを示したコードです。`$cache` は [キャッシュコンポーネント](#cache-components) を指します: + +```php +// キャッシュから $data を取得しようと試みる +$data = $cache->get($key); + +if ($data === false) { + + // キャッシュの中に $data が見つからない場合は一から作る + + // 次回はそれを取得できるように $data をキャッシュに格納する + $cache->set($key, $data); +} + +// $data はここで利用できる +``` + + +## キャッシュコンポーネント + +データキャッシュはメモリ、ファイル、データベースなどさまざまなキャッシュストレージを表す、いわゆるキャッシュコンポーネントに依存しています。 + +キャッシュコンポーネントは通常グローバルに設定しアクセスできるように [アプリケーションコンポーネント](structure-application-components.md) として登録されています。以下のコードは [Memcached](http://memcached.org/) を使い 2 つのキャッシュサーバを用いて、`cache` コンポーネントをどのように設定するかを示したものです: + +```php +'components' => [ + 'cache' => [ + 'class' => 'yii\caching\MemCache', + 'servers' => [ + [ + 'host' => 'server1', + 'port' => 11211, + 'weight' => 100, + ], + [ + 'host' => 'server2', + 'port' => 11211, + 'weight' => 50, + ], + ], + ], +], +``` + +上記のキャッシュコンポーネントには `Yii::$app->cache` でアクセスできます。 + +すべてのキャッシュコンポーネントは同じ API がセットされているので、アプリケーションのコンフィグレーション側で設定しなおせば、キャッシュを使っているコードに変更を加えなくても、異なるキャッシュコンポーネントに入れ替えることができます。例えば上記の設定を [[yii\caching\ApcCache|APC キャッシュ]] に変更する場合は以下のようにします: + + +```php +'components' => [ + 'cache' => [ + 'class' => 'yii\caching\ApcCache', + ], +], +``` + +> ヒント: キャッシュコンポーネントは複数登録することができます。`cache` という名前のコンポーネントはキャッシュに依存したクラスによってデフォルトで使用されています (例えば [[yii\web\UrlManager]] など) 。 + + +### サポートされているキャッシュストレージ + +Yii はさまざまなキャッシュストレージをサポートしています。以下は概要です: + +* [[yii\caching\ApcCache]]: PHP の [APC](http://php.net/manual/ja/book.apc.php) 拡張モジュールを使用します。集中型の分厚いアプリケーションのキャッシュを扱うときには最速の一つとして考えることができます (例えば、サーバが 1 台であったり、専用のロードバランサを持っていない、など) 。 +* [[yii\caching\DbCache]]: キャッシュされたデータを格納するためにデータベースのテーブルを使用します。このキャッシュを使用するには [[yii\caching\DbCache::cacheTable]] で指定したテーブルを作成する必要があります。 +* [[yii\caching\DummyCache]]: 実際にはキャッシュを行わない、キャッシュの代替を提供します。このコンポーネントの目的は、キャッシュが利用できることをチェックするためのコードを簡略化することです。たとえば、開発中やサーバに実際のキャッシュサポートがない場合に、このキャッシュコンポーネントを使用することができます。そして、実際のキャッシュサポートが有効になったときに、対応するキャッシュコンポーネントに切替えて使用します。 どちらの場合も、`Yii::$app->cache` が null かも知れないと心配せずに、データを取得するために同じコード `Yii::$app->cache->get($key)` を使用できます。 +* [[yii\caching\FileCache]]: キャッシュされたデータを保存するために標準ファイルを使用します。これはページコンテンツなど大きなかたまりのデータに特に適しています。 +* [[yii\caching\MemCache]]: PHP の [Memcache](http://php.net/manual/ja/book.memcache.php) と [Memcached](http://php.net/manual/ja/book.memcached.php) 拡張モジュールを使用します。分散型のアプリケーションでキャッシュを扱うときには最速の一つとして考えることができます (例えば、複数台のサーバ構成であったり、ロードバランサなど) 。 +* [[yii\redis\Cache]]: [Redis](http://redis.io/) の key-value ストアに基づいてキャッシュコンポーネントを実装しています。(Redis の バージョン 2.6.12 以降が必要です) 。 +* [[yii\caching\WinCache]]: PHP の [WinCache](http://iis.net/downloads/microsoft/wincache-extension) ([関連リンク](http://php.net/manual/ja/book.wincache.php)) 拡張モジュールを使用します。 +* [[yii\caching\XCache]]: PHP の [XCache](http://xcache.lighttpd.net/) 拡張モジュールを使用します。 +* [[yii\caching\ZendDataCache]]: キャッシュメディアして [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm) を使用します。 + +> ヒント: 同じアプリケーション内で異なるキャッシュを使用することもできます。一般的なやり方として、小さくとも常に使用されるデータ (例えば、統計データなど) を格納する場合はメモリベースのキャッシュストレージを使用し、大きくて使用頻度の低いデータを格納する場合はファイルベース、またはデータベースのキャッシュストレージを使用します (例えば、ページコンテンツなど) 。 + + +## キャッシュ API + +すべてのキャッシュコンポーネントが同じ基底クラス [[yii\caching\Cache]] を持っているので、以下の API をサポートしています。 + +* [[yii\caching\Cache::get()|get()]]: 指定されたキーを用いてキャッシュからデータを取得します。キャッシュが見つからないか、もしくは有効期限が切れていたり無効になっている場合は false を返します。 +* [[yii\caching\Cache::set()|set()]]: キーによって識別されたデータをキャッシュに格納します。 +* [[yii\caching\Cache::add()|add()]]: キーがキャッシュ内で見つからない場合に、キーによって識別されたデータをキャッシュに格納します。 +* [[yii\caching\Cache::mget()|mget()]]: 指定されたキーを用いてキャッシュから複数のデータを取得します。 +* [[yii\caching\Cache::mset()|mset()]]: キャッシュに複数のデータを格納します。各データはキーによって識別されます。 +* [[yii\caching\Cache::madd()|madd()]]: キャッシュに複数のデータを格納します。各データはキーによって識別されます。もしキャッシュ内にキーがすでに存在する場合はスキップされます。 +* [[yii\caching\Cache::exists()|exists()]]: 指定されたキーがキャッシュ内で見つかったかどうかを示す値を返します。 +* [[yii\caching\Cache::delete()|delete()]]: キャッシュからキーによって識別されるデータを削除します。 +* [[yii\caching\Cache::flush()|flush()]]: キャッシュからすべてのデータを削除します。 + +> 注意: [[yii\caching\Cache::get()|get()]] メソッドは、データがキャッシュ内に見つからないことを示すために戻り値として false を使用しているので、直接 boolean 型の `false` をキャッシュしないでください。代わり、配列内に `false` を置いてキャッシュすることによって、この問題を回避できます。 + +キャッシュされたデータを取得する際に発生するオーバーヘッドを減すために、MemCache, APC などのいくつかのキャッシュストレージはバッチモードで複数のキャッシュされた値の取得をサポートしています。[[yii\caching\Cache::mget()|mget()]] や [[yii\caching\Cache::madd()|madd()]] などの API はこの機能を十分に引き出すために提供されています。基礎となるキャッシュストレージがこの機能をサポートしていない場合には、シミュレートされます。 + +[[yii\caching\Cache]] は `ArrayAccess` インターフェイスを継承しているので、キャッシュコンポーネントは配列のように扱うことができます。以下はいくつかの例です: + +```php +$cache['var1'] = $value1; // $cache->set('var1', $value1); と同等 +$value2 = $cache['var2']; // $value2 = $cache->get('var2'); と同等 +``` + + +### キャッシュのキーについて + +キャッシュに格納される各データは、一意のキーによって識別されるため、キャッシュ内にデータを格納するときはキーを指定する必要があります。あとでキャッシュからデータを取得するときは、それに対応するキーを用意する、といった感じです。 + +文字列またはキャッシュのキーとして、任意の値を使用することができます。キーが文字列でない場合は、自動的に文字列にシリアライズされます。 + +キャッシュのキーを定義する一般的なやり方として、配列に決定要素を単位としてすべて含めることです。 +例えば [[yii\db\Schema]] はデータベースのテーブルに関するキャッシュスキーマ情報に以下のキーを使用しています: + +```php +[ + __CLASS__, // クラス名 + $this->db->dsn, // データベース接続のデータソース名 + $this->db->username, // データベース接続のログインユーザ + $name, // テーブル名 +]; +``` + +見ての通り、キーは一意にデータベースのテーブルを指定するために必要なすべての情報が含まれています。 + +同じキャッシュストレージが異なるアプリケーションによって使用されているときは、キャッシュのキーの競合を避けるために、各アプリケーションではユニークなキーの接頭辞を指定する必要があります。これは [[yii\caching\Cache::keyPrefix]] プロパティを設定することでできます。例えば、アプリケーションのコンフィギュレーションで以下のように書くことができます: + +```php +'components' => [ + 'cache' => [ + 'class' => 'yii\caching\ApcCache', + 'keyPrefix' => 'myapp', // ユニークなキャッシュのキーの接頭辞 + ], +], +``` + +相互運用性を確保するために、英数字のみを使用する必要があります。 + + +### キャッシュの有効期限 + +キャッシュに格納されたデータは、いくつかのキャッシュポリシー (例えば、キャッシュスペースがいっぱいになったときは最も古いデータが削除される、など) の実施で除去されない限り、永遠に残り続けます。この動作を変えるために [[yii\caching\Cache::set()|set()]] で有効期限パラメータを指定することができます。パラメータはキャッシュ内に何秒間有効であるかを示します。[[yii\caching\Cache::get()|get()]] でデータを取得する際に有効期限が切れていた場合は、キャッシュ内にデータが見つからなかったことを示す false が返されます。例えば、 + +```php +// 最大で 45 秒間キャッシュ内にデータを保持する +$cache->set($key, $data, 45); + +sleep(50); + +$data = $cache->get($key); +if ($data === false) { + // $data は有効期限が切れているか、またはキャッシュ内に見つからない +} +``` + + +### キャッシュの依存関係 + + +有効期限の設定に加えて、キャッシュされたデータにはいわゆる *キャッシュの依存関係* の変化によって無効にすることもできます。例えば [[yii\caching\FileDependency]] はファイルの更新時刻の依存関係を表しています。依存関係が変更されたときに、対応するファイルが更新されることを意味しています。その結果、キャッシュ内で見つかった古いファイルのコンテンツは、無効とされるべきであり [[yii\caching\Cache::get()|get()]] は false を返します。 + +キャッシュの依存関係は [[yii\caching\Dependency]] 子孫クラスのオブジェクトとして表現されます。[[yii\caching\Cache::set()|set()]] でキャッシュにデータを格納する際に、関連するキャッシュの依存関係を知らせることができます。例えば、 + +```php +// example.txt ファイルの変更時間への依存関係を作成 +$dependency = new \yii\caching\FileDependency(['fileName' => 'example.txt']); + +// データは 30 秒で期限切れになります +// さらに、依存関係にあるファイルが変更された場合、有効期限内でも無効になります +$cache->set($key, $data, 30, $dependency); + +// データが有効期限切れの場合はキャッシュがチェックされます +// 関連する依存関係が変更された場合にもチェックします +// これらの条件のいずれかが満たされている場合は false を返します +$data = $cache->get($key); +``` + +以下は利用可能なキャッシュの依存関係の概要です: + +- [[yii\caching\ChainedDependency]]: チェーン上のいずれかの依存関係が変更された場合、依存関係が変更されます。 +- [[yii\caching\DbDependency]]: 指定された SQL 文のクエリ結果が変更された場合、依存関係が変更されます。 +- [[yii\caching\ExpressionDependency]]: 指定されたPHPの式の結果が変更された場合、依存関係が変更されます。 +- [[yii\caching\FileDependency]]: ファイルの最終更新時刻が変更された場合、依存関係が変更されます。 +- [[yii\caching\TagDependency]]: 一つまたは複数のタグを持つキャッシュされたデータを関連付けます。[[yii\caching\TagDependency::invalidate()]] を呼び出すことによって指定されたタグ(複数可)と、キャッシュされたデータを無効にすることができます。 + + +## クエリキャッシュ + +クエリキャッシュは、データキャッシュ上に構築された特別なキャッシュ機能で、データベースのクエリ結果をキャッシュするために提供されています。 + +クエリキャッシュは [[yii\db\Connection|データベース接続]] と有効な `cache` コンポーネントを必要とします。 +`$db` を [[yii\db\Connection]] のインスタンスと仮定した場合、クエリキャッシュの基本的な使い方は以下のようになります: + +```php +$result = $db->cache(function ($db) { + + // クエリキャッシュが有効で、かつクエリ結果がキャッシュ内にある場合、 + // SQL クエリ結果がキャッシュから提供されます + return $db->createCommand('SELECT * FROM customer WHERE id=1')->queryOne(); + +}); +``` +クエリキャッシュは [DAO](db-dao.md) だけではなく [アクティブレコード](db-active-record.md) でも使用することができます。 + +> 情報: いくつかの DBMS (例えば [MySQL](http://dev.mysql.com/doc/refman/5.1/ja/query-cache.html)) でもデータベースのサーバサイドのクエリキャッシュをサポートしています。どちらのクエリキャッシュメカニズムも選べますが、前述した Yii のクエリキャッシュを使用することによって、キャッシュの依存関係を柔軟に指定できたり、潜在的にもより効率的でしょう。 + + +### 設定 + +クエリキャッシュは [[yii\db\Connection]] を通して 3 つのグローバルな設定可能オプションがあります: + +* [[yii\db\Connection::enableQueryCache|enableQueryCache]]: クエリキャッシュを可能にするかどうか。デフォルトは true。実効的にクエリキャッシュをオンにするには [[yii\db\Connection::queryCache|queryCache]] によって指定し、さらに有効なキャッシュを持っている必要があることに注意してください。 +* [[yii\db\Connection::queryCacheDuration|queryCacheDuration]]: これはクエリ結果がキャッシュ内に有効な状態として維持できる秒数を表します。クエリキャッシュを永遠にキャッシュに残したい場合は 0 を指定することができます。このプロパティは [[yii\db\Connection::cache()]] の持続時間を指定せず呼び出されたときに使用されるデフォルト値です。 +* [[yii\db\Connection::queryCache|queryCache]]: これはキャッシュコンポーネントの ID を表します。デフォルトは `'cache'`。有効なキャッシュコンポーネントが存在する場合にのみ、クエリキャッシュが使用可能になります。 + + +### 使い方 + +クエリキャッシュを使用する必要がある複数の SQL クエリを持っている場合は [[yii\db\Connection::cache()]] を使用することができます。使い方としては以下のように、 + +```php +$duration = 60; // クエリ結果を 60 秒間 キャッシュ +$dependency = ...; // 依存関係のオプション + +$result = $db->cache(function ($db) { + + // ... ここで SQL クエリを実行します ... + + return $result; + +}, $duration, $dependency); +``` + +無名関数内の任意の SQL クエリは、指定した依存関係とともに指定された期間キャッシュされます。もしキャッシュ内に有効なクエリ結果が見つかった場合、クエリはスキップされ、その結果、代わりにキャッシュから提供されます。`$duration` の指定がない場合 [[yii\db\Connection::queryCacheDuration|queryCacheDuration]] で指定されている値が使用されます。 + +また、`cache()` 内でいくつかの特定のクエリに対してクエリキャッシュを無効にすることもできます。この場合 [[yii\db\Connection::noCache()]] を使用します。 + + +```php +$result = $db->cache(function ($db) { + + // クエリキャッシュを使用する SQL クエリ + + $db->noCache(function ($db) { + + // クエリキャッシュを使用しない SQL クエリ + + }); + + // ... + + return $result; +}); +``` + +単一のクエリのためにクエリキャッシュを使用する場合は、コマンドを構築するときに [[yii\db\Command::cache()]] を呼び出すことができます。例えば、 + +```php +// クエリキャッシュを使い、期間を 60 秒にセットする +$customer = $db->createCommand('SELECT * FROM customer WHERE id=1')->cache(60)->queryOne(); +``` + +また、ひとつのコマンドでクエリキャッシュを無効にするために [[yii\db\Command::noCache()]] を使用することもできます。例えば、 + +```php +$result = $db->cache(function ($db) { + + // クエリキャッシュを使用する SQL クエリ + + // このコマンドはクエリキャッシュを使用しない + $customer = $db->createCommand('SELECT * FROM customer WHERE id=1')->noCache()->queryOne(); + + // ... + + return $result; +}); +``` + + +### 制約 + +リソースハンドルを返すようなクエリにはクエリキャッシュは働きません。例えばいくつかの DBMS において BLOB 型のカラムを用いる場合、クエリ結果はカラムデータについてリソースハンドルを返します。 + +いくつかのキャッシュストレージはサイズに制約があります。例えば Memcache では、各エントリのサイズは 1MB が上限値です。そのためクエリ結果のサイズがこの制約を越える場合、キャッシュは失敗します。 diff --git a/docs/guide-ja/caching-fragment.md b/docs/guide-ja/caching-fragment.md new file mode 100644 index 0000000..9ed9158 --- /dev/null +++ b/docs/guide-ja/caching-fragment.md @@ -0,0 +1,140 @@ +フラグメントキャッシュ +================ + +フラグメントキャッシュは、ウェブページの断片をキャッシュすることを言います。例えば、ページ内の表に年間販売の概要が表示されている場合、リクエスト毎にこの表を生成するのにかかる時間を削減するために、キャッシュにこの表を格納することができます。フラグメントキャッシュは [データキャッシュ](caching-data.md) 上に構築されています。 + +フラグメントキャッシュを使用するには [ビュー](structure-views.md) で以下の構文を使用します: + +```php +if ($this->beginCache($id)) { + + // ... ここに生成するコンテンツを書く ... + + $this->endCache(); +} +``` + +つまり [[yii\base\View::beginCache()|beginCache()]] と [[yii\base\View::endCache()|endCache()]] をペアにして囲み、その中にコンテンツ生成ロジックを書いていきます。コンテンツがキャッシュ内で見つかった場合、キャッシュされたコンテンツをレンダリングし [[yii\base\View::beginCache()|beginCache()]] は false を返します。結果として、コンテンツ生成ロジックはスキップされます。それ以外の場合はコンテンツ生成ロジックが呼ばれ、そして [[yii\base\View::endCache()|endCache()]] が呼ばれたとき生成されたコンテンツがキャプチャされ、キャッシュに格納されます。 + +[データキャッシュ](caching-data.md) と同様に、キャッシュされたコンテンツを識別するためにユニークな `$id` が必要になります。 + + +## キャッシュのオプション + +[[yii\base\View::beginCache()|beginCache()]] メソッドの 2 番目のパラメータを配列にすることで、フラグメントキャッシュに関する追加のオプションを指定することもできます。裏で、この配列のオプションは実際にフラグメントキャッシュ機能を実装している [[yii\widgets\FragmentCache]] ウィジェットを構成するために使用されます。 + +### 持続時間 + + +おそらくフラグメントキャッシュで通常よく使われるであろうオプションは [[yii\widgets\FragmentCache::duration|duration]] でしょう。このオプションにはコンテンツがどれだけの時間キャッシュ内において有効であるかを指定します。以下のコードは最大で 1 時間コンテンツの断片をキャッシュします: + +```php +if ($this->beginCache($id, ['duration' => 3600])) { + + // ... ここに生成するコンテンツを書く ... + + $this->endCache(); +} +``` + +オプションがセットされていない場合は、デフォルトである 60 が使われ、つまり有効期限が 60 秒間のキャッシュされたコンテンツを意味します。 + + +### 依存関係 + +[データキャッシュ](caching-data.md#cache-dependencies) と同様に、キャッシュされたコンテンツの断片は依存関係を持つことができます。例えば、表示されている投稿の内容は、投稿が変更されたか否かに依存する、といった具合です。 + +依存関係を指定するには [[yii\widgets\FragmentCache::dependency|dependency]] オプションに [[yii\caching\Dependency]] オブジェクトを指定するか、または依存関係オブジェクトを作成するための配列構成を指定します。以下のコードはコンテンツの断片が `updated_at` カラムの値の変化に依存していることを指定しています: + +```php +$dependency = [ + 'class' => 'yii\caching\DbDependency', + 'sql' => 'SELECT MAX(updated_at) FROM post', +]; + +if ($this->beginCache($id, ['dependency' => $dependency])) { + + // ... ここに生成するコンテンツを書く ... + + $this->endCache(); +} +``` + + +### バリエーション + +キャッシュされたコンテンツはいくつかのパラメータによって変化させることもできます。例えば、複数の言語をサポートしているウェブアプリケーションに対して、ビューコードの同じ部分を、異なる言語で生成することができます。現在のアプリケーションの言語に応じて、キャッシュされたコンテンツに変更を加えるといったことが可能になります。 + +キャッシュのバリエーションを指定するには [[yii\widgets\FragmentCache::variations|variations]] オプションに配列で、それぞれが特定のバリエーションの要素を表すスカラー値をセットします。例えば、言語によってキャッシュされたコンテンツを変化させるには、以下のコードを使うことができます: + +```php +if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) { + + // ... ここに生成するコンテンツを書く ... + + $this->endCache(); +} +``` + + +### トグルキャッシュ + +また、ある条件が満たされた場合にのみフラグメントキャッシュを有効にすることもできます。たとえば、フォームが表示されているページに対して、最初の (GET リクエストによる) リクエストの場合だけはキャッシュしたいと思いますが、その後の (POST リクエストによる) フォームの表示では、フォームにユーザ入力が含まれている可能性があるため、キャッシュをすべきではありません。これを行うには、以下のように [[yii\widgets\FragmentCache::enabled|enabled]] オプションをセットします: + +```php +if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) { + + // ... ここに生成するコンテンツを書く ... + + $this->endCache(); +} +``` + + +## キャッシュのネスト + +フラグメントキャッシュはネストすることができます。つまり、キャッシュされる断片を、より大きなキャッシュされる断片で囲むことができます。例えば、コメントが内側のフラグメントキャッシュ内にキャッシュされ、それらが外側のフラグメントキャッシュに記事内容と一緒にキャッシュされます。以下のコードは 2 つのフラグメントキャッシュをどのようにネストできるかを示したものです: + +```php +if ($this->beginCache($id1)) { + + // ...コンテンツ生成ロジック... + + if ($this->beginCache($id2, $options2)) { + + // ...コンテンツ生成ロジック... + + $this->endCache(); + } + + // ...コンテンツ生成ロジック... + + $this->endCache(); +} +``` + +ネストされたキャッシュには、異なるキャッシュオプションを設定することができます。 たとえば、上記の例における内側のキャッシュと外側のキャッシュに対して、異なる持続期間の値を設定する事が可能です。 これによって、外側のキャッシュでキャッシュされたデータが無効になった場合でも、内側のキャッシュが有効な内側の断片を提供することが可能になります。 しかし、その逆は真ではありません。 外側のキャッシュが有効であると判断された場合には、内側のキャッシュが無効になった後でも、外側のキャッシュが古くなったコンテンツのコピーを提供し続けます。 ネストされたキャッシュの持続時間や依存関係の設定を間違うと、無効になった内側のキャッシュデータが外側のキャッシュに残り続けることになるので、注意が必要です。 + + +## ダイナミックコンテンツ + +フラグメントキャッシュを使用する際、出力全体が比較的静的で、一ヶ所ないし数ヶ所だけが例外的に動的であるというような状況に遭遇します。例えば、ページ上部にはメインメニューバーと現在のユーザの名前とが一緒に表示される場合があります。他には、リクエスト毎に実行しなければいけない PHP のコードが含まれている場合(例えば、アセットバンドルを登録するためのコード)などです。この両方の問題は、いわゆる *ダイナミックコンテンツ* 機能によって解決することができます。 + +ダイナミックコンテンツは、それがフラグメントキャッシュの中に含まれていても、キャッシュすべきではない出力の部分を意味します。コンテンツを常に動的にするためには、外側のコンテンツがキャッシュから提供されている場合でも、すべてのリクエストに対して、いくつかのPHP コードを実行することにより生成しなければいけません。 + +以下のように、ダイナミックコンテンツを目的の場所に挿入するには、キャッシュされた断片内で [[yii\base\View::renderDynamic()]] を呼び出します。 + +```php +if ($this->beginCache($id1)) { + + // ...コンテンツ生成ロジック... + + echo $this->renderDynamic('return Yii::$app->user->identity->name;'); + + // ...コンテンツ生成ロジック... + + $this->endCache(); +} +``` + +[[yii\base\View::renderDynamic()|renderDynamic()]] メソッドはパラメータとして PHP コードの一部を使用します。PHP コードの戻り値は、ダイナミックコンテンツとして扱われます。同じ PHP コードはすべてのリクエストに対して実行されますが、囲まれている断片がキャッシュから提供されているか否かは問いません。 diff --git a/docs/guide-ja/caching-http.md b/docs/guide-ja/caching-http.md new file mode 100644 index 0000000..a5e473a --- /dev/null +++ b/docs/guide-ja/caching-http.md @@ -0,0 +1,105 @@ +HTTP キャッシュ +============ + +前の節で説明したサーバーサイドのキャッシュに加えて、ウェブアプリケーションは、同じページコンテンツを生成し送信する時間を節約するために、クライアントサイドでもキャッシュを利用することができます。 + +クライアントサイドのキャッシュを使用するには、レンダリング結果をキャッシュできるように、コントローラアクションのフィルタとして [[yii\filters\HttpCache]] を設定します。[[yii\filters\HttpCache]] は `GET` と `HEAD` リクエストに対してのみ動作し、また、それらのリクエストは 3 種類のキャッシュ関連の HTTP ヘッダを扱うことができます: + +* [[yii\filters\HttpCache::lastModified|Last-Modified]] +* [[yii\filters\HttpCache::etagSeed|Etag]] +* [[yii\filters\HttpCache::cacheControlHeader|Cache-Control]] + + +## `Last-Modified` ヘッダ + +`Last-Modified` ヘッダは、クライアントがそれをキャッシュする時から、ページが変更されたかどうかを示すために、タイムスタンプを使用しています。 + +`Last-Modified` ヘッダの送信を有効にするには [[yii\filters\HttpCache::lastModified]] プロパティを、ページの変更時間に関する UNIX タイムスタンプを返す PHP の callable 型で、以下のようなシグネチャで構成していきます。 + +```php +/** + * @param Action $action 現在扱っているアクションオブジェクト + * @param array $params "params" プロパティの値 + * @return integer ページの更新時刻を表す UNIX タイムスタンプ + */ +function ($action, $params) +``` + +以下は `Last-Modified` ヘッダを使用する例です: + +```php +public function behaviors() +{ + return [ + [ + 'class' => 'yii\filters\HttpCache', + 'only' => ['index'], + 'lastModified' => function ($action, $params) { + $q = new \yii\db\Query(); + return $q->from('post')->max('updated_at'); + }, + ], + ]; +} +``` + +上記のコードは `index` アクションでのみ HTTP キャッシュを有効にしている状態です。投稿の最終更新時刻に基づいて `Last-Modified` を生成する必要があります。ブラウザが初めて `index` ページにアクセスすると、ページはサーバ上で生成されブラウザに送信されます。もしブラウザが再度同じページにアクセスし、その期間中に投稿に変更がない場合は、ブラウザはクライアントサイドにキャッシュしたものを使用するので、サーバはページを再生成することはありません。その結果、サーバサイドのレンダリング処理とページコンテンツの送信は両方ともスキップされます。 + + +## `ETag` ヘッダ + +"Entity Tag" (略して `ETag`) ヘッダはページコンテンツを表すためにハッシュを使用します。ページが変更された場合ハッシュも同様に変更されます。サーバサイドで生成されたハッシュとクライアントサイドで保持しているハッシュを比較することによって、ページが変更されたかどうか、また再送信するべきかどうかを決定します。 + +`ETag` ヘッダの送信を有効にするには [[yii\filters\HttpCache::etagSeed]] プロパティを設定します。プロパティは ETag のハッシュを生成するためのシードを返す PHP の callable 型で、以下のようなシグネチャで構成していきます。 + +```php +/** + * @param Action $action 現在扱っているアクションオブジェクト + * @param array $params "params" プロパティの値 + * @return string ETag のハッシュを生成するためのシードとして使用する文字列 + */ +function ($action, $params) +``` + +以下は `ETag` ヘッダを使用している例です: + +```php +public function behaviors() +{ + return [ + [ + 'class' => 'yii\filters\HttpCache', + 'only' => ['view'], + 'etagSeed' => function ($action, $params) { + $post = $this->findModel(\Yii::$app->request->get('id')); + return serialize([$post->title, $post->content]); + }, + ], + ]; +} +``` + +上記のコードは `view` アクションでのみ HTTP キャッシュを有効にしている状態です。リクエストされた投稿のタイトルとコンテンツに基づいて HTTP の `Etag` ヘッダを生成しています。ブラウザが初めて `view` ページにアクセスするときに、ページがサーバ上で生成されブラウザに送信されます。ブラウザが再度同じページにアクセスし、投稿のタイトルやコンテンツに変更がない場合には、サーバはページを再生成せず、ブラウザはクライアントサイトにキャッシュしたものを使用します。その結果、サーバサイドのレンダリング処理とページコンテンツ送信の両方ともスキップされます。 + +ETag は `Last-Modified` ヘッダよりも複雑かつ、より正確なキャッシング方式を可能にします。例えば、サイトが別のテーマに切り替わった場合には ETag を無効化する、といったことができます。 + +ETag はリクエスト毎に再評価する必要があるため、負荷の高いもの生成すると `HttpCache` の本来の目的を損なって不必要なオーバーヘッドが生じる場合があるので、ページのコンテンツが変更されたときにキャッシュを無効化するための式は単純なものを指定するようにして下さい。 + +> 注意: [RFC 7232](http://tools.ietf.org/html/rfc7232#section-2.4) に準拠して `Etag` と `Last-Modified` ヘッダの両方を設定した場合、`HttpCache` はその両方とも送信します。また、もし `If-None-Match` ヘッダと `If-Modified-Since` ヘッダの両方を送信した場合は前者のみが尊重されます。 + +## `Cache-Control` ヘッダ + +`Cache-Control` ヘッダはページのための一般的なキャッシュポリシーを指定します。ヘッダ値に [[yii\filters\HttpCache::cacheControlHeader]] プロパティを設定することで、それを送ることができます。デフォルトでは、以下のヘッダーが送信されます: + +``` +Cache-Control: public, max-age=3600 +``` + +## セッションキャッシュリミッタ + +ページでセッションを使用している場合、PHP はいくつかのキャッシュ関連の HTTP ヘッダ(PHP の設定ファイル内で指定されている session.cache_limiter など)を自動的に送信します。これらのヘッダは `HttpCache` で妨害したり、必要なキャッシュを無効にしたりできます。この動作を変更したい場合は [[yii\filters\HttpCache::sessionCacheLimiter]] プロパティを設定します。プロパティには `public`、`private`、`private_no_expire`、そして `nocache` などの文字列の値を使用することができます。これらの値についての説明は [session_cache_limiter()](http://www.php.net/manual/ja/function.session-cache-limiter.php) を参照してください。 + + +## SEO への影響 + +検索エンジンのボットはキャッシュヘッダを尊重する傾向があります。 クローラの中には、一定期間内に処理するドメインごとのページ数に制限を持っているものもあるため、キャッシュヘッダを導入して、処理の必要があるページ数を減らしてやると、サイトのインデックスの作成を促進できるかも知れません。 diff --git a/docs/guide-ja/caching-overview.md b/docs/guide-ja/caching-overview.md new file mode 100644 index 0000000..fa955df --- /dev/null +++ b/docs/guide-ja/caching-overview.md @@ -0,0 +1,13 @@ +キャッシュ +======= + +ウェブアプリケーションのパフォーマンスを向上させるための簡単で効果的な方法としてキャッシュというものがあります。比較的静的なデータをキャッシュに格納し、必要に応じてキャッシュからそれらを取得することによって、アプリケーションは一からデータを生成するのに必要な時間を節約することができます。 + +キャッシュはさまざまなレベルのものを、アプリケーション内のさまざまな場所で使用することができます。例えばサーバサイドでの低いレベルでは、データベースから取得した最新の記事情報リストのような基本的なデータを格納するために使用したり、高いレベルでは、レンダリング結果の一部分、最新の記事であったり、またウェブページ全体を格納するためなどにも使用できます。クライアントサイドでは、ブラウザのキャッシュに最近訪れたことのあるページの内容を格納するために HTTP キャッシュを使用することもできます。 + +Yii では以下のリストに挙げられているキャッシュ機構をサポートしています: + +* [データキャッシュ](caching-data.md) +* [フラグメントキャッシュ](caching-fragment.md) +* [ページキャッシュ](caching-page.md) +* [HTTP キャッシュ](caching-http.md) diff --git a/docs/guide-ja/caching-page.md b/docs/guide-ja/caching-page.md new file mode 100644 index 0000000..7f779fc --- /dev/null +++ b/docs/guide-ja/caching-page.md @@ -0,0 +1,32 @@ +ページキャッシュ +============ + +ページキャッシュはサーバサイドでページ全体のコンテンツをキャッシュすることを言います。あとで、同じページに再度リクエストがあった場合、その内容を一から再び生成させるのではなく、キャッシュから提供するようにします。 + +ページキャッシュは [[yii\filters\PageCache]]、 [アクションフィルタ](structure-filters.md) によってサポートされています。これは、コントローラクラスで以下のように使用することができます: + +```php +public function behaviors() +{ + return [ + [ + 'class' => 'yii\filters\PageCache', + 'only' => ['index'], + 'duration' => 60, + 'variations' => [ + \Yii::$app->language, + ], + 'dependency' => [ + 'class' => 'yii\caching\DbDependency', + 'sql' => 'SELECT COUNT(*) FROM post', + ], + ], + ]; +} +``` + +上記のコードは、ページキャッシュが `index` アクションのみで使用され、そのページのコンテンツは最大 60 秒間キャッシュし、現在のアプリケーションの言語によって変化し、投稿の総数に変化があった場合キャッシュされたページが無効になる、ということを示しています。 + +見てわかるように、ページキャッシュは [フラグメントキャッシュ](caching-fragment.md) ととてもよく似ています。それらは両方とも `duration`、`dependencies`、`variations`、そして `enabled` などのオプションをサポートしています。主な違いとしては、ページキャッシュは [アクションフィルタ](structure-filters.md) として、フラグメントキャッシュは [ウィジェット](structure-widgets.md) として実装されているということです。 + +また、ページキャッシュと一緒に [ダイナミックコンテンツ](caching-fragment.md#dynamic-content) だけでなく [フラグメントキャッシュ](caching-fragment.md) も使用することができます。 diff --git a/docs/internals/translation-teams.md b/docs/internals/translation-teams.md index b0d780f..61604b5 100644 --- a/docs/internals/translation-teams.md +++ b/docs/internals/translation-teams.md @@ -39,6 +39,7 @@ Japanese ------- - Nobuo Kihara 木原伸夫, [@softark](https://github.com/softark), softark@gmail.com +- Tomoki Morita, [@jamband](https://github.com/jamband), tmsongbooks215@gmail.com Russian ------- From 5dffd72c58bc88b2db05ea4e9782491c7b087838 Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Thu, 6 Nov 2014 14:40:33 +0200 Subject: [PATCH 089/144] Added support for 'findAndModify' operation at `yii\mongodb\Query` and `yii\mongodb\ActiveQuery` --- extensions/mongodb/ActiveQuery.php | 81 +++++++++++++--------- extensions/mongodb/CHANGELOG.md | 1 + extensions/mongodb/Query.php | 77 +++++++++++++++----- tests/unit/extensions/mongodb/ActiveRecordTest.php | 12 ++++ tests/unit/extensions/mongodb/QueryRunTest.php | 21 ++++++ 5 files changed, 144 insertions(+), 48 deletions(-) diff --git a/extensions/mongodb/ActiveQuery.php b/extensions/mongodb/ActiveQuery.php index e296a4b..baecc79 100644 --- a/extensions/mongodb/ActiveQuery.php +++ b/extensions/mongodb/ActiveQuery.php @@ -135,21 +135,8 @@ class ActiveQuery extends Query implements ActiveQueryInterface { $cursor = $this->buildCursor($db); $rows = $this->fetchRows($cursor); - if (!empty($rows)) { - $models = $this->createModels($rows); - if (!empty($this->with)) { - $this->findWith($this->with, $models); - } - if (!$this->asArray) { - foreach ($models as $model) { - $model->afterFind(); - } - } - return $models; - } else { - return []; - } + return $this->populate($rows); } /** @@ -164,24 +151,30 @@ class ActiveQuery extends Query implements ActiveQueryInterface { $row = parent::one($db); if ($row !== false) { - if ($this->asArray) { - $model = $row; - } else { - /* @var $class ActiveRecord */ - $class = $this->modelClass; - $model = $class::instantiate($row); - $class::populateRecord($model, $row); - } - if (!empty($this->with)) { - $models = [$model]; - $this->findWith($this->with, $models); - $model = $models[0]; - } - if (!$this->asArray) { - $model->afterFind(); - } + $models = $this->populate([$row]); + return reset($models) ?: null; + } else { + return null; + } + } - return $model; + /** + * Performs 'findAndModify' query and returns a single row of result. + * Warning: in case 'new' option is set to 'false' (which is by default) usage of this method may lead + * to unexpected behavior at some Active Record features, because object will be populated by outdated data. + * @param array $update update criteria + * @param array $options list of options in format: optionName => optionValue. + * @param Connection $db the Mongo connection used to execute the query. + * @return ActiveRecord|array|null the original document, or the modified document when $options['new'] is set. + * Depending on the setting of [[asArray]], the query result may be either an array or an ActiveRecord object. + * Null will be returned if the query results in nothing. + */ + public function oneWithUpdate($update, $options = [], $db = null) + { + $row = parent::oneWithUpdate($update, $options, $db); + if ($row !== null) { + $models = $this->populate([$row]); + return reset($models) ?: null; } else { return null; } @@ -205,4 +198,30 @@ class ActiveQuery extends Query implements ActiveQueryInterface return $db->getCollection($this->from); } + + /** + * Converts the raw query results into the format as specified by this query. + * This method is internally used to convert the data fetched from MongoDB + * into the format as required by this query. + * @param array $rows the raw query result from MongoDB + * @return array the converted query result + */ + public function populate($rows) + { + if (empty($rows)) { + return []; + } + + $models = $this->createModels($rows); + if (!empty($this->with)) { + $this->findWith($this->with, $models); + } + if (!$this->asArray) { + foreach ($models as $model) { + $model->afterFind(); + } + } + + return $models; + } } diff --git a/extensions/mongodb/CHANGELOG.md b/extensions/mongodb/CHANGELOG.md index 5319376..6993630 100644 --- a/extensions/mongodb/CHANGELOG.md +++ b/extensions/mongodb/CHANGELOG.md @@ -5,6 +5,7 @@ Yii Framework 2 mongodb extension Change Log ----------------------- - Enh #3855: Added debug toolbar panel for MongoDB (klimov-paul) +- Enh #5592: Added support for 'findAndModify' operation at `yii\mongodb\Query` and `yii\mongodb\ActiveQuery` (klimov-paul) 2.0.0 October 12, 2014 diff --git a/extensions/mongodb/Query.php b/extensions/mongodb/Query.php index 32cb2f9..3239e04 100644 --- a/extensions/mongodb/Query.php +++ b/extensions/mongodb/Query.php @@ -102,24 +102,9 @@ class Query extends Component implements QueryInterface */ protected function buildCursor($db = null) { - if ($this->where === null) { - $where = []; - } else { - $where = $this->where; - } - $selectFields = []; - if (!empty($this->select)) { - foreach ($this->select as $fieldName) { - $selectFields[$fieldName] = true; - } - } - $cursor = $this->getCollection($db)->find($where, $selectFields); + $cursor = $this->getCollection($db)->find($this->composeCondition(), $this->composeSelectFields()); if (!empty($this->orderBy)) { - $sort = []; - foreach ($this->orderBy as $fieldName => $sortOrder) { - $sort[$fieldName] = $sortOrder === SORT_DESC ? \MongoCollection::DESCENDING : \MongoCollection::ASCENDING; - } - $cursor->sort($sort); + $cursor->sort($this->composeSort()); } $cursor->limit($this->limit); $cursor->skip($this->offset); @@ -214,6 +199,23 @@ class Query extends Component implements QueryInterface } /** + * Performs 'findAndModify' query and returns a single row of result. + * @param array $update update criteria + * @param array $options list of options in format: optionName => optionValue. + * @param Connection $db the Mongo connection used to execute the query. + * @return array|null the original document, or the modified document when $options['new'] is set. + */ + public function oneWithUpdate($update, $options = [], $db = null) + { + $collection = $this->getCollection($db); + if (!empty($this->orderBy)) { + $options['sort'] = $this->composeSort(); + } + + return $collection->findAndModify($this->composeCondition(), $update, $this->composeSelectFields(), $options); + } + + /** * Returns the number of records. * @param string $q kept to match [[QueryInterface]], its value is ignored. * @param Connection $db the Mongo connection used to execute the query. @@ -353,4 +355,45 @@ class Query extends Component implements QueryInterface return $result; } } + + /** + * Composes condition from raw [[where]] value. + * @return array conditions. + */ + private function composeCondition() + { + if ($this->where === null) { + return []; + } else { + return $this->where; + } + } + + /** + * Composes select fields from raw [[select]] value. + * @return array select fields. + */ + private function composeSelectFields() + { + $selectFields = []; + if (!empty($this->select)) { + foreach ($this->select as $fieldName) { + $selectFields[$fieldName] = true; + } + } + return $selectFields; + } + + /** + * Composes sort specification from raw [[orderBy]] value. + * @return array sort specification. + */ + private function composeSort() + { + $sort = []; + foreach ($this->orderBy as $fieldName => $sortOrder) { + $sort[$fieldName] = $sortOrder === SORT_DESC ? \MongoCollection::DESCENDING : \MongoCollection::ASCENDING; + } + return $sort; + } } diff --git a/tests/unit/extensions/mongodb/ActiveRecordTest.php b/tests/unit/extensions/mongodb/ActiveRecordTest.php index ee94e99..49eed80 100644 --- a/tests/unit/extensions/mongodb/ActiveRecordTest.php +++ b/tests/unit/extensions/mongodb/ActiveRecordTest.php @@ -263,4 +263,16 @@ class ActiveRecordTest extends MongoDbTestCase $this->assertNotEmpty($rowRefreshed); $this->assertEquals(7, $rowRefreshed->status); } + + public function testFindOneWithUpdate() + { + $searchName = 'name7'; + $newName = 'new name'; + + $customer = Customer::find() + ->where(['name' => $searchName]) + ->oneWithUpdate(['$set' => ['name' => $newName]], ['new' => true]); + $this->assertTrue($customer instanceof Customer); + $this->assertEquals($newName, $customer->name); + } } diff --git a/tests/unit/extensions/mongodb/QueryRunTest.php b/tests/unit/extensions/mongodb/QueryRunTest.php index 8c49ab2..9f26894 100644 --- a/tests/unit/extensions/mongodb/QueryRunTest.php +++ b/tests/unit/extensions/mongodb/QueryRunTest.php @@ -211,6 +211,27 @@ class QueryRunTest extends MongoDbTestCase $this->assertEquals($rows, $rowsUppercase); } + public function testOneWithUpdate() + { + $connection = $this->getConnection(); + + $query = new Query(); + + $searchName = 'name5'; + $newName = 'new name'; + $row = $query->from('customer') + ->where(['name' => $searchName]) + ->oneWithUpdate(['$set' => ['name' => $newName]], ['new' => false], $connection); + $this->assertEquals($searchName, $row['name']); + + $searchName = 'name7'; + $newName = 'new name'; + $row = $query->from('customer') + ->where(['name' => $searchName]) + ->oneWithUpdate(['$set' => ['name' => $newName]], ['new' => true], $connection); + $this->assertEquals($newName, $row['name']); + } + /** * @see https://github.com/yiisoft/yii2/issues/4879 * From 7c078ccb12835b6457d2e5ea166bfb2c341ac14f Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Wed, 5 Nov 2014 23:14:43 +0900 Subject: [PATCH 090/144] docs/guide-ja/structure-modules.md - preparation for translation [ci skip] --- docs/guide-ja/structure-modules.md | 255 +++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 docs/guide-ja/structure-modules.md diff --git a/docs/guide-ja/structure-modules.md b/docs/guide-ja/structure-modules.md new file mode 100644 index 0000000..af37c2b --- /dev/null +++ b/docs/guide-ja/structure-modules.md @@ -0,0 +1,255 @@ +Modules +======= + +Modules are self-contained software units that consist of [models](structure-models.md), [views](structure-views.md), +[controllers](structure-controllers.md), and other supporting components. End users can access the controllers +of a module when it is installed in [application](structure-applications.md). For these reasons, modules are +often viewed as mini-applications. Modules differ from [applications](structure-applications.md) in that +modules cannot be deployed alone and must reside within applications. + + +## Creating Modules + +A module is organized as a directory which is called the [[yii\base\Module::basePath|base path]] of the module. +Within the directory, there are sub-directories, such as `controllers`, `models`, `views`, which hold controllers, +models, views, and other code, just like in an application. The following example shows the content within a module: + +``` +forum/ + Module.php the module class file + controllers/ containing controller class files + DefaultController.php the default controller class file + models/ containing model class files + views/ containing controller view and layout files + layouts/ containing layout view files + default/ containing view files for DefaultController + index.php the index view file +``` + + +### Module Classes + +Each module should have a unique module class which extends from [[yii\base\Module]]. The class should be located +directly under the module's [[yii\base\Module::basePath|base path]] and should be [autoloadable](concept-autoloading.md). +When a module is being accessed, a single instance of the corresponding module class will be created. +Like [application instances](structure-applications.md), module instances are used to share data and components +for code within modules. + +The following is an example how a module class may look like: + +```php +namespace app\modules\forum; + +class Module extends \yii\base\Module +{ + public function init() + { + parent::init(); + + $this->params['foo'] = 'bar'; + // ... other initialization code ... + } +} +``` + +If the `init()` method contains a lot of code initializing the module's properties, you may also save them in terms +of a [configuration](concept-configurations.md) and load it with the following code in `init()`: + +```php +public function init() +{ + parent::init(); + // initialize the module with the configuration loaded from config.php + \Yii::configure($this, require(__DIR__ . '/config.php')); +} +``` + +where the configuration file `config.php` may contain the following content, similar to that in an +[application configuration](structure-applications.md#application-configurations). + +```php + [ + // list of component configurations + ], + 'params' => [ + // list of parameters + ], +]; +``` + + +### Controllers in Modules + +When creating controllers in a module, a convention is to put the controller classes under the `controllers` +sub-namespace of the namespace of the module class. This also means the controller class files should be +put in the `controllers` directory within the module's [[yii\base\Module::basePath|base path]]. +For example, to create a `post` controller in the `forum` module shown in the last subsection, you should +declare the controller class like the following: + +```php +namespace app\modules\forum\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + // ... +} +``` + +You may customize the namespace of controller classes by configuring the [[yii\base\Module::controllerNamespace]] +property. In case when some of the controllers are out of this namespace, you may make them accessible +by configuring the [[yii\base\Module::controllerMap]] property, similar to [what you do in an application](structure-applications.md#controller-map). + + +### Views in Modules + +Views in a module should be put in the `views` directory within the module's [[yii\base\Module::basePath|base path]]. +For views rendered by a controller in the module, they should be put under the directory `views/ControllerID`, +where `ControllerID` refers to the [controller ID](structure-controllers.md#routes). For example, if +the controller class is `PostController`, the directory would be `views/post` within the module's +[[yii\base\Module::basePath|base path]]. + +A module can specify a [layout](structure-views.md#layouts) that is applied to the views rendered by the module's +controllers. The layout should be put in the `views/layouts` directory by default, and you should configure +the [[yii\base\Module::layout]] property to point to the layout name. If you do not configure the `layout` property, +the application's layout will be used instead. + + +## Using Modules + +To use a module in an application, simply configure the application by listing the module in +the [[yii\base\Application::modules|modules]] property of the application. The following code in the +[application configuration](structure-applications.md#application-configurations) uses the `forum` module: + +```php +[ + 'modules' => [ + 'forum' => [ + 'class' => 'app\modules\forum\Module', + // ... other configurations for the module ... + ], + ], +] +``` + +The [[yii\base\Application::modules|modules]] property takes an array of module configurations. Each array key +represents a *module ID* which uniquely identifies the module among all modules in the application, and the corresponding +array value is a [configuration](concept-configurations.md) for creating the module. + + +### Routes + +Like accessing controllers in an application, [routes](structure-controllers.md#routes) are used to address +controllers in a module. A route for a controller within a module must begin with the module ID followed by +the controller ID and action ID. For example, if an application uses a module named `forum`, then the route +`forum/post/index` would represent the `index` action of the `post` controller in the module. If the route +only contains the module ID, then the [[yii\base\Module::defaultRoute]] property, which defaults to `default`, +will determine which controller/action should be used. This means a route `forum` would represent the `default` +controller in the `forum` module. + + +### Accessing Modules + +Within a module, you may often need to get the instance of the [module class](#module-classes) so that you can +access the module ID, module parameters, module components, etc. You can do so by using the following statement: + +```php +$module = MyModuleClass::getInstance(); +``` + +where `MyModuleClass` refers to the name of the module class that you are interested in. The `getInstance()` method +will return the currently requested instance of the module class. If the module is not requested, the method will +return null. Note that You do not want to manually create a new instance of the module class because it will be +different from the one created by Yii in response to a request. + +> Info: When developing a module, you should not assume the module will use a fixed ID. This is because a module + can be associated with an arbitrary ID when used in an application or within another module. In order to get + the module ID, you should use the above approach to get the module instance first, and then get the ID via + `$module->id`. + +You may also access the instance of a module using the following approaches: + +```php +// get the child module whose ID is "forum" +$module = \Yii::$app->getModule('forum'); + +// get the module to which the currently requested controller belongs +$module = \Yii::$app->controller->module; +``` + +The first approach is only useful when you know the module ID, while the second approach is best used when you +know about the controllers being requested. + +Once getting hold of a module instance, you can access parameters or components registered with the module. For example, + +```php +$maxPostCount = $module->params['maxPostCount']; +``` + + +### Bootstrapping Modules + +Some modules may need to be run for every request. The [[yii\debug\Module|debug]] module is such an example. +To do so, list the IDs of such modules in the [[yii\base\Application::bootstrap|bootstrap]] property of the application. + +For example, the following application configuration makes sure the `debug` module is always load: + +```php +[ + 'bootstrap' => [ + 'debug', + ], + + 'modules' => [ + 'debug' => 'yii\debug\Module', + ], +] +``` + + +## Nested Modules + +Modules can be nested in unlimited levels. That is, a module can contain another module which can contain yet +another module. We call the former *parent module* while the latter *child module*. Child modules must be declared +in the [[yii\base\Module::modules|modules]] property of their parent modules. For example, + +```php +namespace app\modules\forum; + +class Module extends \yii\base\Module +{ + public function init() + { + parent::init(); + + $this->modules = [ + 'admin' => [ + // you should consider using a shorter namespace here! + 'class' => 'app\modules\forum\modules\admin\Module', + ], + ]; + } +} +``` + +For a controller within a nested module, its route should include the IDs of all its ancestor module. +For example, the route `forum/admin/dashboard/index` represents the `index` action of the `dashboard` controller +in the `admin` module which is a child module of the `forum` module. + +> Info: The [[yii\base\Module::getModule()|getModule()]] method only returns the child module directly belonging +to its parent. The [[yii\base\Application::loadedModules]] property keeps a list of loaded modules, including both +direct children and nested ones, indexed by their class names. + + +## Best Practices + +Modules are best used in large applications whose features can be divided into several groups, each consisting of +a set of closely related features. Each such feature group can be developed as a module which is developed and +maintained by a specific developer or team. + +Modules are also a good way of reusing code at the feature group level. Some commonly used features, such as +user management, comment management, can all be developed in terms of modules so that they can be reused easily +in future projects. From 563df39d76a7337dd81be03f33f018103faffd59 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 6 Nov 2014 23:02:05 +0900 Subject: [PATCH 091/144] docs/guide-ja/structure-modules.md completed [ci skip] --- docs/guide-ja/structure-modules.md | 223 +++++++++++++++++++------------------ 1 file changed, 115 insertions(+), 108 deletions(-) diff --git a/docs/guide-ja/structure-modules.md b/docs/guide-ja/structure-modules.md index af37c2b..6ff45ae 100644 --- a/docs/guide-ja/structure-modules.md +++ b/docs/guide-ja/structure-modules.md @@ -1,41 +1,44 @@ -Modules -======= +モジュール +========== -Modules are self-contained software units that consist of [models](structure-models.md), [views](structure-views.md), -[controllers](structure-controllers.md), and other supporting components. End users can access the controllers -of a module when it is installed in [application](structure-applications.md). For these reasons, modules are -often viewed as mini-applications. Modules differ from [applications](structure-applications.md) in that -modules cannot be deployed alone and must reside within applications. +モジュールは、[モデル](structure-models.md)、[ビュー](structure-views.md)、[コントローラ](structure-controllers.md)、 +およびその他の支援コンポーネントから構成される自己充足的なソフトウェアのユニットです。 +モジュールが [アプリケーション](structure-applications.md) にインストールされている場合、 +エンドユーザはモジュールのコントローラにアクセスする事が出来ます。これらのことを理由として、 +モジュールは小さなアプリケーションと見なされることがよくあります。しかし、モジュールは単独では配置できず、 +アプリケーションの中に存在しなければならないという点で [アプリケーション](structure-applications.md) とは異なります。 -## Creating Modules +## モジュールを作成する -A module is organized as a directory which is called the [[yii\base\Module::basePath|base path]] of the module. -Within the directory, there are sub-directories, such as `controllers`, `models`, `views`, which hold controllers, -models, views, and other code, just like in an application. The following example shows the content within a module: +モジュールは、モジュールの [[yii\base\Module::basePath|ベースパス]] と呼ばれるディレクトリとして組織されます。 +このディレクトリの中に、ちょうどアプリケーションの場合と同じように、`controllers`、`models`、`views` +のようなサブディレクトリが存在して、コントローラ、モデル、ビュー、その他のコードを収納しています。 +次の例は、モジュール内の中身を示すものです: ``` forum/ - Module.php the module class file - controllers/ containing controller class files - DefaultController.php the default controller class file - models/ containing model class files - views/ containing controller view and layout files - layouts/ containing layout view files - default/ containing view files for DefaultController - index.php the index view file + Module.php モジュールクラスファイル + controllers/ コントローラクラスファイルを含む + DefaultController.php デフォルトのコントローラクラスファイル + models/ モデルクラスファイルを含む + views/ コントローラのビューとレイアウトのファイルを含む + layouts/ レイアウトのビューファイルを含む + default/ DefaultController のためのビューファイルを含む + index.php index ビューファイル ``` -### Module Classes +### モジュールクラス -Each module should have a unique module class which extends from [[yii\base\Module]]. The class should be located -directly under the module's [[yii\base\Module::basePath|base path]] and should be [autoloadable](concept-autoloading.md). -When a module is being accessed, a single instance of the corresponding module class will be created. -Like [application instances](structure-applications.md), module instances are used to share data and components -for code within modules. +全てのモジュールは [[yii\base\Module]] から拡張したユニークなモジュールクラスを持たなければなりません。 +モジュールクラスは、モジュールの [[yii\base\Module::basePath|ベースパス]] 直下に配置されて +[オートロード可能](concept-autoloading.md) になっていなければなりません。 +モジュールがアクセスされたとk、対応するモジュールクラスの単一のインスタンスが作成されます。 +[アプリケーションのインスタンス](structure-applications.md) と同じように、モジュールのインスタンスは +モジュール内のコードがデータとコンポーネントを共有するために使用されます。 -The following is an example how a module class may look like: +次のコードは、モジュールクラスがどのように見えるかを示す例です: ```php namespace app\modules\forum; @@ -47,46 +50,48 @@ class Module extends \yii\base\Module parent::init(); $this->params['foo'] = 'bar'; - // ... other initialization code ... + // ... 他の初期化コード ... } } ``` -If the `init()` method contains a lot of code initializing the module's properties, you may also save them in terms -of a [configuration](concept-configurations.md) and load it with the following code in `init()`: +`init` メソッドがモジュールのプロパティを初期化するためのコードをたくさん含む場合は、それを +[コンフィギュレーション](concept-configurations.md) の形で保存し、`init()` の中で次のコードを使って +読み出すことも可能です: ```php public function init() { parent::init(); - // initialize the module with the configuration loaded from config.php + // config.php からロードしたコンフィギュレーションでモジュールを初期化する \Yii::configure($this, require(__DIR__ . '/config.php')); } ``` -where the configuration file `config.php` may contain the following content, similar to that in an -[application configuration](structure-applications.md#application-configurations). +ここで、コンフィギュレーションファイル `config.php` は、 +[アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の場合と同じように、 +次のような内容を含むことが出来ます。 ```php [ - // list of component configurations + // コンポーネントのコンフィギュレーションのリスト ], 'params' => [ - // list of parameters + // パラメータのリスト ], ]; ``` -### Controllers in Modules +### モジュール内のコントローラ -When creating controllers in a module, a convention is to put the controller classes under the `controllers` -sub-namespace of the namespace of the module class. This also means the controller class files should be -put in the `controllers` directory within the module's [[yii\base\Module::basePath|base path]]. -For example, to create a `post` controller in the `forum` module shown in the last subsection, you should -declare the controller class like the following: +モジュールの中でコントローラを作成するときは、コントローラクラスをモジュールクラスの名前空間の `controllers` +サブ名前空間に置くことが規約です。このことは、同時に、コントローラのクラスファイルをモジュールの +[[yii\base\Module::basePath|ベースパス]] 内の `controllers` ディレクトリに置くべきことをも意味します。 +例えば、前の項で示された `forum` モジュールの中で `post` コントローラを作成するためには、次のようにして +コントローラを宣言しなければなりません: ```php namespace app\modules\forum\controllers; @@ -99,103 +104,105 @@ class PostController extends Controller } ``` -You may customize the namespace of controller classes by configuring the [[yii\base\Module::controllerNamespace]] -property. In case when some of the controllers are out of this namespace, you may make them accessible -by configuring the [[yii\base\Module::controllerMap]] property, similar to [what you do in an application](structure-applications.md#controller-map). +コントローラクラスの名前空間は、[[yii\base\Module::controllerNamespace]] プロパティを構成してカスタマイズすることが出来ます。 +いくつかのコントローラがこの名前空間の外にある場合でも、[[yii\base\Module::controllerMap]] プロパティを構成することによって、 +それらをアクセス可能にすることが出来ます。これは、[アプリケーションでのコントローラマップ](structure-applications.md#controller-map) +の場合と同様です。 -### Views in Modules +### モジュール内のビュー -Views in a module should be put in the `views` directory within the module's [[yii\base\Module::basePath|base path]]. -For views rendered by a controller in the module, they should be put under the directory `views/ControllerID`, -where `ControllerID` refers to the [controller ID](structure-controllers.md#routes). For example, if -the controller class is `PostController`, the directory would be `views/post` within the module's -[[yii\base\Module::basePath|base path]]. +モジュール内のビューは、モジュールの [[yii\base\Module::basePath|ベースパス]] 内の `views` ディレクトリに置かれなくてはなりません。 +モジュール内のコントローラによってレンダリングされるビューは、ディレクトリ `views/ControllerID` の下に置きます。ここで、 +`ControllerID` は [コントローラ ID](structure-controllers.md#routes) を指します。例えば、コントローラクラスが `PostController` +である場合、ディレクトリはモジュールの [[yii\base\Module::basePath|ベースパス]] の中の `views/post` となります。 -A module can specify a [layout](structure-views.md#layouts) that is applied to the views rendered by the module's -controllers. The layout should be put in the `views/layouts` directory by default, and you should configure -the [[yii\base\Module::layout]] property to point to the layout name. If you do not configure the `layout` property, -the application's layout will be used instead. +モジュールは、そのモジュールのコントローラによってレンダリングされるビューに適用される [レイアウト](structure-views.md#layouts) +を指定することが出来ます。レイアウトは、既定では `views/layouts` ディレクトリに置かれなければならず、また、 +[[yii\base\Module::layout]] プロパティがレイアウトの名前を指すように構成しなければなりません。 +`layout` プロパティを構成しない場合は、アプリケーションのレイアウトが代りに使用されます。 -## Using Modules +## モジュールを使う -To use a module in an application, simply configure the application by listing the module in -the [[yii\base\Application::modules|modules]] property of the application. The following code in the -[application configuration](structure-applications.md#application-configurations) uses the `forum` module: +アプリケーションの中でモジュールを使うためには、アプリケーションの [[yii\base\Application::modules|modules]] プロパティのリストに +そのモジュールを載せてアプリケーションを構成するだけで大丈夫です。次のコードは、 +[アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の中で +`forum` モジュールを使うようにするものです: ```php [ 'modules' => [ 'forum' => [ 'class' => 'app\modules\forum\Module', - // ... other configurations for the module ... + // ... モジュールのその他のコンフィギュレーション ... ], ], ] ``` -The [[yii\base\Application::modules|modules]] property takes an array of module configurations. Each array key -represents a *module ID* which uniquely identifies the module among all modules in the application, and the corresponding -array value is a [configuration](concept-configurations.md) for creating the module. +[[yii\base\Application::modules|modules]] プロパティは、モジュールのコンフィギュレーションの配列を取ります。各配列のキーは、 +アプリケーションの全てのモジュールの中でそのモジュールを特定するためのユニークな *モジュール ID* を表します。そして、 +対応する配列の値は、そのモジュールを作成するための [コンフィギュレーション](concept-configurations.md) です。 -### Routes +### ルート -Like accessing controllers in an application, [routes](structure-controllers.md#routes) are used to address -controllers in a module. A route for a controller within a module must begin with the module ID followed by -the controller ID and action ID. For example, if an application uses a module named `forum`, then the route -`forum/post/index` would represent the `index` action of the `post` controller in the module. If the route -only contains the module ID, then the [[yii\base\Module::defaultRoute]] property, which defaults to `default`, -will determine which controller/action should be used. This means a route `forum` would represent the `default` -controller in the `forum` module. +アプリケーションの中のコントローラをアクセスするのと同じように、[ルート](structure-controllers.md#routes) +がモジュールの中のコントローラを指し示すために使われます。モジュール内のコントローラのルートは、モジュール ID で始まり、 +コントローラ ID、アクション ID と続くものでなければなりません。例えば、アプリケーションが `forum` という名前のモジュールを +使用している場合、`forum/post/index` というルートは、`forum` モジュール内の `post` コントローラの `index` アクションを表します。 +ルートがモジュール ID だけを含む場合は、[[yii\base\Module::defaultRoute]] プロパティ (その既定値は `default` です) が、 +どのコントローラ/アクションが使用されるべきかを決定します。これは、`forum` というルートは `forum` モジュール内の +`default` コントローラを表すという意味です。 -### Accessing Modules +### モジュールにアクセスする -Within a module, you may often need to get the instance of the [module class](#module-classes) so that you can -access the module ID, module parameters, module components, etc. You can do so by using the following statement: +モジュール内において、モジュール ID や、モジュールのパラメータ、モジュールのコンポーネントなどにアクセスするために、 +[モジュールクラス](#module-classes) のインスタンスを取得する必要があることがよくあります。次の文を使ってそうすることが出来ます: ```php $module = MyModuleClass::getInstance(); ``` -where `MyModuleClass` refers to the name of the module class that you are interested in. The `getInstance()` method -will return the currently requested instance of the module class. If the module is not requested, the method will -return null. Note that You do not want to manually create a new instance of the module class because it will be -different from the one created by Yii in response to a request. +ここで `MyModuleClass` は、関心を持っているモジュールクラスの名前を指します。`getInstance()` メソッドは、 +現在リクエストされているモジュールクラスのインスタンスを返します。モジュールがリクエストされていない場合は、 +このメソッドは null を返します。モジュールクラスの新しいインスタンスを手動で作成しようとしてはいけないことに注意してください。 +そのインスタンスは、リクエストに対するレスポンスとして Yii によって作成されたインスタンスとは別のものになります。 -> Info: When developing a module, you should not assume the module will use a fixed ID. This is because a module - can be associated with an arbitrary ID when used in an application or within another module. In order to get - the module ID, you should use the above approach to get the module instance first, and then get the ID via - `$module->id`. +> Info|情報: モジュールを開発するとき、モジュールが固定の ID を使うと仮定してはいけません。なぜなら、モジュールは、 + アプリケーションや他のモジュールの中で使うときに、任意の ID と結び付けることが出来るからです。 + モジュール ID を取得するためには、上記の方法を使って最初にモジュールのインスタンスを取得し、そして `$module->id` + によって ID を取得しなければなりません。 -You may also access the instance of a module using the following approaches: +モジュールのインスタンスにアクセスするためには、次の二つの方法を使うことも出来ます: ```php -// get the child module whose ID is "forum" +// ID が "forum" である子モジュールを取得する $module = \Yii::$app->getModule('forum'); -// get the module to which the currently requested controller belongs +// 現在リクエストされているコントローラが属するモジュールを取得する $module = \Yii::$app->controller->module; ``` -The first approach is only useful when you know the module ID, while the second approach is best used when you -know about the controllers being requested. +最初の方法は、モジュール ID を知っている時しか役に立ちません。一方、第二の方法は、 +リクエストされているコントローラについて知っている場合に使うのに最適な方法です。 -Once getting hold of a module instance, you can access parameters or components registered with the module. For example, +いったんモジュールのインスタンスをとらえれば、モジュールに登録されたパラメータやコンポーネントにアクセスすることが可能になります。 +例えば、 ```php $maxPostCount = $module->params['maxPostCount']; ``` -### Bootstrapping Modules +### モジュールをブートストラップする -Some modules may need to be run for every request. The [[yii\debug\Module|debug]] module is such an example. -To do so, list the IDs of such modules in the [[yii\base\Application::bootstrap|bootstrap]] property of the application. +いくつかのモジュールは、全てのリクエストで毎回走らせる必要があります。[[yii\debug\Module|デバッグ]] モジュールがその一例です。 +そうするためには、そのようなモジュールをアプリケーションの [[yii\base\Application::bootstrap|bootstrap]] プロパティのリストに挙げます。 -For example, the following application configuration makes sure the `debug` module is always load: +例えば、次のアプリケーションのコンフィギュレーションは、`debug` モジュールが常にロードされることを保証するものです: ```php [ @@ -210,11 +217,12 @@ For example, the following application configuration makes sure the `debug` modu ``` -## Nested Modules +## 入れ子のモジュール -Modules can be nested in unlimited levels. That is, a module can contain another module which can contain yet -another module. We call the former *parent module* while the latter *child module*. Child modules must be declared -in the [[yii\base\Module::modules|modules]] property of their parent modules. For example, +モジュールはレベルの制限無く入れ子にすることが出来ます。つまり、モジュールは別のモジュールを含むことが出来、 +その含まれたモジュールもさらに別のモジュールを含むことが出来ます。含む側を *親モジュール*、含まれる側を *子モジュール* +と呼びます。子モジュールは、親モジュールの [[yii\base\Module::modules|modules]] プロパティの中で宣言されなければなりません。 +例えば、 ```php namespace app\modules\forum; @@ -227,7 +235,7 @@ class Module extends \yii\base\Module $this->modules = [ 'admin' => [ - // you should consider using a shorter namespace here! + // ここはもっと短い名前空間の使用を考慮すべきだ! 'class' => 'app\modules\forum\modules\admin\Module', ], ]; @@ -235,21 +243,20 @@ class Module extends \yii\base\Module } ``` -For a controller within a nested module, its route should include the IDs of all its ancestor module. -For example, the route `forum/admin/dashboard/index` represents the `index` action of the `dashboard` controller -in the `admin` module which is a child module of the `forum` module. +入れ子にされたモジュールの中にあるコントローラのルートは、全ての祖先のモジュールの ID を含まなければなりません。 +例えば、`forum/admin/dashboard/index` というルートは、`forum` モジュールの子モジュールである `admin` モジュールの +`dashboard` コントローラの `index` アクションを表します。 -> Info: The [[yii\base\Module::getModule()|getModule()]] method only returns the child module directly belonging -to its parent. The [[yii\base\Application::loadedModules]] property keeps a list of loaded modules, including both -direct children and nested ones, indexed by their class names. +> Info|情報: [[yii\base\Module::getModule()|getModule()]] メソッドは、親モジュールに直接属する子モジュールだけを返します。 +[[yii\base\Application::loadedModules]] プロパティがロードされた全てのモジュールのリストを保持しています。 +このリストには、直接の子と孫以下の両方のモジュールが含まれ、クラス名によってインデックスされています。 -## Best Practices +## 最善の慣行 -Modules are best used in large applications whose features can be divided into several groups, each consisting of -a set of closely related features. Each such feature group can be developed as a module which is developed and -maintained by a specific developer or team. +モジュールは、それぞれ密接に関係する一連の機能を含む数個のグループに分割できるような、規模の大きなアプリケーションに +最も適しています。そのような機能グループをそれぞれモジュールとして、特定の個人やチームによって開発することが出来ます。 -Modules are also a good way of reusing code at the feature group level. Some commonly used features, such as -user management, comment management, can all be developed in terms of modules so that they can be reused easily -in future projects. +モジュールは、また、機能グループレベルでコードを再利用するための良い方法でもあります。ある種のよく使われる機能、 +例えばユーザ管理やコメント管理などは、全て、将来のプロジェクトで容易に再利用できるように、モジュールの形式で +開発することが出来ます。 From 80a609d367ee194d3641fb4b27fb8949764e7314 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 6 Nov 2014 23:33:08 +0900 Subject: [PATCH 092/144] docs/guide-ja/structure-modules.md typo fixed [ci skip] --- docs/guide-ja/structure-modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ja/structure-modules.md b/docs/guide-ja/structure-modules.md index 6ff45ae..4bb2e9f 100644 --- a/docs/guide-ja/structure-modules.md +++ b/docs/guide-ja/structure-modules.md @@ -34,7 +34,7 @@ forum/ 全てのモジュールは [[yii\base\Module]] から拡張したユニークなモジュールクラスを持たなければなりません。 モジュールクラスは、モジュールの [[yii\base\Module::basePath|ベースパス]] 直下に配置されて [オートロード可能](concept-autoloading.md) になっていなければなりません。 -モジュールがアクセスされたとk、対応するモジュールクラスの単一のインスタンスが作成されます。 +モジュールがアクセスされたとき、対応するモジュールクラスの単一のインスタンスが作成されます。 [アプリケーションのインスタンス](structure-applications.md) と同じように、モジュールのインスタンスは モジュール内のコードがデータとコンポーネントを共有するために使用されます。 From add2413e084bf639d6b0c925b0c35413bdd23ab3 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Thu, 6 Nov 2014 11:16:14 -0500 Subject: [PATCH 093/144] better way of generating html code. --- framework/assets/yii.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/assets/yii.js b/framework/assets/yii.js index ded1bf0..3b5b7a0 100644 --- a/framework/assets/yii.js +++ b/framework/assets/yii.js @@ -140,7 +140,8 @@ yii = (function ($) { if (!action || !action.match(/(^\/|:\/\/)/)) { action = window.location.href; } - $form = $('
'); + $form = $('
'); + $form.prop('action', action); var target = $e.prop('target'); if (target) { $form.attr('target', target); From 466f924a55930152c8ade1816d7060944e610cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Tietb=C3=B6hl?= Date: Thu, 6 Nov 2014 15:10:16 -0200 Subject: [PATCH 094/144] Fixes to tutorial-performance-tuning --- docs/guide/tutorial-performance-tuning.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/tutorial-performance-tuning.md b/docs/guide/tutorial-performance-tuning.md index cd38b77..3af88e7 100644 --- a/docs/guide/tutorial-performance-tuning.md +++ b/docs/guide/tutorial-performance-tuning.md @@ -51,7 +51,7 @@ scripts for every incoming request. If the application is using Active Record, we should turn on the schema caching to save the time of parsing database schema. This can be done by setting the `Connection::enableSchemaCache` property to be `true` via application configuration -`protected/config/main.php`: +`config/web.php`: ```php return [ @@ -92,7 +92,7 @@ In order to learn how it can be achieved, refer to [assets](structure-assets.md) By default PHP uses files to handle sessions. It is OK for development and small projects but when it comes to handling concurrent requests it's better to switch to another storage such as database. You can do so by configuring your -application via `protected/config/main.php`: +application via `config/web.php`: ```php return [ From abe42a0dd85976e064e37042ee3d35e5ac5f8495 Mon Sep 17 00:00:00 2001 From: Nikola Basic Date: Thu, 6 Nov 2014 18:53:40 +0100 Subject: [PATCH 095/144] Fixed typos [ci skip] --- docs/guide/tutorial-console.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guide/tutorial-console.md b/docs/guide/tutorial-console.md index efa515b..8c0e7d9 100644 --- a/docs/guide/tutorial-console.md +++ b/docs/guide/tutorial-console.md @@ -60,7 +60,7 @@ $exitCode = $application->run(); exit($exitCode); ``` -This script will be created as part of your application; you're free to edit it to suit your needs. The `YII_DEBUG` constant can be set `false` if you do +This script will be created as part of your application; you're free to edit it to suit your needs. The `YII_DEBUG` constant can be set to `false` if you do not want to see a stack trace on error, and/or if you want to improve the overall performance. In both basic and advanced application templates, the console application entry script has debugging enabled by default to provide a more developer-friendly environment. @@ -71,12 +71,12 @@ Configuration As can be seen in the code above, the console application uses its own configuration file, named `console.php`. In this file you should configure various [application components](structure-application-components.md) and properties for the console application in particular. -If your web application and the console application share a lot of configuration parameters and values, you may consider moving the common +If your web application and console application share a lot of configuration parameters and values, you may consider moving the common parts into a separate file, and including this file in both of the application configurations (web and console). You can see an example of this in the "advanced" application template. -> Tipp: Sometimes, you may want to run a console command using an application configuration that is different +> Tip: Sometimes, you may want to run a console command using an application configuration that is different > from the one specified in the entry script. For example, you may want to use the `yii migrate` command to -> upgrade your test databases, which are configured in each individual test suite. To do change the configuration +> upgrade your test databases, which are configured in each individual test suite. To change the configuration > dynamically, simply specify a custom application configuration > file via the `appconfig` option when executing the command: > @@ -118,7 +118,7 @@ will take the declared default values, if defined. If no default value is set, a You may use the `array` type hint to indicate that an argument should be treated as an array. The array will be generated by splitting the input string on commas. -The follow examples show how to declare arguments: +The following example shows how to declare arguments: ```php class ExampleController extends \yii\console\Controller From a95340847f1ee92a94f180b9da95ae7c6735f7ff Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 6 Nov 2014 21:12:49 +0300 Subject: [PATCH 096/144] Fixes #5865: Added info about adjusting advanced application in order to deploy it under a single domain --- docs/guide/tutorial-shared-hosting.md | 62 +++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/docs/guide/tutorial-shared-hosting.md b/docs/guide/tutorial-shared-hosting.md index fefe790..ea0f453 100644 --- a/docs/guide/tutorial-shared-hosting.md +++ b/docs/guide/tutorial-shared-hosting.md @@ -10,7 +10,7 @@ Deploying basic application Since there's typically only one webroot it is recommended to use basic application template. Refer to [Installing Yii chapter](start-installation.md) and install application template locally. -### Add extras for webserver +### Add extras for webserver If webserver used is Apache you'll need to add `.htaccess` file with the following content to `web` (where `index.php` is): @@ -31,15 +31,15 @@ RewriteRule . index.php In case of nginx you should not need any extra config files. -### Renaming webroot +### Renaming webroot If after connecting to your shared hosting via FTP or by other means you're seeing something like the following, you're most probably lucky. ``` -config/ -logs/ -www/ +config +logs +www ``` In the above `www` is webserver directory root (i.e. webroot). It could be named differently. Common names are: `www`, @@ -62,4 +62,54 @@ Deploying advanced application ------------------------------ Deploying advanced application to shared hosting is a bit trickier than doing it with basic application because it has -two webroots. \ No newline at end of file +two webroots which shared hosting typically donesn't have. Because of that structure could be adjusted a bit. + +### Move entry scripts into single webroot + +First of all we need a webroot directory. Name it the way it matches your hosting webroot as described in +[Renaming webroot](#renaming-webroot) above. Then create the following structure: + +``` +www + admin +backend +common +console +environments +frontend +... +``` + +`www` will be our frontend directory so move contents of `frontend/web` into it. Do the same with `backend/web` moving +its contents into `www/admin`. In each case you need to adjust paths in `index.php` and `index-test.php`. + +### Separate sessions and cookies + +Originally backend and frontend are intended to run at different domains. When we're moving it all to the same domain it +is starting to share the same cookies creating a clash. It order to fix it adjust backend application config +`backend/config/main.php` like the following: + +```php +'components' => [ + 'request' => [ + 'csrfParam' => '_backendCSRF', + 'csrfCookie' => [ + 'httpOnly' => true, + 'path' => '/admin', + ], + ], + 'user' => [ + 'identityCookie' => [ + 'name' => '_backendIdentity', + 'path' => '/admin', + 'httpOnly' => true, + ], + ], + 'session' => [ + 'name' => 'BACKENDSESSID', + 'cookieParams' => [ + 'path' => '/admin', + ], + ], +], +``` From 05d54731f6131a57aacaee7f215be3bb6ad5cb89 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Thu, 6 Nov 2014 13:15:27 -0500 Subject: [PATCH 097/144] Fixes #5937 --- docs/guide/runtime-logging.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/guide/runtime-logging.md b/docs/guide/runtime-logging.md index dcb7f1d..8e8ab53 100644 --- a/docs/guide/runtime-logging.md +++ b/docs/guide/runtime-logging.md @@ -211,6 +211,10 @@ log target configuration specifies that only the value of the `$_SERVER` variabl ] ``` +You may configure `logVars` to be an empty array to totally disable the inclusion of context information. +Or if you want to implement your own way of providing context information, you may override the +[[yii\log\Target::getContextMessage()]] method. + ### Message Trace Level From b8cb5e2a28ccbd60235eeded97838cc75063a386 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 6 Nov 2014 23:22:09 +0300 Subject: [PATCH 098/144] Fixes #4263: Added migration and SQL schema files for `yii\log\DbTarget` --- framework/CHANGELOG.md | 4 +- framework/log/DbTarget.php | 35 +++------ .../log/migrations/m141106_185632_log_init.php | 87 ++++++++++++++++++++++ framework/log/migrations/schema-mssql.sql | 28 +++++++ framework/log/migrations/schema-mysql.sql | 27 +++++++ framework/log/migrations/schema-oci.sql | 27 +++++++ framework/log/migrations/schema-pgsql.sql | 28 +++++++ framework/log/migrations/schema-sqlite.sql | 28 +++++++ .../rbac/migrations/m140506_102106_rbac_init.php | 2 + 9 files changed, 240 insertions(+), 26 deletions(-) create mode 100644 framework/log/migrations/m141106_185632_log_init.php create mode 100644 framework/log/migrations/schema-mssql.sql create mode 100644 framework/log/migrations/schema-mysql.sql create mode 100644 framework/log/migrations/schema-oci.sql create mode 100644 framework/log/migrations/schema-pgsql.sql create mode 100644 framework/log/migrations/schema-sqlite.sql diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 8fd1da4..f7ae570 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -20,10 +20,11 @@ Yii Framework 2 Change Log - Bug #5925: `ArrayHelper::htmlEncode()` does not work properly when the value being encoded is a nested array (tebazil) - Bug: Gii console command help information does not contain global options (qiangxue) - Bug: `yii\web\UrlRule` was unable to create URLs for rules containing unicode characters (samdark) +- Enh #4263: Added migration and SQL schema files for `yii\log\DbTarget` (samdark) +- Enh #4457: Added support for using noscript for css files registered through asset bundles and Html helper (samdark) - Enh #5223: Query builder now supports selecting sub-queries as columns (qiangxue) - Enh #5587: `json_encode` is now used with `JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE` where it makes sense, also it is now default for `Json::encode()` (samdark) -- Enh #4457: Added support for using noscript for css files registered through asset bundles and Html helper (samdark) - Enh #5600: Allow configuring debug panels in `yii\debug\Module::panels` as panel class name strings (qiangxue) - Enh #5613: Added `--overwrite` option to Gii console command to support overwriting all files (motin, qiangxue) - Enh #5646: Call `yii\base\ErrorHandler::unregister()` instead of `restore_*_handlers` directly (aivus) @@ -31,6 +32,7 @@ Yii Framework 2 Change Log - Enh #5770: Added more PHP error names for `ErrorException` (mongosoft) - Enh #5806: Allow `Html::encode()` to be used when the application is not started (qiangxue) - Enh: `Console::confirm()` now uses `Console::stdout()` instead of `echo` to be consistent with all other functions (cebe) +- Enh: `yii\rbac\DbManager` migration now uses database component specified in component settings instead of always using default `db` (samdark) - Chg #3630: `yii\db\Command::queryInternal()` is now protected (samdark) - Chg #5508: Dropped the support for the `--append` option for the `fixture` command (qiangxue) - Chg #5874: Upgraded Twitter Bootstrap to 3.3.x (samdark) diff --git a/framework/log/DbTarget.php b/framework/log/DbTarget.php index bdd7781..0148edb 100644 --- a/framework/log/DbTarget.php +++ b/framework/log/DbTarget.php @@ -16,8 +16,15 @@ use yii\helpers\VarDumper; /** * DbTarget stores log messages in a database table. * - * By default, DbTarget stores the log messages in a DB table named 'log'. This table - * must be pre-created. The table name can be changed by setting the [[logTable]] property. + * The database connection is specified by [[db]]. Database schema could be initialized by applying migration: + * + * ``` + * yii migrate --migrationPath=@yii/log/migrations/ + * ``` + * + * If you don't want to use migration and need SQL instead, files for all databases are in migrations directory. + * + * You may change the name of the table used to store the data by setting [[logTable]]. * * @author Qiang Xue * @since 2.0 @@ -31,29 +38,7 @@ class DbTarget extends Target */ public $db = 'db'; /** - * @var string name of the DB table to store cache content. - * The table should be pre-created as follows: - * - * ~~~ - * CREATE TABLE log ( - * id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - * level INTEGER, - * category VARCHAR(255), - * log_time INTEGER, - * prefix TEXT, - * message TEXT, - * INDEX idx_log_level (level), - * INDEX idx_log_category (category) - * ) - * ~~~ - * - * Note that the 'id' column must be created as an auto-incremental column. - * The above SQL uses the MySQL syntax. If you are using other DBMS, you need - * to adjust it accordingly. For example, in PostgreSQL, it should be `id SERIAL PRIMARY KEY`. - * - * The indexes declared above are not required. They are mainly used to improve the performance - * of some queries about message levels and categories. Depending on your actual needs, you may - * want to create additional indexes (e.g. index on `log_time`). + * @var string name of the DB table to store cache content. Defaults to "log". */ public $logTable = '{{%log}}'; diff --git a/framework/log/migrations/m141106_185632_log_init.php b/framework/log/migrations/m141106_185632_log_init.php new file mode 100644 index 0000000..62fbe82 --- /dev/null +++ b/framework/log/migrations/m141106_185632_log_init.php @@ -0,0 +1,87 @@ + + * @since 2.0.1 + */ +class m141106_185632_log_init extends Migration +{ + /** + * @var DbTarget[] + */ + private $dbTargets = []; + + /** + * @throws InvalidConfigException + * @return DbTarget[] + */ + protected function getDbTargets() + { + if ($this->dbTargets === []) { + $log = Yii::$app->getLog(); + + foreach ($log->targets as $target) { + if ($target instanceof DbTarget) { + $this->dbTargets[] = $target; + } + } + + if ($this->dbTargets === []) { + throw new InvalidConfigException('You should configure "log" component to use one or more database targets before executing this migration.'); + } + } + return $this->dbTargets; + } + + public function up() + { + $targets = $this->getDbTargets(); + foreach ($targets as $target) { + $this->db = $target->db; + + $tableOptions = null; + if ($this->db->driverName === 'mysql') { + // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci + $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; + } + + $this->createTable($target->logTable, [ + 'id' => Schema::TYPE_BIGPK, + 'level' => Schema::TYPE_INTEGER, + 'category' => Schema::TYPE_STRING, + 'log_time' => Schema::TYPE_INTEGER, + 'prefix' => Schema::TYPE_TEXT, + 'message' => Schema::TYPE_TEXT, + ], $tableOptions); + + $this->createIndex('idx_log_level', $target->logTable, 'level'); + $this->createIndex('idx_log_category', $target->logTable, 'category'); + } + } + + public function down() + { + $targets = $this->getDbTargets(); + foreach ($targets as $target) { + $this->db = $target->db; + + $this->dropTable($target->logTable); + } + } +} diff --git a/framework/log/migrations/schema-mssql.sql b/framework/log/migrations/schema-mssql.sql new file mode 100644 index 0000000..503635f --- /dev/null +++ b/framework/log/migrations/schema-mssql.sql @@ -0,0 +1,28 @@ +/** + * Database schema required by \yii\log\DbTarget. + * + * The indexes declared are not required. They are mainly used to improve the performance + * of some queries about message levels and categories. Depending on your actual needs, you may + * want to create additional indexes (e.g. index on `log_time`). + * + * @author Alexander Makarov + * @link http://www.yiiframework.com/ + * @copyright 2008 Yii Software LLC + * @license http://www.yiiframework.com/license/ + * @since 2.0.1 + */ + +drop table if exists [log]; + +create table [log] +( + [id] bigint IDENTITY PRIMARY KEY, + [level] integer, + [category] varchar(255), + [log_time] integer, + [prefix] text, + [message] text +); + +create index [idx_log_level] on [log] ([level]); +create index [idx_log_category] on [log] ([category]); diff --git a/framework/log/migrations/schema-mysql.sql b/framework/log/migrations/schema-mysql.sql new file mode 100644 index 0000000..8c1f2a5 --- /dev/null +++ b/framework/log/migrations/schema-mysql.sql @@ -0,0 +1,27 @@ +/** + * Database schema required by \yii\log\DbTarget. + * + * The indexes declared are not required. They are mainly used to improve the performance + * of some queries about message levels and categories. Depending on your actual needs, you may + * want to create additional indexes (e.g. index on `log_time`). + * + * @author Alexander Makarov + * @link http://www.yiiframework.com/ + * @copyright 2008 Yii Software LLC + * @license http://www.yiiframework.com/license/ + * @since 2.0.1 + */ + +drop table if exists `log`; + +create table `log` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `level` integer, + `category` varchar(255), + `log_time` integer, + `prefix` text, + `message` text, + key `idx_log_level` (`level`), + key `idx_log_category` (`category`) +) engine InnoDB; diff --git a/framework/log/migrations/schema-oci.sql b/framework/log/migrations/schema-oci.sql new file mode 100644 index 0000000..35bde70 --- /dev/null +++ b/framework/log/migrations/schema-oci.sql @@ -0,0 +1,27 @@ +/** + * Database schema required by \yii\log\DbTarget. + * + * The indexes declared are not required. They are mainly used to improve the performance + * of some queries about message levels and categories. Depending on your actual needs, you may + * want to create additional indexes (e.g. index on `log_time`). + * + * @author Alexander Makarov + * @link http://www.yiiframework.com/ + * @copyright 2008 Yii Software LLC + * @license http://www.yiiframework.com/license/ + * @since 2.0.1 + */ + +drop table if exists "log"; + +create table "log" +( + "id" number(20) NOT NULL PRIMARY KEY, + "level" integer, + "category" varchar(255), + "log_time" integer, + "prefix" text, + "message" text, + key "idx_log_level" ("level"), + key "idx_log_category" ("category") +); diff --git a/framework/log/migrations/schema-pgsql.sql b/framework/log/migrations/schema-pgsql.sql new file mode 100644 index 0000000..5b343b0 --- /dev/null +++ b/framework/log/migrations/schema-pgsql.sql @@ -0,0 +1,28 @@ +/** + * Database schema required by \yii\log\DbTarget. + * + * The indexes declared are not required. They are mainly used to improve the performance + * of some queries about message levels and categories. Depending on your actual needs, you may + * want to create additional indexes (e.g. index on `log_time`). + * + * @author Alexander Makarov + * @link http://www.yiiframework.com/ + * @copyright 2008 Yii Software LLC + * @license http://www.yiiframework.com/license/ + * @since 2.0.1 + */ + +drop table if exists "log"; + +create table "log" +( + "id" bigserial NOT NULL PRIMARY KEY, + "level" integer, + "category" varchar(255), + "log_time" integer, + "prefix" text, + "message" text +); + +create index "idx_log_level" on "log" ("level"); +create index "idx_log_category" on "log" ("category"); \ No newline at end of file diff --git a/framework/log/migrations/schema-sqlite.sql b/framework/log/migrations/schema-sqlite.sql new file mode 100644 index 0000000..1da8e64 --- /dev/null +++ b/framework/log/migrations/schema-sqlite.sql @@ -0,0 +1,28 @@ +/** + * Database schema required by \yii\log\DbTarget. + * + * The indexes declared are not required. They are mainly used to improve the performance + * of some queries about message levels and categories. Depending on your actual needs, you may + * want to create additional indexes (e.g. index on `log_time`). + * + * @author Alexander Makarov + * @link http://www.yiiframework.com/ + * @copyright 2008 Yii Software LLC + * @license http://www.yiiframework.com/license/ + * @since 2.0.1 + */ + +drop table if exists "log"; + +create table "log" +( + "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, + "level" integer, + "category" varchar(255), + "log_time" integer, + "prefix" text, + "message" text +); + +create index "idx_log_level" on "log" ("level"); +create index "idx_log_category" on "log" ("category"); \ No newline at end of file diff --git a/framework/rbac/migrations/m140506_102106_rbac_init.php b/framework/rbac/migrations/m140506_102106_rbac_init.php index 0bc96a1..b5cda49 100644 --- a/framework/rbac/migrations/m140506_102106_rbac_init.php +++ b/framework/rbac/migrations/m140506_102106_rbac_init.php @@ -33,6 +33,7 @@ class m140506_102106_rbac_init extends \yii\db\Migration public function up() { $authManager = $this->getAuthManager(); + $this->db = $authManager->db; $tableOptions = null; if ($this->db->driverName === 'mysql') { @@ -81,6 +82,7 @@ class m140506_102106_rbac_init extends \yii\db\Migration public function down() { $authManager = $this->getAuthManager(); + $this->db = $authManager->db; $this->dropTable($authManager->assignmentTable); $this->dropTable($authManager->itemChildTable); From 4b97abacc7f056c424c619e128e561892981aac7 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Nov 2014 01:27:37 +0300 Subject: [PATCH 099/144] Fixes #5954: `yii message` command now shows user friendly error if it's not able to parse source file --- framework/CHANGELOG.md | 1 + framework/console/controllers/MessageController.php | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index f7ae570..20c3fd2 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -31,6 +31,7 @@ Yii Framework 2 Change Log - Enh #5735: Added `yii\bootstrap\Tabs::renderTabContent` to support manually rendering tab contents (RomeroMsk) - Enh #5770: Added more PHP error names for `ErrorException` (mongosoft) - Enh #5806: Allow `Html::encode()` to be used when the application is not started (qiangxue) +- Enh #5954: `yii message` command now shows user friendly error if it's not able to parse source file (samdark) - Enh: `Console::confirm()` now uses `Console::stdout()` instead of `echo` to be consistent with all other functions (cebe) - Enh: `yii\rbac\DbManager` migration now uses database component specified in component settings instead of always using default `db` (samdark) - Chg #3630: `yii\db\Command::queryInternal()` is now protected (samdark) diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php index 2b35c50..a060e3f 100644 --- a/framework/console/controllers/MessageController.php +++ b/framework/console/controllers/MessageController.php @@ -8,8 +8,10 @@ namespace yii\console\controllers; use Yii; +use yii\base\ErrorException; use yii\console\Controller; use yii\console\Exception; +use yii\helpers\Console; use yii\helpers\FileHelper; use yii\helpers\VarDumper; use yii\i18n\GettextPoFile; @@ -258,7 +260,17 @@ class MessageController extends Controller for ($i = 0; $i < $n; ++$i) { $category = substr($matches[$i][1], 1, -1); $message = $matches[$i][2]; - $messages[$category][] = eval("return {$message};"); // use eval to eliminate quote escape + try { + $messages[$category][] = eval("return {$message};"); // use eval to eliminate quote escape + } catch (ErrorException $e) { + $category = Console::ansiFormat($category, [Console::FG_CYAN]); + $message = Console::ansiFormat($message, [Console::FG_CYAN]); + $fileName = Console::ansiFormat($fileName, [Console::FG_CYAN]); + $error = Console::ansiFormat($e->getMessage(), [Console::FG_RED]); + + $this->stdout("Failed parsing $fileName, $message in $category category:\n" . $error . "\n"); + Yii::$app->end(self::EXIT_CODE_ERROR); + } } } From 511535ec0a85b4f3f113326983151cb5f7ffba42 Mon Sep 17 00:00:00 2001 From: Denis M Date: Thu, 6 Nov 2014 16:37:27 +0200 Subject: [PATCH 100/144] Fixes #4181: Added `yii\bootstrap\Modal::$headerOptions` and `yii\bootstrap\Modal::$footerOptions` --- extensions/bootstrap/Modal.php | 18 ++++++++++++++++-- framework/CHANGELOG.md | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/extensions/bootstrap/Modal.php b/extensions/bootstrap/Modal.php index 5994278..ccb6229 100644 --- a/extensions/bootstrap/Modal.php +++ b/extensions/bootstrap/Modal.php @@ -44,10 +44,22 @@ class Modal extends Widget */ public $header; /** + * @var string additional header options + * @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. + * @since 2.0.1 + */ + public $headerOptions; + /** * @var string the footer content in the modal window. */ public $footer; /** + * @var string additional footer options + * @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. + * @since 2.0.1 + */ + public $footerOptions; + /** * @var string the modal size. Can be [[SIZE_LARGE]] or [[SIZE_SMALL]], or empty for default. */ public $size; @@ -125,7 +137,8 @@ class Modal extends Widget $this->header = $button . "\n" . $this->header; } if ($this->header !== null) { - return Html::tag('div', "\n" . $this->header . "\n", ['class' => 'modal-header']); + Html::addCssClass($this->headerOptions, 'modal-header'); + return Html::tag('div', "\n" . $this->header . "\n", $this->headerOptions); } else { return null; } @@ -156,7 +169,8 @@ class Modal extends Widget protected function renderFooter() { if ($this->footer !== null) { - return Html::tag('div', "\n" . $this->footer . "\n", ['class' => 'modal-footer']); + Html::addCssClass($this->footerOptions, 'modal-footer'); + return Html::tag('div', "\n" . $this->footer . "\n", $this->footerOptions); } else { return null; } diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 20c3fd2..6df570f 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -20,6 +20,7 @@ Yii Framework 2 Change Log - Bug #5925: `ArrayHelper::htmlEncode()` does not work properly when the value being encoded is a nested array (tebazil) - Bug: Gii console command help information does not contain global options (qiangxue) - Bug: `yii\web\UrlRule` was unable to create URLs for rules containing unicode characters (samdark) +- Enh #4181: Added `yii\bootstrap\Modal::$headerOptions` and `yii\bootstrap\Modal::$footerOptions` (tuxoff, samdark) - Enh #4263: Added migration and SQL schema files for `yii\log\DbTarget` (samdark) - Enh #4457: Added support for using noscript for css files registered through asset bundles and Html helper (samdark) - Enh #5223: Query builder now supports selecting sub-queries as columns (qiangxue) From 761d1fce1d0fd38a187058421400110a7e0dbfd8 Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Thu, 6 Nov 2014 23:39:33 +0100 Subject: [PATCH 101/144] Slovenian translation added --- framework/messages/config.php | 2 +- framework/messages/sl/yii.php | 117 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 framework/messages/sl/yii.php diff --git a/framework/messages/config.php b/framework/messages/config.php index bd66ca1..99aab52 100644 --- a/framework/messages/config.php +++ b/framework/messages/config.php @@ -7,7 +7,7 @@ return [ 'messagePath' => __DIR__, // array, required, list of language codes that the extracted messages // should be translated to. For example, ['zh-CN', 'de']. - 'languages' => ['ar', 'az', 'bg', 'ca', 'cs', 'da', 'de', 'el', 'es', 'et', 'fa-IR', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'kk', 'ko', 'lt', 'lv', 'nl', 'pl', 'pt', 'pt-BR', 'ro', 'ru', 'sk', 'sr', 'sr-Latn', 'sv', 'th', 'uk', 'vi', 'zh-CN','zh-TW'], + 'languages' => ['ar', 'az', 'bg', 'ca', 'cs', 'da', 'de', 'el', 'es', 'et', 'fa-IR', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'kk', 'ko', 'lt', 'lv', 'nl', 'pl', 'pt', 'pt-BR', 'ro', 'ru', 'sk', 'sl', 'sr', 'sr-Latn', 'sv', 'th', 'uk', 'vi', 'zh-CN','zh-TW'], // string, the name of the function for translating messages. // Defaults to 'Yii::t'. This is used as a mark to find the messages to be // translated. You may use a string for single function name or an array for diff --git a/framework/messages/sl/yii.php b/framework/messages/sl/yii.php new file mode 100644 index 0000000..b77cf7c --- /dev/null +++ b/framework/messages/sl/yii.php @@ -0,0 +1,117 @@ + 'ravno zdaj', + '(not set)' => '(ni nastavljeno)', + 'An internal server error occurred.' => 'Prišlo je do notranje napake na strežniku.', + 'Are you sure you want to delete this item?' => 'Ste prepričani, da želite izbrisati ta element?', + 'Delete' => 'Izbrišite', + 'Error' => 'Napaka', + 'File upload failed.' => 'Nalaganje datoteke ni bilo uspešno.', + 'Home' => 'Domov', + 'Invalid data received for parameter "{param}".' => 'Neveljavni podatki so bili poslani za parameter "{param}".', + 'Login Required' => 'Zahtevana je prijava', + 'Missing required arguments: {params}' => 'Manjkajo zahtevani argumenti: {params}', + 'Missing required parameters: {params}' => 'Manjkajo zahtevani parametri: {params}', + 'No' => 'Ne', + 'No help for unknown command "{command}".' => 'Pomoči za neznani ukaz "{command}" ni mogoče najti.', + 'No help for unknown sub-command "{command}".' => 'Pomoči za neznani pod-ukaz "{command}" ni mogoče najti.', + 'No results found.' => 'Razultatov ni bilo mogoče najti.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Dovoljene so samo datoteke s temi MIME tipi: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Dovoljene so samo datoteke s temi končnicami: {extensions}.', + 'Page not found.' => 'Strani ni mogoče najti.', + 'Please fix the following errors:' => 'Prosimo, popravite sledeče napake:', + 'Please upload a file.' => 'Prosimo, naložite datoteko.', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Prikaz {begin, number}-{end, number} od {totalCount, number} {totalCount, plural, one{Element} two{Elementa} few{Elementi} other{Elementov}}.', + 'The file "{file}" is not an image.' => 'Datoteka "{file}" ni slika.', + 'The file "{file}" is too big. Its size cannot exceed {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Datoteka "{file}" je prevelika. Njena velikost {limit, number} {limit, plural, one{bajta} two{bajtov} few{bajtov} other{bajtov}}.', + 'The file "{file}" is too small. Its size cannot be smaller than {limit, number} {limit, plural, one{byte} other{bytes}}.' => 'Datoteka "{file}" je premajhna. Njena velikost ne sme biti manjša od {limit, number} {limit, plural, one{bajta} two{bajtov} few{bajtov} other{bajtov}}.', + 'The format of {attribute} is invalid.' => 'Format {attribute} ni veljaven.', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Višina ne sme biti večja od {limit, number} {limit, plural, one{piksla} other{pikslov}}.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je prevelika. Širina ne sme biti večja od {limit, number} {limit, plural, one{piksla} other{pikslov}}.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premajhna. Višina ne sme biti manjša od {limit, number} {limit, plural, one{piksla} other{pikslov}}.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Slika "{file}" je premajhna. Širina ne sme biti manjša od {limit, number} {limit, plural, one{piksla} other{pikslov}}.', + 'The requested view "{name}" was not found.' => 'Zahtevani pogled "{name}" ni bil najden.', + 'The verification code is incorrect.' => 'Koda za preverjanje je napačna.', + 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Skupaj {count, number} {count, plural, one{element} two{elementa} few{elementi} other{elementov}}.', + 'Unable to verify your data submission.' => 'Preverjanje vaših poslanih podatkov ni uspelo.', + 'Unknown command "{command}".' => 'Neznani ukaz "{command}".', + 'Unknown option: --{name}' => 'Neznana opcija: --{name}', + 'Update' => 'Posodobitev', + 'View' => 'Pogled', + 'Yes' => 'Da', + 'You are not allowed to perform this action.' => 'Ta akcija ni dovoljena za izvajanje.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Naložite lahko največ {limit, number} {limit, plural, one{datoteko} two{datoteki} few{datoteke} other{datotek}}.', + 'in {delta, plural, =1{a day} other{# days}}' => 'v {delta, plural, one{# dnevu} other{# dneh}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'v {delta, plural, one{# minuti} other{# minutah}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'v {delta, plural, one{# mesecu} other{# mesecih}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'v {delta, plural, one{# sekundi} other{# sekundah}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'v {delta, plural, one{# letu} other{# letih}}', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'v {delta, plural, one{# uri} other{# urah}}', + 'the input value' => 'vhodna vrednost', + '{attribute} "{value}" has already been taken.' => 'Atribut {attribute} "{value}" je že nastavljen.', + '{attribute} cannot be blank.' => 'Atribut {attribute} ne more biti prazen', + '{attribute} is invalid.' => 'Atribut {attribute} je neveljaven.', + '{attribute} is not a valid URL.' => 'Atribut {attribute} ni veljaven URL.', + '{attribute} is not a valid email address.' => 'Atribut {attribute} ni veljaven e-poštni naslov.', + '{attribute} must be "{requiredValue}".' => '{attribute} mora biti "{requiredValue}".', + '{attribute} must be a number.' => '{attribute} mora biti število.', + '{attribute} must be a string.' => '{attribute} mora biti niz.', + '{attribute} must be an integer.' => '{attribute} mora biti celo število.', + '{attribute} must be either "{true}" or "{false}".' => '{attribute} mora biti ali "{true}" ali "{false}".', + '{attribute} must be greater than "{compareValue}".' => 'Atribut {attribute} mora biti večji od "{compareValue}".', + '{attribute} must be greater than or equal to "{compareValue}".' => 'Atribut {attribute} mora biti večji ali enak "{compareValue}".', + '{attribute} must be less than "{compareValue}".' => 'Atribut {attribute} mora biti manjši od "{compareValue}".', + '{attribute} must be less than or equal to "{compareValue}".' => 'Atribut {attribute} mora biti manjši ali enak "{compareValue}".', + '{attribute} must be no greater than {max}.' => 'Atribut {attribute} ne sme biti večji od {max}', + '{attribute} must be no less than {min}.' => 'Atribut {attribute} ne sme biti manjši od {min}.', + '{attribute} must be repeated exactly.' => 'Atribut {attribute} mora biti točno ponovljen.', + '{attribute} must not be equal to "{compareValue}".' => 'Atribut {attribute} ne sme biti enak "{compareValue}".', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => 'Atribut {attribute} mora vsebovati vsaj {min, number} {min, plural, one{znak} two{znaka} few{znake} other{znakov}}.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => 'Atribut {attribute} mora vsebovati največ {max, number} {max, plural, one{znak} two{znaka} few{znake} other{znakov}}.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => 'Atribut {attribute} mora vsebovati {length, number} {length, plural, one{znak} two{znaka} few{znake} other{znakov}}.', + '{delta, plural, =1{a day} other{# days}} ago' => 'pred {delta, plural, one{# dnevom} two{# dnevoma} other{# dnevi}}', + '{delta, plural, =1{a minute} other{# minutes}} ago' => 'pred {delta, plural, one{# minuto} two{# minutama} other{# minutami}}', + '{delta, plural, =1{a month} other{# months}} ago' => 'pred {delta, plural, one{# mesecem} two{# mesecema} other{# meseci}}', + '{delta, plural, =1{a second} other{# seconds}} ago' => 'pred {delta, plural, one{# sekundo} two{# sekundama} other{# sekundami}}', + '{delta, plural, =1{a year} other{# years}} ago' => 'pred {delta, plural, one{# letom} two{# letoma} other{# leti}}', + '{delta, plural, =1{an hour} other{# hours}} ago' => 'pred {delta, plural, one{#uro} two{# urama} other{# urami}}', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '{nFormatted} GiB', + '{nFormatted} KB' => '{nFormatted} KB', + '{nFormatted} KiB' => '{nFormatted} KiB', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '{nFormatted} MiB', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '{nFormatted} PiB', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, one{bajt} two{bajta} few{bajti} other{bajtov}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, one{gibibajt} two{gibibajta} few{gibibajti} other{gibibajtov}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, one{gigabajt} two{gigabajta} few{gigabajti} other{gigabajtov}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, one{kibibajt} two{kibibajta} few{kibibajti} other{kibibajtov}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, one{kilobajt} two{kilobajta} few{kilobajti} other{kilobajtov}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, one{mebibajt} two{mebibajta} few{mebibajti} other{mebibajtov}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, one{megabajt} two{megabajta} few{megabajti} other{megabajtov}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, one{pebibajt} two{pebibajta} few{pebibajti} other{pebibajtov}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, one{petabajt} two{petabajta} few{petabajti} other{petabajtov}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, one{tebibajt} two{tebibajta} few{tebibajti} other{tebibajtov}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, one{terabajt} two{terabajta} few{terabajti} other{terabajtov}}', +]; From 3485596bc7b5e659ff8ddedb4c7bfa1c5e1ef617 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Nov 2014 02:57:48 +0300 Subject: [PATCH 102/144] Reordered changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 6df570f..f482900 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,7 +4,6 @@ Yii Framework 2 Change Log 2.0.1 under development ----------------------- -- Bug #5893: `yii\helpers\ArrayHelper::toArray()` now applies `$properties` parameter for converting descending objects in recursive calls (otsec) - Bug #4471: `yii\caching\ApcCache::getValues()` now returns array in case of APC is installed but not enabled in CLI mode (samdark, cebe) - Bug #5402: Debugger was not loading when there were closures in asset classes (samdark) - Bug #5570: `yii\bootstrap\Tabs` would throw an exception if `content` is not set for one of its `items` (RomeroMsk) @@ -17,6 +16,7 @@ Yii Framework 2 Change Log - Bug #5745: Gii and debug modules may cause 404 exception when the route contains dashes (qiangxue) - Bug #5780: `QueryBuilder::batchInsert()` may cause "undefined index" error (qiangxue) - Bug #5833: The `message` command fails with a FK constraint error when trying to update messages (qiangxue) +- Bug #5893: `yii\helpers\ArrayHelper::toArray()` now applies `$properties` parameter for converting descending objects in recursive calls (otsec) - Bug #5925: `ArrayHelper::htmlEncode()` does not work properly when the value being encoded is a nested array (tebazil) - Bug: Gii console command help information does not contain global options (qiangxue) - Bug: `yii\web\UrlRule` was unable to create URLs for rules containing unicode characters (samdark) From e2b6cb69b0bee7004a0dd170804dfd4323d0fc92 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Nov 2014 03:01:05 +0300 Subject: [PATCH 103/144] Fixes #4889: Application was getting into redirect loop when user wasn't allowed accessing login page. Now shows 403 --- framework/CHANGELOG.md | 1 + framework/web/User.php | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index f482900..12e2751 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -5,6 +5,7 @@ Yii Framework 2 Change Log ----------------------- - Bug #4471: `yii\caching\ApcCache::getValues()` now returns array in case of APC is installed but not enabled in CLI mode (samdark, cebe) +- Bug #4889: Application was getting into redirect loop when user wasn't allowed accessing login page. Now shows 403 (samdark) - Bug #5402: Debugger was not loading when there were closures in asset classes (samdark) - Bug #5570: `yii\bootstrap\Tabs` would throw an exception if `content` is not set for one of its `items` (RomeroMsk) - Bug #5584: `yii\rbac\DbRbacManager` should not delete items when deleting a rule on a database not supporting cascade update (mdmunir) diff --git a/framework/web/User.php b/framework/web/User.php index e464040..7c35f84 100644 --- a/framework/web/User.php +++ b/framework/web/User.php @@ -422,10 +422,12 @@ class User extends Component $this->setReturnUrl($request->getUrl()); } if ($this->loginUrl !== null) { - return Yii::$app->getResponse()->redirect($this->loginUrl); - } else { - throw new ForbiddenHttpException(Yii::t('yii', 'Login Required')); + $loginUrl = (array)$this->loginUrl; + if ($loginUrl[0] !== Yii::$app->requestedRoute) { + return Yii::$app->getResponse()->redirect($this->loginUrl); + } } + throw new ForbiddenHttpException(Yii::t('yii', 'Login Required')); } /** From a935b97b1567c383b1fd21f8c7aec3a750398978 Mon Sep 17 00:00:00 2001 From: munawer Date: Fri, 7 Nov 2014 13:05:55 +0530 Subject: [PATCH 104/144] [skip ci] Typo fix in guide --- docs/guide/concept-events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/concept-events.md b/docs/guide/concept-events.md index a393388..aaecb6c 100644 --- a/docs/guide/concept-events.md +++ b/docs/guide/concept-events.md @@ -17,7 +17,7 @@ An event handler is a [PHP callback](http://www.php.net/manual/en/language.types when the event it is attached to is triggered. You can use any of the following callbacks: - a global PHP function specified as a string (without parentheses), e.g., `'trim'`; -- an object method specified as an array of an object and a method name as a string (without parenthess), e.g., `[$object, 'methodName']`; +- an object method specified as an array of an object and a method name as a string (without parentheses), e.g., `[$object, 'methodName']`; - a static class method specified as an array of a class name and a method name as a string (without parentheses), e.g., `[$class, 'methodName']`; - an anonymous function, e.g., `function ($event) { ... }`. From b819a67829001f30d04de752fd527c90db1e436c Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Nov 2014 13:00:06 +0300 Subject: [PATCH 105/144] Added changelog line for #4181 --- extensions/bootstrap/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/bootstrap/CHANGELOG.md b/extensions/bootstrap/CHANGELOG.md index 51c3116..b35eff7 100644 --- a/extensions/bootstrap/CHANGELOG.md +++ b/extensions/bootstrap/CHANGELOG.md @@ -5,6 +5,7 @@ Yii Framework 2 bootstrap extension Change Log ----------------------- - Bug #5570: `yii\bootstrap\Tabs` would throw an exception if `content` is not set for one of its `items` (RomeroMsk) +- Enh #4181: Added `yii\bootstrap\Modal::$headerOptions` and `yii\bootstrap\Modal::$footerOptions` (tuxoff, samdark) - Enh #5735: Added `yii\bootstrap\Tabs::renderTabContent` to support manually rendering tab contents (RomeroMsk) - Chg #5874: Upgraded Twitter Bootstrap to 3.3.x (samdark) From da000165cfb12ca28a3b3c174828d816461c4227 Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Fri, 7 Nov 2014 12:44:34 +0200 Subject: [PATCH 106/144] Method 'oneWithUpdate' renamed to 'oneWithModify' at `yii\mongodb\Query` --- extensions/mongodb/ActiveQuery.php | 4 ++-- extensions/mongodb/Query.php | 2 +- tests/unit/extensions/mongodb/ActiveRecordTest.php | 4 ++-- tests/unit/extensions/mongodb/QueryRunTest.php | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/mongodb/ActiveQuery.php b/extensions/mongodb/ActiveQuery.php index baecc79..fc80373 100644 --- a/extensions/mongodb/ActiveQuery.php +++ b/extensions/mongodb/ActiveQuery.php @@ -169,9 +169,9 @@ class ActiveQuery extends Query implements ActiveQueryInterface * Depending on the setting of [[asArray]], the query result may be either an array or an ActiveRecord object. * Null will be returned if the query results in nothing. */ - public function oneWithUpdate($update, $options = [], $db = null) + public function oneWithModify($update, $options = [], $db = null) { - $row = parent::oneWithUpdate($update, $options, $db); + $row = parent::oneWithModify($update, $options, $db); if ($row !== null) { $models = $this->populate([$row]); return reset($models) ?: null; diff --git a/extensions/mongodb/Query.php b/extensions/mongodb/Query.php index 3239e04..7975c33 100644 --- a/extensions/mongodb/Query.php +++ b/extensions/mongodb/Query.php @@ -205,7 +205,7 @@ class Query extends Component implements QueryInterface * @param Connection $db the Mongo connection used to execute the query. * @return array|null the original document, or the modified document when $options['new'] is set. */ - public function oneWithUpdate($update, $options = [], $db = null) + public function oneWithModify($update, $options = [], $db = null) { $collection = $this->getCollection($db); if (!empty($this->orderBy)) { diff --git a/tests/unit/extensions/mongodb/ActiveRecordTest.php b/tests/unit/extensions/mongodb/ActiveRecordTest.php index 49eed80..617b116 100644 --- a/tests/unit/extensions/mongodb/ActiveRecordTest.php +++ b/tests/unit/extensions/mongodb/ActiveRecordTest.php @@ -264,14 +264,14 @@ class ActiveRecordTest extends MongoDbTestCase $this->assertEquals(7, $rowRefreshed->status); } - public function testFindOneWithUpdate() + public function testFindOneWithModify() { $searchName = 'name7'; $newName = 'new name'; $customer = Customer::find() ->where(['name' => $searchName]) - ->oneWithUpdate(['$set' => ['name' => $newName]], ['new' => true]); + ->oneWithModify(['$set' => ['name' => $newName]], ['new' => true]); $this->assertTrue($customer instanceof Customer); $this->assertEquals($newName, $customer->name); } diff --git a/tests/unit/extensions/mongodb/QueryRunTest.php b/tests/unit/extensions/mongodb/QueryRunTest.php index 9f26894..928fa18 100644 --- a/tests/unit/extensions/mongodb/QueryRunTest.php +++ b/tests/unit/extensions/mongodb/QueryRunTest.php @@ -211,7 +211,7 @@ class QueryRunTest extends MongoDbTestCase $this->assertEquals($rows, $rowsUppercase); } - public function testOneWithUpdate() + public function testOneWithModify() { $connection = $this->getConnection(); @@ -221,14 +221,14 @@ class QueryRunTest extends MongoDbTestCase $newName = 'new name'; $row = $query->from('customer') ->where(['name' => $searchName]) - ->oneWithUpdate(['$set' => ['name' => $newName]], ['new' => false], $connection); + ->oneWithModify(['$set' => ['name' => $newName]], ['new' => false], $connection); $this->assertEquals($searchName, $row['name']); $searchName = 'name7'; $newName = 'new name'; $row = $query->from('customer') ->where(['name' => $searchName]) - ->oneWithUpdate(['$set' => ['name' => $newName]], ['new' => true], $connection); + ->oneWithModify(['$set' => ['name' => $newName]], ['new' => true], $connection); $this->assertEquals($newName, $row['name']); } From 69662aa43298fd0ebd0a6ab28b14703df0cf00e2 Mon Sep 17 00:00:00 2001 From: Tomek Romik Date: Fri, 7 Nov 2014 11:30:56 +0100 Subject: [PATCH 107/144] Fix typo in polish translation [ci skip] --- framework/messages/pl/yii.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/messages/pl/yii.php b/framework/messages/pl/yii.php index c12bb49..360660b 100644 --- a/framework/messages/pl/yii.php +++ b/framework/messages/pl/yii.php @@ -84,7 +84,7 @@ return [ '{attribute} must be repeated exactly.' => 'Wartość {attribute} musi być dokładnie powtórzona.', '{attribute} must not be equal to "{compareValue}".' => '{attribute} musi mieć wartość różną od "{compareValue}".', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} powinien zawierać co najmniej {min, number} {min, plural, one{znak} few{znaki} many{znaków} other{znaku}}.', - '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} powinien zawierać nie więcej niż {max, number} {min, plural, one{znak} few{znaki} many{znaków} other{znaku}}.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} powinien zawierać nie więcej niż {max, number} {max, plural, one{znak} few{znaki} many{znaków} other{znaku}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} powinien zawierać dokładnie {length, number} {length, plural, one{znak} few{znaki} many{znaków} other{znaku}}.', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{jeden dzień} other{# dni} other{# dnia}} temu', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{minutę} few{# minuty} many{# minut} other{# minuty}} temu', From ee23d92415a10b766eaf35b09f5a4d62efed003c Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Nov 2014 14:59:52 +0300 Subject: [PATCH 108/144] Added links to Looking Ahead pointing to docs mentioned --- docs/guide/start-looking-ahead.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide/start-looking-ahead.md b/docs/guide/start-looking-ahead.md index b0e0ec3..5af780c 100644 --- a/docs/guide/start-looking-ahead.md +++ b/docs/guide/start-looking-ahead.md @@ -9,19 +9,19 @@ code automatically. Using Gii for code generation turns the bulk of your Web dev This section will summarize the Yii resources available to help you be more productive when using the framework. * Documentation - - The Definitive Guide: + - [The Definitive Guide](http://www.yiiframework.com/doc-2.0/guide-README.html): As the name indicates, the guide precisely defines how Yii should work and provides general guidance about using Yii. It is the single most important Yii tutorial, and one that you should read before writing any Yii code. - - The Class Reference: + - [The Class Reference](http://www.yiiframework.com/doc-2.0/index.html): This specifies the usage of every class provided by Yii. It should be mainly used when you are writing code and want to understand the usage of a particular class, method, property. Usage of the class reference is best only after a contextual understanding of the entire framework. - - The Wiki Articles: + - [The Wiki Articles](http://www.yiiframework.com/wiki/?tag=yii2): The wiki articles are written by Yii users based on their own experiences. Most of them are written like cookbook recipes, and show how to solve particular problems using Yii. While the quality of these articles may not be as good as the Definitive Guide, they are useful in that they cover broader topics and can often provide ready-to-use solutions. - - Books + - [Books](http://www.yiiframework.com/doc/) * [Extensions](http://www.yiiframework.com/extensions/): Yii boasts a library of thousands of user-contributed extensions that can be easily plugged into your applications, thereby making your application development even faster and easier. * Community From a3344ce716de3628118dce16b43c9839a35a19b7 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Nov 2014 15:06:11 +0300 Subject: [PATCH 109/144] Renamed application-lifecycle diagram to request-lifecycle in docs --- docs/guide-es/images/application-lifecycle.graphml | 834 -------------------- docs/guide-es/images/application-lifecycle.png | Bin 40097 -> 0 bytes docs/guide-es/images/request-lifecycle.graphml | 834 ++++++++++++++++++++ docs/guide-es/images/request-lifecycle.png | Bin 0 -> 40097 bytes docs/guide-es/runtime-overview.md | 2 +- docs/guide-es/start-workflow.md | 2 +- docs/guide-fr/images/application-lifecycle.graphml | 838 --------------------- docs/guide-fr/images/application-lifecycle.png | Bin 42728 -> 0 bytes docs/guide-fr/images/request-lifecycle.graphml | 838 +++++++++++++++++++++ docs/guide-fr/images/request-lifecycle.png | Bin 0 -> 42728 bytes docs/guide-fr/start-workflow.md | 2 +- docs/guide-ja/images/application-lifecycle.png | Bin 40306 -> 0 bytes docs/guide-ja/images/request-lifecycle.png | Bin 0 -> 40306 bytes docs/guide-ja/start-workflow.md | 2 +- .../images/application-lifecycle.graphml | 834 -------------------- docs/guide-pt-BR/images/application-lifecycle.png | Bin 40608 -> 0 bytes docs/guide-pt-BR/images/request-lifecycle.graphml | 834 ++++++++++++++++++++ docs/guide-pt-BR/images/request-lifecycle.png | Bin 0 -> 40608 bytes docs/guide-pt-BR/start-workflow.md | 2 +- docs/guide-ru/images/application-lifecycle.graphml | 838 --------------------- docs/guide-ru/images/application-lifecycle.png | Bin 35141 -> 0 bytes docs/guide-ru/images/request-lifecycle.graphml | 838 +++++++++++++++++++++ docs/guide-ru/images/request-lifecycle.png | Bin 0 -> 35141 bytes docs/guide-ru/start-workflow.md | 2 +- docs/guide-uk/start-workflow.md | 2 +- .../images/application-lifecycle.graphml | 838 --------------------- docs/guide-zh-CN/images/application-lifecycle.png | Bin 39966 -> 0 bytes docs/guide-zh-CN/images/request-lifecycle.graphml | 838 +++++++++++++++++++++ docs/guide-zh-CN/images/request-lifecycle.png | Bin 0 -> 39966 bytes docs/guide-zh-CN/runtime-overview.md | 2 +- docs/guide-zh-CN/start-workflow.md | 2 +- docs/guide/images/application-lifecycle.graphml | 834 -------------------- docs/guide/images/application-lifecycle.png | Bin 38617 -> 0 bytes docs/guide/images/request-lifecycle.graphml | 834 ++++++++++++++++++++ docs/guide/images/request-lifecycle.png | Bin 0 -> 38617 bytes docs/guide/runtime-overview.md | 2 +- docs/guide/start-workflow.md | 2 +- 37 files changed, 5027 insertions(+), 5027 deletions(-) delete mode 100644 docs/guide-es/images/application-lifecycle.graphml delete mode 100644 docs/guide-es/images/application-lifecycle.png create mode 100644 docs/guide-es/images/request-lifecycle.graphml create mode 100644 docs/guide-es/images/request-lifecycle.png delete mode 100644 docs/guide-fr/images/application-lifecycle.graphml delete mode 100644 docs/guide-fr/images/application-lifecycle.png create mode 100644 docs/guide-fr/images/request-lifecycle.graphml create mode 100644 docs/guide-fr/images/request-lifecycle.png delete mode 100644 docs/guide-ja/images/application-lifecycle.png create mode 100644 docs/guide-ja/images/request-lifecycle.png delete mode 100644 docs/guide-pt-BR/images/application-lifecycle.graphml delete mode 100644 docs/guide-pt-BR/images/application-lifecycle.png create mode 100644 docs/guide-pt-BR/images/request-lifecycle.graphml create mode 100644 docs/guide-pt-BR/images/request-lifecycle.png delete mode 100644 docs/guide-ru/images/application-lifecycle.graphml delete mode 100644 docs/guide-ru/images/application-lifecycle.png create mode 100644 docs/guide-ru/images/request-lifecycle.graphml create mode 100644 docs/guide-ru/images/request-lifecycle.png delete mode 100644 docs/guide-zh-CN/images/application-lifecycle.graphml delete mode 100644 docs/guide-zh-CN/images/application-lifecycle.png create mode 100644 docs/guide-zh-CN/images/request-lifecycle.graphml create mode 100644 docs/guide-zh-CN/images/request-lifecycle.png delete mode 100644 docs/guide/images/application-lifecycle.graphml delete mode 100644 docs/guide/images/application-lifecycle.png create mode 100644 docs/guide/images/request-lifecycle.graphml create mode 100644 docs/guide/images/request-lifecycle.png diff --git a/docs/guide-es/images/application-lifecycle.graphml b/docs/guide-es/images/application-lifecycle.graphml deleted file mode 100644 index 533eaf0..0000000 --- a/docs/guide-es/images/application-lifecycle.graphml +++ /dev/null @@ -1,834 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - usuario - - - - - - - - - - - - - - - - - - - - modelo - - - - - - - - - - - - - - - - - base de datos - - - - - - - - - - - - - - - - - - - - - - - - - - - - vista - - - - - - - - - - - - - - - - - - - - controlador - - - - - - - - - - Folder 1 - - - - - - - - - - - - - - - - crear acción - - - - - - - - - - - - - - - - - ejecutar filtros - - - - - - - - - - - - - - - - - - - - acción - - - - - - - - - - Folder 3 - - - - - - - - - - - - - - - - cargar modelo - - - - - - - - - - - - - - - - - renderizar vista - - - - - - - - - - - - - - - - - - - - - respuesta - - - - - - - - - - - - - - - - - petición - - - - - - - - - - - - - - - - - - - - aplicación - - - - - - - - - - Folder 2 - - - - - - - - - - - - - - - - resolver ruta - - - - - - - - - - - - - - - - - crear controlador - - - - - - - - - - - - - - - - - - - - - - script de entrada - - - - - - - - - - Folder 4 - - - - - - - - - - - - - - - - cargar configuración de aplicación - - - - - - - - - - - - - - - - - ejecutar aplicación - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - 4 - - - - - - - - - - - - - - - - - - 9 - - - - - - - - - - - - - - - - - - 10 - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - 8 - - - - - - - - - - - - - - - - - - - - 6 - - - - - - - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> -<g> - - <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> - <stop offset="0.2711" style="stop-color:#FFAB4F"/> - <stop offset="1" style="stop-color:#FFD28F"/> - </linearGradient> - <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 - V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 - c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 - c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 - c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 - C1.378,56.689,0.5,62.768,0.5,62.768z"/> - <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 - s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 - c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 - C40.445,49.917,26.288,53.051,26.288,53.051z"/> - - <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#74AEEE"/> - <stop offset="1" style="stop-color:#2068A3"/> - </radialGradient> - <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 - c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 - c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 - C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 - c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 - C12.523,47.135,12.878,45,13.404,44.173z"/> - <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 - c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 - C47.754,49.045,48.006,46.574,45.777,43.924z"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 - c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 - c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> - - <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#FFD28F"/> - <stop offset="1" style="stop-color:#FFAB4F"/> - </radialGradient> - <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 - c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 - C36.627,4.945,43.59,13.158,43.676,23.357z"/> - - <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> - <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> - <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> - </linearGradient> - <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 - c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 - c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> - <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 - c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 - s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 - L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> - <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 - C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> - <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 - C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 - C5.569,6.97,4.903,13.375,11.151,17.751z"/> -</g> -</svg> - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" - xml:space="preserve"> -<defs> -</defs> -<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> -<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 - c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> -<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 - c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> -<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> -<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> -<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 - c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> -<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> -<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 - c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 - L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 - l1.46,1.834L31.04,45.982z"/> -</svg> - - - - diff --git a/docs/guide-es/images/application-lifecycle.png b/docs/guide-es/images/application-lifecycle.png deleted file mode 100644 index 554d64bf47f5fd3340ab0bf6d6ccef20a072cbbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40097 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + usuario + + + + + + + + + + + + + + + + + + + + modelo + + + + + + + + + + + + + + + + + base de datos + + + + + + + + + + + + + + + + + + + + + + + + + + + + vista + + + + + + + + + + + + + + + + + + + + controlador + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + crear acción + + + + + + + + + + + + + + + + + ejecutar filtros + + + + + + + + + + + + + + + + + + + + acción + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + cargar modelo + + + + + + + + + + + + + + + + + renderizar vista + + + + + + + + + + + + + + + + + + + + + respuesta + + + + + + + + + + + + + + + + + petición + + + + + + + + + + + + + + + + + + + + aplicación + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + resolver ruta + + + + + + + + + + + + + + + + + crear controlador + + + + + + + + + + + + + + + + + + + + + + script de entrada + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + cargar configuración de aplicación + + + + + + + + + + + + + + + + + ejecutar aplicación + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + 9 + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 + s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 + c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#74AEEE"/> + <stop offset="1" style="stop-color:#2068A3"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 + c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 + C12.523,47.135,12.878,45,13.404,44.173z"/> + <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 + c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 + C47.754,49.045,48.006,46.574,45.777,43.924z"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> + <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> + <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 + C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> + <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 + C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 + C5.569,6.97,4.903,13.375,11.151,17.751z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> +<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 + c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> +<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 + c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 + c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 + L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 + l1.46,1.834L31.04,45.982z"/> +</svg> + + + + diff --git a/docs/guide-es/images/request-lifecycle.png b/docs/guide-es/images/request-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..554d64bf47f5fd3340ab0bf6d6ccef20a072cbbc GIT binary patch literal 40097 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 El siguiente diagrama muestra cómo una aplicación maneja una petición. -![Ciclo de Vida de un Request](images/application-lifecycle.png) +![Ciclo de Vida de un Request](images/request-lifecycle.png) 1. Un usuario realiza una petición al [script de entrada](structure-entry-scripts.md) `web/index.php`. 2. El script de entrada carga la [configuración](concept-configurations.md) de la aplicación y crea diff --git a/docs/guide-fr/images/application-lifecycle.graphml b/docs/guide-fr/images/application-lifecycle.graphml deleted file mode 100644 index acd21ac..0000000 --- a/docs/guide-fr/images/application-lifecycle.graphml +++ /dev/null @@ -1,838 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - utilisateur - - - - - - - - - - - - - - - - - - - - modèle - - - - - - - - - - - - - - - - - base de donnée - - - - - - - - - - - - - - - - - - - - - - - - - - - - vue - - - - - - - - - - - - - - - - - - - - contrôleur - - - - - - - - - - Folder 1 - - - - - - - - - - - - - - - - créer l'action - - - - - - - - - - - - - - - - - effectue -les filtres - - - - - - - - - - - - - - - - - - - - action - - - - - - - - - - Folder 3 - - - - - - - - - - - - - - - - charge un modèle - - - - - - - - - - - - - - - - - génère une vue - - - - - - - - - - - - - - - - - - - - - réponse - - - - - - - - - - - - - - - - - requête - - - - - - - - - - - - - - - - - - - - application - - - - - - - - - - Folder 2 - - - - - - - - - - - - - - - - résout la route - - - - - - - - - - - - - - - - - crée une instance -de contrôleur - - - - - - - - - - - - - - - - - - - - - - script de démarrage - - - - - - - - - - Folder 4 - - - - - - - - - - - - - - - - charge la configuration -de l'application - - - - - - - - - - - - - - - - - créé une instance -d'application - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - 4 - - - - - - - - - - - - - - - - - - 9 - - - - - - - - - - - - - - - - - - 10 - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - 8 - - - - - - - - - - - - - - - - - - - - 6 - - - - - - - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> -<g> - - <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> - <stop offset="0.2711" style="stop-color:#FFAB4F"/> - <stop offset="1" style="stop-color:#FFD28F"/> - </linearGradient> - <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 - V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 - c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 - c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 - c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 - C1.378,56.689,0.5,62.768,0.5,62.768z"/> - <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 - s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 - c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 - C40.445,49.917,26.288,53.051,26.288,53.051z"/> - - <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#74AEEE"/> - <stop offset="1" style="stop-color:#2068A3"/> - </radialGradient> - <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 - c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 - c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 - C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 - c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 - C12.523,47.135,12.878,45,13.404,44.173z"/> - <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 - c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 - C47.754,49.045,48.006,46.574,45.777,43.924z"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 - c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 - c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> - - <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#FFD28F"/> - <stop offset="1" style="stop-color:#FFAB4F"/> - </radialGradient> - <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 - c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 - C36.627,4.945,43.59,13.158,43.676,23.357z"/> - - <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> - <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> - <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> - </linearGradient> - <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 - c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 - c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> - <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 - c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 - s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 - L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> - <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 - C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> - <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 - C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 - C5.569,6.97,4.903,13.375,11.151,17.751z"/> -</g> -</svg> - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" - xml:space="preserve"> -<defs> -</defs> -<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> -<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 - c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> -<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 - c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> -<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> -<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> -<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 - c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> -<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> -<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 - c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 - L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 - l1.46,1.834L31.04,45.982z"/> -</svg> - - - - diff --git a/docs/guide-fr/images/application-lifecycle.png b/docs/guide-fr/images/application-lifecycle.png deleted file mode 100644 index 22ce9d58ac991fb2dd4d3db208426b17bd2031c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42728 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 xSg}oei8IJQ<}&D?HVPPZ04? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + utilisateur + + + + + + + + + + + + + + + + + + + + modèle + + + + + + + + + + + + + + + + + base de donnée + + + + + + + + + + + + + + + + + + + + + + + + + + + + vue + + + + + + + + + + + + + + + + + + + + contrôleur + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + créer l'action + + + + + + + + + + + + + + + + + effectue +les filtres + + + + + + + + + + + + + + + + + + + + action + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + charge un modèle + + + + + + + + + + + + + + + + + génère une vue + + + + + + + + + + + + + + + + + + + + + réponse + + + + + + + + + + + + + + + + + requête + + + + + + + + + + + + + + + + + + + + application + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + résout la route + + + + + + + + + + + + + + + + + crée une instance +de contrôleur + + + + + + + + + + + + + + + + + + + + + + script de démarrage + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + charge la configuration +de l'application + + + + + + + + + + + + + + + + + créé une instance +d'application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + 9 + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 + s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 + c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#74AEEE"/> + <stop offset="1" style="stop-color:#2068A3"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 + c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 + C12.523,47.135,12.878,45,13.404,44.173z"/> + <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 + c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 + C47.754,49.045,48.006,46.574,45.777,43.924z"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> + <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> + <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 + C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> + <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 + C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 + C5.569,6.97,4.903,13.375,11.151,17.751z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> +<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 + c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> +<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 + c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 + c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 + L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 + l1.46,1.834L31.04,45.982z"/> +</svg> + + + + diff --git a/docs/guide-fr/images/request-lifecycle.png b/docs/guide-fr/images/request-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..22ce9d58ac991fb2dd4d3db208426b17bd2031c6 GIT binary patch literal 42728 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 xSg}oei8IJQ<}&D?HVPPZ04? Le diagramme suivant présente la manière dont une application traite une requête. -![Cycle de Vie d'une Requête](images/application-lifecycle.png) +![Cycle de Vie d'une Requête](images/request-lifecycle.png) 1. Un utilisateur fait une requête au [script de démarrage](structure-entry-scripts.md) `web/index.php`. 2. Le script de démarrage charge la [configuration](concept-configurations.md) de l'application et créé une instance d'[application](structure-applications.md) pour traiter la requête. diff --git a/docs/guide-ja/images/application-lifecycle.png b/docs/guide-ja/images/application-lifecycle.png deleted file mode 100644 index 1a47ee99dd5df6b3f8d9a59ad21e003f265940bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40306 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 Z3XP=4&l+RdW9~@TZq8qSb<-*E+~4F#ey0Ec diff --git a/docs/guide-ja/images/request-lifecycle.png b/docs/guide-ja/images/request-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..1a47ee99dd5df6b3f8d9a59ad21e003f265940bd GIT binary patch literal 40306 zcmce;cUV(h(>Dqcq^WdJYUt7x1f)km2q2&!AYG*sdhZ~DbO^nKB29X4(k&=Wx+HX@ z2Bb+hg!1j^{oL>Ke&?KjPp&IrXOlf^)~s2xX3hL&MLyP4xlYPJiid}HT@|XNjfZyy zjE4s@C%y{YIUMj{!NUv2Q&oEK)O&g>o5-8SazG);mt-jX-&7x{yrwhZHn4D^~~#dwJ|^`VP8=w;U%0+7JpLUbHbPz`@hn z)5^0>^dKi-VA39F?Eih!FL*Jx^1$9gQ398nMu;Nju30VFm! zndNKy9GbZ=reh5y9zgK$C@5UV-Rv_onzR%FTCN40&x0fo0vpFFOrE#_m0ePR$?y3;eTTNHCG+CZ1deiFI)3w>>6D-59(ZGwFdP$X zfw@*`n=}*aj1KJO9+tPi^qVctDSGjQ17RT=?=@>BJlmCxG6ie>lu>mEIcm=6T4Ovu zK?i*2u9mZ15TcDPw6E9f5)MBpdUBmu>WID+&^E@-{YKZt??508LTm#TS?8^JSU;VXgI%1m*dPAEFIJw3sAh#QDZ za%0!Hv(P0O#V#5>)$s)m``es|v--v9lgrN8WOBbr3-mR_R%E-UwEJl)Z)fvSzn;$R z^yf*p<{b71pJCljd;&AA(_Tw6kNSyb0wlTzcKv3LAqD$jgc@iOZ^s7E-!S9qSAg7QNdT=?pAW?Tbff9;s zP~BQDbUFyOJGMN_jyP*L`@lUFD-dwYYAC=86Li=-Fg)jFOv{3{)>*`qWk_np)TyQ? z#JAP)7|Z?92{_G)FbA#W!ae$x83*kjK3GCy1ZRtc)|kR&hu74~kTg>lfnJx?@JOn7 z%dR8P{k4$u?$6>=vOJ4eUE;%#K>Ztt@6|R!$6nK@?N&kB`KG>bu6C!*R~T`h^+1Ho zWuZn?r~N|eGJlokrC$dx)c?nC+M`>D_RJpc<^`)XLZ=z3`aU;m0W>W7s#M_I;LdN4 z<{Fc3{{Slj0{lMchW7l0tS3Fe`Fzj&!{W!cMy7)$%%G<-s5pp(pEZ%aY=O-9a4|Y7KN*~}h zi)}#N44tT>-J|C3o8%I@C$@&wncmFTfkCPuK+% z91Px&G_1d~N{0B|;iz#P)cEXVX%m%bacW1HIKELFK2kZPDq9yQa1Lx-4 zkHlzinOq_WDFMT<{LYol4?oaX7IB6g_q!g!)8f7R5JBTBwQ<1t5ON{W-FZ=0ZM-1P z^AOTd-!iCZ7AHTr*_`R7_-h8RY#_Yg;6lu=`qt8%v9Ak$i~g9J6_SWz%6C`8X3&?C z(?Zv@yNf>*e|Q zsJz;v@_CS;V}q0J2xTdYXvn2cWZ`hqckXA?d&XGHl9)nw1d)Do*Si2I|4M8hk-he> z($H#K72kl}Uxxo-%J$+U_B@2)=@fUDpk{h~`M4gW!Myoc`pIajh?#M#(fr^EQqDTFnb2f`!!)Np}MADifH zcv2#DoH-J)f4ulw|6Z-cruJQo-)&GxFdiNlY|A3pi}vmI8!s*-?ftP9XU3|}bbZ8)?mdCeW=sj?=wB{oGB8)~aC>vLDkA zuqYP&@NSJEnZDTmj}Pjzy54XGA+krUjC)QwJB8--=B%^^JO9y17k0lH>EKN(7(O;3 zOZ?WHkPj%IGrvFaN@$Sf?pNEejHZL1Jx7%@7@)Nh@ zt{a9{On+%+sr+i8S9$=k>A6u_`NhxYJPI&>$h^^iF2~UqS)RP^dC@w8l}b9uz-bsqp_`;% zec9%JC>54J+DJScLQ6<>+Bu52|LZMSOaQCsNr|q6sIM87gKrpM7()Mb6ZZUP17?=e z?QJ-59?76!yf)yGKp@0@44{4V{2aFeaZBmcLtZ?*A67J>P17tAgq_b7#&nUBuK!R0 zi_(QYdZ6VwxlfT;MP)niCYVCuk1@ryfpbLgfi)9wX8>mgcMXvKOp=RO|p8gM{DDH4kal$zrAk{rxaGkUIYheNIUCdE#>iY!R~b&?VT zhnQ!+hGr_1!5?KYn`dfE5dshXTXtv@MoP;vzP`Xso+4;;EGMdULv&Mct1^ZMY&i1$ z3&m2-W+DZ_%9{bA1p`-(Bu!30YQ#`0#i9b&)qbsHVY7=$KHW0+GSiOJSq3pX`znL_ zHI`VP&N+*O1h}bHjv@E(t-F0iceVGw6S4aLY7jkbH*Rs&3Ow8Ei4Xd{7*3vv_NoaV zPYdqu?(SV3NF%B3BqN4?rJ;y3cP$tq|I74uy7(X}9G0{1T_UZ1e0VjM|B&pi2)nX!p+9DSiH3r_r9$B)lGf6qFg-VS;fk`IRU~n+-2G#*~|6d=8y!1=8i;5D$qxo3Od*U<_y}i|%9p?&7JA7ZJ@+gb6M@1B* zuGIN38RRL1$xJVVUJ`&nfE)m0iqks+&Lo{eXu=G?e${M)=k_!`_IMj1F!lJ!Em5l& zS})rTRCTWZ1qS^xb-P@=drApbO_@Li1+?NH5{Y!6mvW!Zx#KxGnmGWTR5=<7d?w0t zFLhr)qnvH(D;7V855UZnreIf+?sI^P zV`6BE%>Ik?RnWeri2Oblw;dS6t8^(bZrOj={@)@^Ze$hKE7e{#tE~LR&1x8(*T|8__EEc9Q*2{w#VrHH4-tWU18VJ0^7KhH3ES!YtKGja4}?-m>Q`R88WJ6zgk!R%P6>5$6|;_pikM2wn6E zFlfKtzJ04cZzum$uGM{my|G+Bbw@)!$wTpVRl*IkCu|whVvjSges4-0ZPH+b{WkR@ z^2iNPkh_QI>3v2_j59KSXackFTPWqLgzcH;_#@<&8rJiBnVtc+`(c_x9|gHq#*FCW z5cz5$GyjWHF^lR1*3xJ5%eM`rq>yo>w0yGzLB#m@fZcci0h^Qch9$MFti00L(1cu^ zpO{H{|9ac~4f8R>WV-?qo($yc>;BWDIpP&neFkzlt~Q^24j9Ij@Oo(B|m7Qdqd`59pBhG+Eg!6 z3)KEtDVgdM_=ULFSh>4D9i(0Im@VVZ3xzVXGX({O!cNSPg&wlnOc-D+wYu|EZEZML zm`g1g-j~F~ffKkZ^{_PDAAhReGUM9D!sld;kirMAuh!jmec1{NIqG2z>PGqd9}G&k z4$GeO0z@bPgFj3Bi0x7|DCp8{2Q*f!#ae3Ex4V?=IU(e90A^M94d5QY`U}leDJmdu zID*-7QE;h7m?~y}wXl6ggKQvRzt1Q01sm8v6>`Y^))2e6g5B*(OXAUD$MKUGNuV_R zB8gk0-yO8y#W7=flqOoFgB4G8zdzpOK~_$p=eu*I&SO)r8D%bLRRE4$Up=d>nFj&9JxOV5dPKU3@W=Mm} z^4H(C<@(jBH<+cMgPCHMhwG!Ri=V=N+olPb)Sa?z1X!G&>^gOz(t>{*rs`EYO*izN z#-U1{D6+G&FBM}m*D6bsg}MO4ggm3>(R?&!?NOzIFaXRa%J7Zbg0N}(Gt+=0U7wAj zG|qeXo(2Mz>Nh6axZV4S@6k`%E_thO=`RQYB<0@AfcFqf+T^q#r`nUY>7x=)UirlR;jZe@W_8!8v6FVw3`+cVwvv zc@!O?dYVw|r)dE!!w>R9=P|mL&{)WrDtJ#v(@VibcK}wq1 zE?wgBkzA8$^wu22Rdzo(nJ-yip}dQqNB>v_BJw~Ueis-5tPz=_A>KH3x!ISfv~cm` zwgw-iPfx0m*D8cXrN6_;7=8PP-3s4?VWnYXh4~9$f+0^#$rkpC&yv50CHnjXOtq4WQBki@*5N9x_(uqVQZyz^a?-w1GF&E2o*UnQQ+*G-4 zUAZjN-)0`NaflG_Qj1p7WDNLJ!ND#m z>A5u-crsmr&hgWXq7$?e`|N6stT50?YP;cNAW?~4ITQeg?aK>RullKl@O2525xsd< zJ#qT$x;jNFIZR-;V=teJbO^(!7oallE!ix<@*Vo7se+eW-Z@@ZaWU)S+cJ6o*~Rtc zTzzk>SftHkxr>%+%dX2HVS}aG7Yh6tbD|@@+t>`|)m3yZ+?Q5O&AscnWS8S@P~s>C z5IL&^Pp{%yA$@Te!}-xW&A~FB;>OC;YQOETvk{qf=Gx|wGh@SBKQ8KA9w}x_)wWi! zGI-BXQ61XqZiYPR%&Nb-vi!b`RxU$T9v&kImiiP?WezCD-uTgy5wOC+=IJRYo~s7u zJGeEzeha$}am{?*A~evVG1ul5A5=ASvJ@@MEj7q|PN*v%U;K_GGCGJx~k#$yu9nV2f=QeTjSHjgL#h z{3;zD4ehPUmigQG-xq?CR*xp7Fb9E^A*eOi02s- zrEe-2so-z5darVDO`CB_1}NC+l|J9ST!h2zQu?MRFR->N1d8#byF zqT&n-2(Jjnz=*a!e1L2oIm|Q}?7BH5A)dXOnW>YR=--;G{oMM)rdZKze0FrWU_6dR z_NPl`_3+P57GTjL2xBw@ zi)-dxQ+B2S@jObp6GcS>mfYN%+MWdirS@4yCsT~GaQt!k$*`47-jy2`F!sI;U`Hm*LY#(2RkYHrnM{s z$-GG`N2k*}-Ax~P!PD*ik>ch1+~B^soWp4n6O|4IxsqlT5(DudwbrdG`{>-DuR%iF zJq1Z7h%w7XIq(js&P|yJ>*e+$9=0~eNc*BoPIz}y2hvcQe9$6Z?@Ag`Z7E&gS`eUa zj0UvIO9Ogc=a;-lo$VL?=?c5S556Me?fLc$^N@UYyZ)SvK`zHOMLEw*>UA&0M{f+L zMB9oU?LITnJG%T-hDjf(t9xXlYe09CWOSOMINhF+Szy`lcV9)Em_@TqT zeo4X=5l~_+p;AySYKi;_b*S z`}2Sozty-}lb|TWc=%ihUjPPv=6VHw8AHsC>PNZ{VP0k(dw} zB!1Y*$12UdzjuBoX;ClGVC0FFM-^|huRq_Y32a~=|HyKAQdy);N5fzWCEuy4XHm?c zH`sqIyvE)GRyHA3^5({87;O`<&lLnm(Xs5W4Z=LGb!}F)RRmH@3n&P8o^HO4dX2ol zUY#ukSh)=(_MK+7ok{y{`++8}S!X*J>pTHxt>uO|27@seZzwa#Eid5&R)1gvT2IP6 zRd3y#X}S)578!v2PC>zZOTAfVCSvnBMm&M8>T>dWxyw?NU=>XHFW*9!G;E;Avf>ByAZ9*YGHssx)r~}{lzT6 zbf@#+M){TZ$Aiwt1L@O8Wa@l7?aQ9Lm!1#Q6srg7RII}cN)wkT-7K{4CQ`d5lu?i(_G@Ni7*-b`B?XB^RJ{9 z%0|wy?y~b5JGlm=d3v;e48@e?aPB6yZ>iI)w;QP|;1em9@9O-3D8r$9MV*6<@r_uG zR3&V?mwY@k69wxXlgs5QAsLl^r(bRF6lJMt+I(Qv_YAZY3pmry!pOWdbLE&XPclTU z1u~rTyMlkhRKLvBWf78`SF|$cklxC9hfzR0^tmZ9kG9qjJX|UbyUE;f18}PBZ~c}7 z0~`9I$ptmD6LC%lJ0`Pvq+bVG6zwyht2X=Oqq989c=x!F2j3<3#<;Z47Dai6o^J;^ zF=$EJTAw`84Mt>k(29JVWgt6Z4kS4agT$|?kJcS|pz?gOpQuXK*0G9#GZJbA`8z~g zG*+pNl&|&`>ZPmKqw58oGeJh<#NK^_5zfVic zArR!W&c8V*!rt~hv6={(#_Let?=}c1&A4uY4e_!^KS=ng-6?%8~1n)BC z8yk3In|`wJk-FCU$OqqDJm!m&?dFA4zkNnd`U~N;ye1p zwq3Uoo0*z3a-)2?Cmu*EtY;?!8;ad~{LgWr0Eita)VGsb3gmh|b-y-cLWvY$SNmJZ zyOf`g9Q2RAecJJ`7$0eM6_J8kHB__HOPsV#qd7W}pV?U225&4ZC(db-+`6@JPrZ}X zjy^s6b;XkgAt&Uq-?;#Of?&r=^Li@MxzpFn!#WpEB6zMDOLE}%@$1|OCB^$ZLY!NG z-x~@Vo3`*2+2_N>1sS{7fAx#KYb^KmeU}iYD7qP4;mA&}Cq_3lJ17J;ELcn?SHJ%? z>a64zy7w79rAq=u`I-`!MU9C<6ZxG>PFe~Mb|XK;>PhnJCxez&;Xmv0cdhGul&)+C zxq4dE^9>)E0fPbbkb(jNsZxPB{`9#5eET55VWj74t+uIF%-v9O`%;LE(qLR^1>v0F zAvmbHZ65kEw8K-8@H18X9yc}9EvGcN?DE#jI_m~S1t68^5P)U}OJ9BeJ@_X6)R@l7 z%#N$CEi5vwg#AG3Y1Fvp7WGW3hJ;4VH_XYCB<((^9036kR0X;Yyz`vnf`hg2OP}@A zoK=6bGctXtFD3#S`%VmXOE{`j5^oX(-R+(4?l;)1MMd;UL3y_;zqa z@PD^X{`Fq@?=sTfvWR#gQv)Q#!a)@1wvu>56It&XF$cBccF2pq9?s_bT-{H|mT2It zOoKI9=a438J4lm>Lr9SrxGpcr*x;%D&<){0U)yI>*s%$czrFj9tV4neg^~>Q{AP)J zS9kq7ybj0MFGE3fr5%)EnpSAfMzSw*91QXrO=vXlv5Gn*i%JApdA0i?#Pj}XuuXkc zWk(fhZ)=mQt)qve^wQuQm4P7RKXJ%^Lz-KS;6++;X2vsQU3y7otv+Glpf3K@^cP|! z@&ws}twt7X@wB;W1Ty52^9Fq9CMAC-3GzoMD8G@_$ae~17BHh>q4EAqw4?n@a%oVN ziqZw9M*#<3exNH?2Id6tM-dwvVPO;NV<0gaNah#6gW%cTU zjyz`O=anT@NE73WN!yhd&6Lr(JdF4msWo)nb|GS4*}y^pkVDO%(nP*=a1E1(ouml| z)bm~bR^EHT5yVDsC@F-!HZ@(ZLmxkW+;#Oj1Ct2**e4k|e-1*AMp{6LfJk_zi(@aNm^*10=pl4#xmhIc0q@(O3??}H#^v2~J8&age zcd?A4H`i`5t1sWghc){V9lp{J|Iw)Y;iu&;wzjjQx9pAU-PSk9m%jx&jxK+3gGWb4 zMP7Cj10l9yj}v?nQqr=Y?BJnijqH54ZP~!xsl^W7m3ghzM+xT%qz@oasp0(INF+uV zVC$ARE)19mrB4bG8fHvS_VCG>DNIsrQ1wbfIZ4=BiVPPPsCuT^R%)oF-xIl&HO+_{ zpuW3q<>%%{R}2=$Mz58Bo-l+v%rR4q4G6Ih_3U1qROvr`@qXYsarpbW;1QqQ_$u~= zbjzR#sD))sR_<9IB|NcU%;=KbOryqXI47GA^fG{#;oh^=2MYJl8gFjh@?rjCmi}ge zaHg=(d9r(W6{CEHJABR8RJ&4 zAV=BUs`@F$88T9IGps%m)S}iibo%|zuc#}*&e*D;C8xjWOTmFEO;MZK|pHaIYc(YjE2Ip+J zK|2wL5FqZSCN$jTNln2OuIi>z8IBC3amCC~+X5>cnXBisT4wsSi8FoV{T-5gs(dkq zX{G^Q_EhKlg}_2|e7qr*+aHe1S@%P|i56?97VmKV9@t%J559cF%ZNpnG`~~UD^GPK z6SkcrQu^{~6!qCe#uGvC-b+aZCmo#C0G#0$nJ+qQXdm+yS|gd#D$UKb;uks^xhdl` zSGFGsy(f+^ts%RA(W%JK@+j)QDeCnjvbqzgcMEtl$ccfA8&I9`{OIh>OZKOz}SsnTMx6#zeY@F3cx za9OKE0t$gZ_97x8W@Ik&aY-tGFI?7<^K+JbAd^eHJu9=oOi!Fhd=k{EH{GSq{L%Q~ zvx7yzSJsqX$&c@2r^jy@Ux62-Dj}X)w>5XX#;>aQRfdBOb~A1_fmDy?RtVQc*g~ zC_s)ubv6pz(oj=%=JZY4)#};ZK9qBv%!0GBamEg8c|UwGEKHaL_xCQ}9;@Ns-bZ~i%95N`AR>{zd$RbT3Pg$x2_R_kF1MMSwF{-Spk1S|g8s1hJ zW9o9cg({t7O-&!GytKmfnJo|Ww%m16|F+eytjF-Ik&TaM2b9>hc+aPJz^;!`oL@X> zeM@*uM@N8zhERh&F@e;!RTfYloZ91>#{<{H(b2ssz#z_@DD=h*_%IBxq{9r`lAtbZYCp#Sn~2P||&5aVW{TAndsw%p$N^*V|273oeu&jOLyIQs*YA!7=*7|4vlnhctB%eN)B|0Lbyql$l8)moWq>7Rvmb91WTwMKPL^ACl?3=&3%JP!@ z>wl*aj-WC=N!F?6{D=Xz>>5T$C}=W^zvZ>nGchpNr{Z4z7vn1@i$z?HvGZ5DGu9#t zAAYKUv8AD!63x=w6Kr+3)fRslEKQHfY87Op20vxq&raTG(gQU5V*BXb0qYN-twLp~ zhLZU>g0SzxT$lIR#aO z#jk0|A)4(!!JJyipx=K<^xtzl{POkcbx?IhHpY(RA2yk=wjEqdNj*0b>bo2|lp&fd zlbo+lJ<@*s0Am&swsGM=JV#FRuQ4s>^*cH_6%#IxEINUi#z#KQ7I>vewXhox0T?#YCQNA+T`hQ1bqHbN4{FvUDN6jfj_Zqr1180)X%ODs=NY=k43Sa=)@2 zcg@@@7cJBEo^v_Plyjmxo&p`?(zh0ICC}GgnCYgWSC1PnWrL938Peu4N11ZDckIAe zQhfYiMpY%HZrN9JUpvhz#|yhi#p4s(m8Ir)JCSyzN1oll#F8@F7t7?W7SG_??8H87 za-0#Ww;oK6jsDudTi!a*wJAMN6r0WIX-<@&vAyi}MW*Y0UeejQM(9~XL%cw`sH&b| zws21za}qVrC7fBFIrT(Z7*5ZiA(6pb)K(QoPj2E>^kAmQJ~y`YB7KY!=C~{$2B^@f z`ytr`C>$2@njy<8K(19Qqil;Guv>jhQ?-r>?^zEt7{a-|FE*>Hr}P2H&g|{Xhu8e? zG>pGJzC^t|PDx}=i@Yo}E7~8~ErR?u#*~~WkFGs-Qt>bPyrj0c=2rNq7*pr5>$JbX zp<;2cHb_M)snQvf!?sX;Q&6RIhyT(DrEy`p@Wof=P&a6*)4t+ce5Mc?dN`#+ekVcx z;yxEqJX4ybQDAEGj0$3Ps3z5IHgIV| zE}fk2h{5P0lEDpn3PPB*U8Wp4^E?=4fcF^MULFOf2RzRB$0s#5`nX z&%|pPyKbBk@38M%9yX0J-i;B$Fb*f66|JB)J*MN+$4pTGimEh`PD4KXXXTxI=8-8C zz~&{kh`{!t)u4aAfjDuv6_R7o>w`>}(c3iuc$zJ#i|8&Tu8lyT7})b(NnR&<&JbA$#&5C@=;oF@^dmMr=J>_&&EO4 z?w3xpWE@gbbl9uFq9$Vf=5W^~Hh6vg*%l+9Kx3yMK3DbSxB$lXS$9wSFArv@zx$VX zhYljM;9uSD@l^JlCfzWgddsfeFi3@or+iHw%SmI`*qa!Y#xR`vi)5iU$^mQnJx#iB z=uzLnzC%}X{AnO8wWE&;e!>je zuQE81HbM1XHkw&+TD-aUbEKd#0WL7d%Z%T0ak%+ZXr$wgNZx{9%A^ENb0q6w|thI`&a8OASdryA}Cl#laa-Y?Mc zmV?H69ztTW+F_}ApncD@31n-OID!rZe(C+3hD`Z0;w`i9Iyx{!vAl!>kWhjN+97i@$1nyU3J#g#qW zYb~8sVjO&Y57q)$59c|B#bOiD3Rck4A+uYz46GyjV1x8fOrX)jT@G#AA2&9Y-%K|b zB+l!1Lsh=u&s0!WJ$<|{5tsa_lHQ>1$i(ih}RGQ*C~rLwYYZrd)c*nk4hsta+N; zFNr@T-kF1C5S<+v9~Ge%p@}l2qNSrv9r?IVAo^PpYGHt-Hit;@^hP%A-&WL12_+v-|Yeac)@{Xr2BnolzGeDKW zYikY%8qp&NExZ@~wR10yPKn_v5z{5?a|dP$kS1V0+)jU3smmEQUrU=5m9NtRaG6kb z1$Jeb3*~6ZH2!PTjuU|dCgW%Qrr10&7CvUd{Nb-Exe|?b3RTFEb*vn7vl-xhBn0zz z^`WV6K*L_m#NMfp$gedfZF=@xRW)bC00}jGI1_+dZ4%;79TU|QJCpjSFU@;3$w75f z4%_1Y#FYka7>zItJ2DI!kh|tq&+wltI^W!jC0JTU3A1L-r zvap)`U|M(IjvdQRi1RG_Y{Iuc2o)UD+IHNpx>!+UA?%(y>qi9NI{<@E13Oey&UwQH zNJ=F(-umC&)92vm>a|`zQC}2~j+LoMF)TPy8+;Wau~isLqEQisAT3_))AZK1*0Ql%Bg1rYu_YH9|Ira779Rncr&AHigwb z?r+GUlCDxo>Y;!qlRzImiZSl=&!E_B3l6q;gui&7TjJ*#0C$8WlI)1s>x}A=EkC7r zN(0h`Xy=hf+*mAEJV4&UCJ{W6ONKzo;wK%Bh)QLB&Dw+4VO5|d32*DD)8J>IF_$6_ zCwST?E48kiY!$1Zt=wWq}gM zp41!)ZSV=725w);AFTYzLjk{{=b+O0)lC3XLttUS4oZx9QlsWsM;76!jOyfOZO-r> zCGN%T1aSCB5WxQjjdzO8EH8w`a+tAG@6S`gCASF-2Wu`6TiD=kRN(zgGh0z1=2f+{ z4H}9dTKFDO1%Tbh@5oF5vi8S@3RJ>iy-V`8V4GrZGthnxJwERu1zciUD5X8t3YsRg z4Z{J=ar;&PUx+7>G0gFmDWHdDy3rt62V#tP!L_Qnt~VHt@Gofxifag0qE)-1x+d_? zgZ-s;tbHoKfXaDO>Mz4dp}NAL{YXWK{~Srj)3oYpN($!blazM}+RdMTeg5CQvH2Zy zU+_nHu+72k6GMv1FONw^-#z1_*K-r#VCQ4n%UBg+RT0FD3~dcF;*WCc?{GYyV8+(# zn&*W)HZQEd(n<+`(Y6F+-pn>eI#!8Fg6;2u>I~$59#nD(@_{XxK-$vu?|xM${@4W~gof~|<5g-A_1xW52^n2RV|npNn5gl}=Wo^f`MW5; zfbT3F5}n7(Zso^{geyFy&j}QFJ*zlgaIIf1iV#$jLM1uCdI$XK5OEV)ILl@gEqut# zfaCcWGH9EncHtn^=x`)pk>Pg8mP1vHR zuoa-t{$*;bpO^LYB4iM46tV~y5Ds&o@_;!?A0}&z4f1BiA2^|CFJh-6h1MPq!~_eZ zpp1kP*<*`Mal7N*8j#4{41^K=zfCx!KQ7QY++r>kd3!F>kg5RVuS%eBh+Ac6->H2k znQ0=qs<>cQGQqCSE$3B!ULyNd?rbMoBR|H*zUv((rTBt%UirhmJ2`xbc?+c7uubJt z)F*&xKd5o|-=hftW8+io?qU>1^$xx`^=j@?Q3l4qHrrr5- zRbYX@C*b5&Qc{|I6O0Fx0Kip=iHUEs+`RezjqIyn3#HSeO&)}VlQLxNRWOsB|Ffl~ zr7TVl?K@Vl~ zdu$?8MhjH1vrQA_`s(2~mIr$70 z&DSt@tZ@C-o%vb=snJ5=<3SI3_DT1M@ zT=$l~D8*Z9^~6=La#}M6FuQfeNtpH2Z=yBqnSl})l=Weg5Fp?>0Y1hxPQTeB1r{2b zrzx^YVgOjaq`KocGmyvvz!4&0!!idk-*V;U19Jdu^0TlY^x2mv+IpeZ0_E656&4>Q zI$_f-4-9~GZYHJS*Q=<>+*u&sq6iosgPI2qb^I#dwN)mvikLJ|S+Dhw_^7z@i z94{|)h3G~DvcsZ}DtD%!kr{v^)qOA5*UB#_SUtlWpagWtB*Vz)Q%g#2Zy+lXE8jA7 z^s0+yI(WeXJD(0s+~36R(q{x$Af(ODZuX# zHTLl}k)QDz@L6eDWz;Mb*h=T9mL`<_{33Y=u|jv}={J9xuj2wcjdDW)2j6wH`T!|b zWxT`gUUgdL)mh)9@LTJVH86otN#B@_56HeuHFB)IO8dCsxk;Txp9QOQpFv!;!=tTq z^)2rMcbT@_&BVGJTIh^!xq@O3AnF32Amr>H51VPfkn-b!kw##@$lt|x$zA|n=rBE% z7~7eqO5OV-as6w4YaYNffyi$H6PGG`M;!trF{}o?0OYWRL%cBlsHN3Fs^A0ayABNR zx@LW`GLhSeZ;!9wuvako)HU}X$@gbS?s#Guhmx2~y2|CQw? zvJxqBl%|E^<|QPhdCv=asZJCCX&CtpV2*rK;=gYJK1F#uR3*k-NnRe+X-^z+vixD@ z!~>Y{$m-Log}r2^zv_V#>UDh89jUBgYHSS7fa8$}FU|R%`IgY{hfk>!;~-HSe-Kl; z$LphtJMWj{Xh8+uJ+w9hQn>`{`*v ze>D_{imy)Anj>MS>66DcM(%>od<@_1L<2b0p=se(f97q~8E@DNu5wZ+FdO7x{l~_j_L3HGm>QZdx1>e*v_A4gk*FLnP5p32{$=z^yFS+){4FP z%O2yGJ&5Y%DOFe0qJPe$wGz%MI{&z-b@{%U`k=!8ru2G{M7cgJ6 z5`xzs8p5<1e&mbM`{qWp?X;@D)5>M(5|EddhfPy!$-Iz7eTv;|@Xc#OT0^u@){>e23`j)6L)JY|8w<3RFONr6&AKPjJ2y;1J+^DBz9zcweXBO95}wV0olmhpVmtTE_e1o-V(?;uPLk@rw_} z0}45x5Qf5^l7kdPAaoBk8wiwe*=G^JCBZQV1mXW?8~|#6tNCz_4;~Jn@i!rWEA;#4 zhX6x3Ujv6*`BV3YOK<+^Bk=c6F7MwT;&NyIA3wyk1I!y>-|{E>2V4Vc_oti-NBzGj z{>fSXKYy4wN~ZAcEsy;44jZS*L;GfnpUXSn;#vDzI>ew~H81B)3J#@;;j7o#^L|^kHKSz-S-l5<}pxcg2^;gz4CZxcfJmo1#gaQs2IsVR0sZ~X6@f24qG z7hP)9zX&01oQ#!xmMbV9asN8iIX{==GK47{QqSb@KCtgRouup z2jHA;x|=tD`)XI|u(7e7e6Kc>C-=Mlj|}cAL-N0g*``y*^mLdMhlGTbWumcoqq&sXN&-4&KkSGB9Gv=4 z!f$fiCa($qXS|6Vf zUoC>CqDqg1KvexKxEfqQ%40DfK77cG+x+e$m3!rH4{f8wTSQPL%gRdmlZ^k-0%~B_ z@sYR}y9F>tKmfP_?CSEy!esL@5Rt%_YpJJVo`HR4lk~Ulm<7I%tEa?Kf{PJYtkvHY z`O5vzDJRb2Al$S6R3!gV>^~=&{B!lk_TkuyD0VNmNg~?WzsLf};8X<+=A0PYqejen zmY<;iS`a`!eIfrISmOMTUBTTQ!<{@ru|_a$p>BjQW=U~A-5Cd%uI7%UTZt<=sFR*RIAV7FG%d%0S?ia zwZZznL)G_H#mzS_jEn!ZLV!FtY4@8G!ZMvEzkqiO#C?ub5wkgiLf14iN(?9EWaBe( zmOT+N-pv|xq28&%*DLK^oo*mzecH}t^LD3;$$?W$u&$G4erIwB8J8{-0po>okUMaY zM+<+O#>@Xh*;|KIxqVTif*>NIG)f~St#pIZ-5@P3E#09Y(rg-}R6x2*+MrXq;RtNH zySeKH^qk*!zx&7adE|k;-&i@&@U;*S1<^la^i-2t&WRg;F# z@LTuw_miMr!uo)=GtSvwr;Gsnfl%zQMSiC+oH7u(vmt$NLn)Oh0ySlb?fo zs^{FpQYUf3Ex2yJW%$4Kw(lX{*F?7I3N7Q9?ZU^ZuPAt@L+N&`LytK=uHz|dLFXV~ z)fa<d2hs`Fnfw(KLoTx%P>e%ZCEu zdMlI`#!9sV>L!+r3tsXyHCv%7)aybD2AroWGrQnRA47P4| z9Cd#r{U2piJ*|OO-H*;3dQv$)cMGh&3p}~8uwg42m6>q3dna`j$yX-_X8(0jFoD4A z6%w-EtmAe#P^CAB(yJbyYpAng$xo>pjg%u*ZJFYH^to164!x)?h?;};I8W!Ewgn5w z+%ZJvVs#IW%es2LDB_e zhXo0>?%q!hyV>WeYsp{Bm!i6rL0W}_Lx~)pSBO(3_j_~8nF=TrTx)E^rH0n5TqDp| ze_kxxIk<*TSVZ+YUay>B%+C3Xqn+>|4(REAFjy+8ZP?$OQlYQ%ln>jJJU-2?vR;tI zl;5584*OGvtA!M@$(O=@$aq|8=dW7vTI`Q>gQe1k!SzBuK}+H`Ip+>|oHgdW4A~oth zWn zKp&C6e*JPm*eoY<=3^Wl-gno^+}U{yNn8cg_m&6u+#VBhTFVs4E!5gCbjJW(pt&N^ zb0Pkx*(il?OMsBh+*S)|+?$&y?LZU>)M->({UE$S2?aiokdfPdyhF<$HXqC}mi)O5 z?|_56U!`;3C4mfr5#bk{?`*dp#A5hzhknE3^kRXkRnozsEJ@H?pcnpi)~u?&VtSls zZwD~wz8`C4e184=2No_a)qmue*dF^pHmxzvWj^rObuL2O2n1`O4!br;N?vDs>J}$S z@9dn*Fi1dr;pMrOb(QEnQUObTb=SulCFv~(w~&w|BqRd%Du+bwlJIefc5Ibv>y2;J z%c&zk67juy5T0t1SJt4_sdjkls;ZQvlB*{Bf!)I2=kLNsYYcGB&^|H0+d!_*SG;w{ zb1j>?LG!7(P9UnpzBuBrnPLFKwDLQU(;o|TYT+!f5xa@43g|`BLc5;ecIjWy79d%I znru*I&-%tjs!;R4^PDmPQn8KIgG>!nl0r`F6J~?jueyABPYyQXh`8-uls}Yu{kljU z0dhkbKtG;f!9a*mbHiSzfn$eG;Uff|uSabKI|x-$WK6$B=6uqlBB(z*Zchnwi4~2*w^hd+>=H;mFm9Ey);o(S{?#; z`&ynlDt~}In4XmAqm?$Ps)xXrs~JR+6p!3iyX`zA0R&3g>-8trxoMSnbB>gBjI9=? zb}{cjtV;Ug{0t7ZVj_VbspZL-;;}6$&Es`(=A7EGMJYKIyJB&|pWnZ?V>w-~bE(KN zABLNGhXbeWQoe9)$dPzdtYl%Xta-N2^)zwN-EarnPRv=f4pokQ~$Wp&>DBS|8@Q2j}HwY zdT`O-p8KEA|15V`{`n>N2iQ9q4#)wN`<>x|cLKW8c1n8wZQvP8ZCon;YNzNZ6b@Hh zSgLbgwA|WwYYJn>i0R+bNxCv6A3yt%$Q}WRTM+lDGw~^huF$!&QH>0-;J}A3h%=hX z|Gql%GebPTF3~U*Dw>rM|GlMY)^nS#WoFZo!oTmeJ3HD4pKc8H&&&!q-8pfFSV=ef z;7#i3Wq}Qac`u3$zJpBeQx*MPp`DtfDwWv_~42UsvBi#@oFmiy3)EyVB zyv1~-=LLp0s+#?$YQy@L$|J3X<%oZ2Ng3RoP8J@fthMOh8%CyROwf%l&Oel`$( zuO?S`od=#~7WITDl>#_GipU^h&MLt8v&G?Zu-N@%(I5B*=$R*Pi=aW;Ds(AASV2l* z))Qz;r^OHH=%!GSfw7|Y1+{p_AOb&JeU!d+I^ftK0=M68!AH6_qRrrhUDXyccp;CdDs3nCQqhR7949;rpI>o3gwB`F+7t7(3!n znOXlFP^CkQ_WAkw{NDR~GgW%eN3;G;akGMjh8N^y3CR)ETC(j4ehEo-*cgnP-ul~b z+Pr1ycy+zI=ES2=sbgf;x1JU%3ssD-vNQaq7MDGy(&uldYuSyYX4lqDU4n(*m#ue_ zxY{NrBb#fc0rOOiQM|DG_qJLfC#858?_An_L0ES(Z^!y%4IF?F-9lyYFrwl{XqzcE zq;}85c4?@%%A?Y{UR$6%@hsTKh}!xox4zO3I6KfmG;@F91=31t$s{1xsq3)MM<0!A zJRo6PdTE#2VbPP=n7}vdQh-(R#+&wPnSE~kim|1rel5c~G-&(V*@1KleoCB=&vA+6 zC=0juxkr$-T*l`T^FcbZ-p}u9&yQC?Iu&Q>s*;NcTVeP1Pdd3H8z8e-W>y<+6p;Xu zhb1eQJ!D}ff~9?h_52o8gA45tA$S(UvYeO0Qb*q9$@G`sYd z7vn!KkP+Hm*3Q9vXlidu=tezAtaEzy5H2i)l{l;;loNj%-FPrY6q)X+QZ^)PA$X_i z6kS7A2w*D)XfqDv%aE$D9L;MGe*T;?`)X`U81!nQSgEO2tJvmp%)}rfr-MXPYK$$Z z-siNOAB5lElPuJ&O9wf(fUf>PdZ}_cS{IWsix`lzur$X%68|U{t{h?_vd4s7#3z-G zo;dRvmkgO~IR7@P7RHNYDFi#V`PE(I*khv}LReFYUFklvHf!--L+Jstj%U*rq|xrg z{TuM;A5O9z{n zTjdnzj=3G_5&ZC;>59z@5urZ%)DPNEj)sjQgaw*waLyZ?THg$*y+Uskq;@3gmmXbB zZgW2Kb~i=DH!i=>*R(!q7@w(g?P>@A#=lJEmDN^gn0+xb(@3CS*JZVrmh9l?R8hcD z!NI}7XTzVcixY*Z3UMf6jy`jWpZ4zlPOc#G47TPfkh)>IpWr-okesm7xskM^i}k*5 zJr}9*yw7TZNyplSxX}K9N>XVuR|P-MRWw#dRW9s-eQ(}Np;`iZJNiVN>!D%Xj>##W zz~u%ju*>>B%c$qAbDu;#)P1nEkTz>M0E>#fM(yl4Tq3b@Ix^7EzfE@-?lAmZD2Fho zWK)5*Qc!#DR5;G>yPx@{pdIl+-E`i^W7`wsgNCVL*I%p4{i`|S=iMgP{!6RleUeJ8 zLoNN7wBKpr%VIU=wYg#*R^L>J6(0@GCp)K~Q-o{hgvn&q;Qd)tl}0CXRB*qkz!eO+ zRnjI@;8`KxX9v;Qb(>U(&2}5HHETQFy}MpI0fSs1EHuS2pV(IdvR>e8X=$+w{eo*A zu+Mu9K?_E?{pQ!~_D^40RYR?nW76nug{!x$YpSWK^?m8$MfM%lYS70iBgdMne|Lrg z_9IK6sexuFl3c<8Mn|^0>OFSR0s=nk9J?%9yWhvv7VKu*Nd;lMr`5qEodwmo#opvs zu`R^sK`Pv1br)eI*B4v#{j;^q7q8QmXPguEB>o!RVZeAa;7>LN>s|+GtHKp@0?j+X zW&Q-D$_`IzmJ0^+rBQThPy zP9{Q&9;H<9U{%j|6#rap{MNsBMqy#s>Zx<93@4+Udo>K?9uzq&ZC9<2{luv%fBodd zd3vbg`|1^lcx{Ey*475LvSE?U=wxJ^q-tRuw0z%U18 z(E=Gd+I;T|Jhq?j1Ua;R;8ex3HcQ5Zt))->ye~PMnF_Y{-GWO?OF`CsMDExfJF@tnBe;0f`h> z^J0Jj0T46-N5;ljZlz;kEtl(9&dWyjj5RPr>pO`HpY06NS)r$@Oa!mh7#p|8VNq;1 zAOk3=*O!!(1Uddp6!5HeSf9|Kmi<6EIy$P(=LCE{7R!+*{5Q_0FU~9ZE>3q?TsB{V z{ez){j*gE0gCmf$W?&-(B#~Oo=~3LR2K0;$bv@4v(-0*Pyk6`8@dZ5J?+P;~v}O-w zdekF*xVX6`eQ%+s1DE;uTuP;VJ4N=U(Ur`x0 zxoSkOikm82FjJwQaF=v5nayKYuX;tMXQLjImv`L!sc3KIoKHlbq=iN36W)HzUczTVHTTZo+{Kt95`M4S5FxQ(g>5^lRWiNKA_ zbmOnJGm5(P(veKO(bf_Mh**VB6+{xhnC}wySCOMXMk@ zCQcXD`}1VkvpA?4FyC${)FG$0Zeu*Rem?L~8(UvrUsDJWF|tp33iTRv4>FlGF~RH0QJLDgS~ayZ6)6zoS4N( zqIg01Q5wMx^^c!F_uQu&yuE)rF7I<#jcM<34>Ej!8DlyeUtkwBR^} zNzcCzsd3i>1cDe3+@TziIn}#zET$o*>#RYY-9-q#wgA+9Z!L#%f0rj)QLIS@*{g+4ZP+MkZ=DM?} zsHi=k1rR||byj47gWwW#bXMdod%dYc^&Z=Ct4iFJp^R$x!9u-@oF3aFN1OViFR`51 zIdowAEJO+uwq3ix@4hbqGG4()O;d3>IV;V{iJv}wT0LWAZLRCFyGJs~v*f8r{1po! z`;3db&5Ct`c_`J5GQVr!r`eeoKa6KD?u@pBW?g#fcqhd#&Ct2&{b?EN`f8R{@e)Nv zN}PVdf>G<2QkGZ3W$}fA$-_O|EXBiP0Rbst`sdRH0_7VkF`ozskPXLiDFwEBfF3)a=}6|75n+*o#*r6;|4ng7#MN=x6*v(c6A98ruxYl_Qq8+XWaAdh8~%VN*u;HeMiuVz2)kl ziS>0u+2SH}4gXlvtG2c0H0?;2QBcQe`(gwOEJ8w6NFt$Uhnqj|Q}OfbIMXZoMg=>) zc_u_hZDz{X|t)6Q{U|XaeQyR&SjFy(a%efKVvOyR*1i4p^k!}$ZC=;^~`muw7LQO6DZ8# zGxrG2%v_KibuuSaToEOPDX9*9sQ)EG9riHizUB*bznchEl6idO2bxFl3P5p8uKC63 zoSGpo_iJL7ySS9UgvF%F^g#&XBjtM;fr>(Nae`6CGgFig8+e~JS2uOY^UgFrCR2Kj zEON{(F1b;T+1LM6yI#jrs$TaY-K4r-Yn&5J(_=CN9E_z`YpK&-5qirlX!0Uui5qL@ zQxmfmW8HfMr~9>OJw?XQ8qb0nu{gDxL|EmFTfq{gC8u=1K8 z@v{Q@wrPs17^%7#I+?m}U(AFWK7!(`^1wgtR3s2luiw49we{EFvq4#D$L~tpx(NUv zF-dm~4W_r*YiiawE`6*~&8AJ}z9%thXy(ILwwu1oQvFTQqTw`MwBGfW^afGFN(^Hu zKa25v@!f1A1k5y_))q85iJBvU?Q`voyoyr(w5bHR{>jj;Vb|z$Ff6_~q6Gx@XUgkY zeW6B5k4!uNE-+IerY^4Qnw?z`mNgnXfIvP-c>{M6Sz1-7J5|to@C4+6G=Ex$Ik1y^ z%iU1~wHdzAz_6h)S-I#?hx;xyHFav9QLDb7X0_aH$1#EXh{iK7-24R`Yyh!TAZ%AF z3RN(ovdw9oEOb1d=F8SZ;AXNib#L?bKDcec+HbhIvJ*blqlO5OXFDYs5lXrnahZau zc(uoVF`Gx(8#eP@zjdCBbIgWSvItJLTSz%x$J*lJ;*+>?U7CZtO$!eO1t}oReml-PGZuBJ455+H8RR)bZ?##Kf%bEzwy?5o`D_nS)%h)ug=Dp_il;| z$%P=Q-Lz8Tz6Me{){~$XQu?=4HpWGBd3noOz>izZ^YU|K%Y2t^M4R9R+4vA+c8)L7BQo~rr`ERaA$_)9ssRDBv`_O;pUxGa zvK!^2cJ*j^vM{%F3(|P?ZgsYfw)9bCl1TA$x_aC7HF`>p!Z9#}@1Oj-%Z@!%xlf+y zmVXcZ!735n6LWi`!$zx2Z0e1G`d3@xDl=Te0Rxy!ncK(t0ts8A&r@He`6L<9BLMuQ zjtx^Yf1b)>go3D4hf=E5odf}_2_J%@Jd;mjHO@9MGJ9IXiY@MnG1RK?R}+V3lke6` z@2!=w(YfYPoKPVup?cJQYpIDdJUr67kh!Bn5|6!3#Dvc&5?~pIV;jmcXA{U~L=ZJY z5D{nI+0><9rIGm4euu-~WPu08G$RkS{cBO*#!Q0o6zy;6@LbCG<1W+;DPoQW2-y zYMqtZkKWA=yg7hVwI=Y2p4FR}e(HpCV9*m2Asb1vXP4{f91Mn3W^{>VxC@=J-%7&3 z^nI!n+dJ)do(74vhP@KrT`#q>-QbQmd-@2aCzvP@*S3M|Xx-M|G91nSZV#962k|8G zQF^lFFw7TSv4sGds-3)DKuZu+c}GcWxD;x!N&Mi{BG5ZCeir>16zFW;%RG zovJ-UvLU$BGxDo=yqo&2ZJ^W&{59Pc+W5EK`;4A<^S_W{S72RY?tv|lq}SNFqj-H^ z_6Rk_RGb+d@7~R!;1qDtmelD<;osx2+S%7)vF&`#AEm*#uJ+DHM5$#X6trF4H0&MUnfVRR+CmNmAC<^&gmv?lUszhVMvR=k zJV5h*x#1!lApdspkXoWh?=#X7wUm$Z+ryfcpy`MgzSH&gw=UKct7tfr+QYPQVKHAD zX(%k}-ItplqC{bPk0xSV^mmV>e@g5z+S9@}R+ts79=o+<{9FjyvOx0FRwPzL$tUFh zQCr0G`BtfXGEdBMtK(e~PF3y?Y-R@9-r>?cBzggppO>(Ri{j4E5VEllmP!~Tj=54I zQN5EQ9=i8*te)W;o&R?69V||tFxG8*Nbk|FM2y%Mm5j(5IfPF~C5;5(CDfD!z&*8)2;@z?c`7<-I%j(kX`mS@oV{ zv>TP#eZI|uA9Uid6SaL(r1Y`dtp{QV4@#+ynGv{gn1jQp+YQ2vG@STUV^hCA-uHSq zg8`$pkT>b5h7s9v$IuY|+%{HrssHLn*eD=kWCjZewe4p_eG(wh+#0Bzu#wDY&&LWD zPOupO=D3fKijgsx6j2U)A$mMF)C z*{lk~-^(h(0pA_-mhD~9%iaKb8%akIbQ4bE+luU+gJ0hRcTICRzg-2sI8+`rqS3=r zf1$IAa$6!416HW+->MKNkx)VNMH{h%yN|3}|4|1-egh#`*mC3qSHq9x0D{hfdnu+l zVFP8~S4C06hYR)e#%d>}sKbcK-780w!OCNv?&D#M1ADgeXl__%p`D7XKn%e)5JLkq zLEC;`&9Qr#6PD$>uG&KPo`+f-P{%_$PW*OHza)-m$PRD#t_AuGP)?;R zk?2PH>^cX*P{(^>wS+iCgSh-2kwMNr85uj}vvsW?Rq+oTo{C~&M6}k{)~ZUxieN1- zRex5QgW?clxXheJ^&<{yrmio0ordD$-TSrAg^u%3+6X_RhJ)_KfY0ooMw?aEKl)wk_TWc+IHf^4fw z1me9+3vXv=1aAO z5_I&g`#Lw7ujAwp-ImBVc_ZJQXNIC&>Tk)F+^Zj<*WQBWxx+h-Bys;l;bHw&nas47 z7sBWRasyHiD};x$c$x57-uKGeM|~gjx;I6m%p|yxU4L#+mA?H22q~ps5;IC zB&LNB4av*zxu2|oW1RNajJuP#hlzNx@bNPBtOS+L9lSALWK(%@BFuBA{}%27S{8Ad8AMETbd+jF!b({q5;jMm2v+K8m_w z5s3r%_dc^g@35z~{IMvFyUw@e*qyl&hTM%`YSPfB`l+#o6;C2u+9Z{Y<$#@_qrOa2 zXW*SuXfmiciUf)QA=|pzAV~9VHddBR(y=v~nYu_P?(k1)o*+`X9LsCZfz()CjfmX0 zRO950Wc$ymjyPyoO7L9LO?r6ZUmjYi%S;XEEcAWZ2$DRSW%e4dA_ zudH6pgcJU-_nN{=xag?Jx*Kezh~Hup*m?FH9{p)!ISMtEY4@HL``HVeYxE)!8kiH- zdFq(waG0LV24VzL?v?qSNi5I8R_$UtcLee%kkY$%&XZ;Z^u|(Tj;H5K7Z$2Bk-3o; z#4Q7&gA*x4NqY=`W)uCK|FxQw{5wH|_a{rq`R%IsnmwZ&efyU|Uk|C;c&0@(W{H{a z>Dtb?@W~Bn2bId#T0WVo7~*|qIXT;S?($ZDaH~=KWHwNvd1nbZut)PZZmP`!CUbCj zBZ0{pe;nWM@c!?9fb$k^kgHX`@UlXSuqV3<>VrczmG_SkBILf z%{-y}PLm+HJYonc8};L-@^S>&k4g^Fh$1`c{(C~+JE@M#MObC#AS^Sop$NTQpFsC2ybcj`%|H2Q+fq85 z{FGRYf*xjD3($!d&0kznSw@EGQ3+HNc8Y z{5cA6ARv-Bw2Q0#-siMuFG*$!TiqIA6vG-8Lvy{22jhvZMe=S7+!@Tw16$SY)MP(H z5DkiX^o&r%8JrKy9OuT^FbHMY$U66!UK>{M$ZSSLmY<$Gd$(J^ zCgU5eM{J|DRx2MF5Gu^yk+92MYI*)=OhO%vI%x^=dgy}l48HSi)ZSC8SI31FiyoH3}i5`8%ZG*NXXmGJM|ZI7lq59VF0%=icEX#P&k_R2|~_DSbSM^S^f2c=%1 z#NjdW`@3fEm6UJQh|oBeZ3o+!E?FH~7B@KPkvy6%M2&mHgpA1ICZ5;H_X4um)-Y9? z9iulrKuBxl{yFHBWkMpb_IAiFj0h8&BISGb|mww%+C{-M7}F z$PO6aY3!aLxgLXLf(vh%S5OeLcU}O~T!F^&057$*`}|D8eEuu(Q;q4ud!aRy6x^u{ z+cDi7Z~6?415S%*rMxa!)#gd1Fmlr*4Q68=ISH7Rj6Hs2@wTLqmP;$i*WSoeqTs9F z{L)U?8;z27L1F2RS_(;)=Ep3)93m@sI`AuKGSbQ$JZgUpZ*C!`0>kei?`?<=`!z1G zIdeddsLZQzL|OL1t1~qp=`whl-b}qx8_svo8C7DOkGleB4ivuHpD(oMl8MXdMC^!! zMb%O}J4(4D5{g^-+3n}QAD*J}cEj&!kw%=Z1w|E4Gu#g$tfi(jj_$~wNY(yfwA=jT zVGXTzbB$PgkJcTQXEajO)}eiIEj41TU%N0_Obox?)y7U5cMbG5r?F@_Ea323sMjIE zFsx-d%9Pcw!mbcAA>2siF|l_Ux*ezNU!VInl9y>yV9@-ySK<#!ARr9x^-UM9xhP@6 z!1&sDvJ-aVpy$Q1^*;aU0-lR861V?@?kW+9?ss`yu2RV{pn9y zGRARsF2-s0C!*S?kw$ekpY!%4F;EJ*Z23rNESQY*E1xzio2I&qF2+4BK#-i7NsVq; zb}`t$({tE~tGk7-y2>|G66e~uphX%MGkuU!!?hKjRrJ04(KwNA@dDKG(30xP zhOx7dr;N{S99*ROxo*7lBqMu`>PQ50Hg$)4o5SPI*K&UOJzGg*3LEtju-cE93xJ<% zoHJ$G-K-FYi?4E91Wc1sB#1KyJn(#uh=o3r8qfTu8HsXUQs{XK5&^ampLbvU%YHMZ z6hF#^m42aF_-t{N9T^Y(I3pjwld^(lD_tt(#XIpC-!H3yp+{yb2_fH^BHE^Tlcbi- z38TAgFCiG?Rz`up=dG$bS@Y#^=wy{1nZIX+FxV*GVw^stz>o948HM! z)QPw^5q4L%5E$G`>XIHINl2W>h)y>41sv?)Vx*jSS`wS8%{7d-&ow1knG2BNxDl)o_9o$>98D>c z_3buEd-M+JQQ$#sPS(qC+ zG=bYwI$RoEm}aumMn$9=qn@D-=qF#q?T&iNVh4HpVYb?3f#rH9FAbKJ2iL?-CFv;F zDJ{|i!{2$S8i0f|@zF_&LJ+Zde^K!iQX(YS zuYS(kq;K%yLNaNKoLyou_O>ff6zUG2AaQ@yI&VL8Hk3@V+10LWRa3xsWF%h`P%|QQ z1*jnc(}2?0YRouq{%yCzaa{c#uZ;&=Zqwz88|Y5l{f=2HRr(Z_I`J$f>PdTkb*M~H z2bt^VXNygS9iFVd$#N#5+$al;RetkSOq1C0Jcd=$U)Jissie73S_ekQGe-D70r8;; zoY;->bCq?Hg?}vZGyh3yx`&X^z_269nOZNnSGrX*Gfh~|T5$AFSA_ijn8Wr(<6}`v z^h?|DY3n^CcY5WHz)MVu2wY)kHNRo?>}94fv=c(E8XNtphyGTgo~%$`x69H==@bUW z$2H_t2M@q3Mj(fG``M-$&wj{=#C4y^0cW)Bmmhm^+t%lSj9C9ZQ{t%9Fs%+REY*vM z{JSo1Fls2}b$>ullqOZrb1NPl_u5ZIfhDfk_Bs-|e z)jJTKzw`gN&;_q6QTH(+RnwT=trb)RgfZQ3axL#6-jLE$Zd(`WY{bvi2E{4=Q(D~E zEkp5`$E0|I;Sr~PH-<0~5zFd)lEdyJ0GBd-ro=Q?I1tgUwJTu{(5bALUuMn?}>4Cg^2Ef)#*R4qP5ko&x-f4)M-fCgWB!idy*Rchz69`bEf^C-9)jQv;Uv= zfSZ&waWRs0#B~}1Yb-R5HnMaGj1A&*>+YAk5)E|_QuhJ4&AT0OnzrCT&y1ypYc1+Sx4A!{+^m+^_b0TA8YFtmX(0?yi(Vh^~kk(d+ zW^lJxC|((MAYk^so6y4ZKRtXJlVNi=GIUx#ikKq5aXndIy>5D}ThLo-7~Cz2>MwG_y&}=4W$R{KlNyR(I);`;E8nBga})ZMtW<1MGF zu`1A^i5{WMJ5g>#Dc&UYeDR^DAQkEI)+j#fp4HM8Z6rxt9&%bb(+er;A5N}ICts4n zVro~3+N7!;^NKMr6t4_@(e0zuODn*qRoXi;vzUzN~N;Sk> zJK`xfvN3@8`sMQSj}=Q@QZi}H-Qk7sPN%*~dPQ2Ry8%5x#F42{^yB{BaZOz(9YF_P zzYL-hBQlJ?EY3E*{H0W8{LON9B|doi1Ak;|mm^2XcUHenqeG;3 z#jdZ^A>(ThsGJfOXF>oN?s!J0G0nXVR*YI5{i$hB) zXk8v6;QgIau(6~;(u;J$z4zXFC+heNxw6QJeYIe3*ZiL5XqzONW+QvYrxW zIDW5wkVuJ2-rKZZdghI`Yj|JI8N~AbGg7m=6mf%B%kBn_ETkEWuy02_GH?*qldaO) zbjPTy#lAUTsqr(~Qqu$yEqJ-Hzl=56_^`IS^9|c^^P?k|4TOeQT-*g+-ou8i% zePMVtV+Xy+s?Sg;E^IV5*{zUH)vG6BLcd?pZjSX;?Ux5llv= zkOXpR94wAk7TPOfR@JT<^W~d{P+2{_#21i4*`5ircGA3W$~j-9U<0Eq&IMV)yLQh+Z=KDPvx**5`|}2 z&#C-w34$hr)XEZr9q;4H(rk4(KUW)WNlW^YUdFR9kkX}|a>$7Ha}^RQ8a_YFNdJDR zeFoj3R1UU@8K5toT3dM0n*A*RBwB_N*np*-jxO`Sie~N$blloC^;+RQvIzU_K?6*? zQYA%@I0`@ks7DAG$Py9~A`=s(B{D?UfS~9yPw*x8UWD_G>P^g#EQ%)&z<7lqKxgG57@4UP119r)!e^@FHaLTDsN z%>;c1amFtZ)YUVfT70^yED$0@(~)s=b3=L4uc+lvt4Zi!z(AO`9VB6)KXpw`PHyV$ zEtZ;6*3hjfneukThGB53Ym~mKCvwnK%||k748Yvp@V?Ocz+puP@e@QuMajuHY0olw zrBk^$wC&gqw52TZVg%gQ7xVq=E&*4c}k>ibDY>Gy-;q zu#mOVm;>=+8^={oodeI+Ds}ic>UH$}ve%I2+C86o9H{B6J=kmbZMVd!-g$C>PddCe zn1dDzNG5FN0}?DOEW2=WVgJP-98k8)hKJgN7zc=eD)?s%qrDig#f0*P@X!RA~(4#qSiQ;Ea=-G@9buRpoO8}OQ% zloQ^JOh}*w(xDiT$w8M|J|(X*Tv7}J_SS)fMb@i?pP|lMhw;MfAjX5gSxRquffL2E zs%50fU`_vVZ9|NEiUVo6(1(VLcV+7n@?xVTbhTE!y+lWrzi?dFCYkz-4;eh&6%iCG zok@6fbgjlU1lUt4(ZY==E=La;Sqw87zuPWsSl3-PJWV0=2RM^f0f>*XZGb8)3DD5m z!-#n=Id^+2!}tQ$-+U0DQ(kQy9b*7jOS;Z&PYM@fuX_0$qDmEd1FF=k;-mRQn_am3 zdKDmGbKB{3IOY$pPu0~}Pgny<52s6v-vAy$;6#mV1yg0jLp*GUm|43mg@-J!U?V-L zjQ7yyV;|t3G?k3DRcPCmR0?=6Ri1r-PMur-ydjJ_Pc~b^ZZoBA4N{>T{eDjxkuE#v<3tk_r0@Ulxzwa-QS7I=2=V2-sRwtIxRf*4;nq0&(q@zB41KFk_{3 z6rNT2^|S*GM@I$@+&usIqDdze_j z!{xW};BD20`_!71*7>;)hcyc<>YQG@h@Y_QV0`DB7~@yFH>6emTu4o$o3?mNQKu9f zJ87^n8>i>hi_2J!4lx+f2{{JF2OH*Yfl@|x*Xv@9F7vy zwN}jic`nB1-}bagB%ZyiY}hkncCFAL)S;@n_$2PYo&f+`gB9IjlFTGl1~WaX>oL6Y z&t_ITE)0yqHmk}>wLFWM(9lpIxYtWnFBJ`a$SPLtw3c(Sey}z^yenVsm9(s+jE6uw zw&@K{3T^7^E7>f`QR$3-I{N|YZMAUKivrG9zdk+*7d&_Q?Ud7oXlK`AqVxR$w}(r1 z=z3t9xK8=8Vhk<}U(Z7kIz7wXd-)qw$l@TYT1$xQ9zimcck&uB+8m zmVQ3Ucsw%3aa*U$vfLBSlE7yz69^n86XNMP?X_l~EUAHEz^CRK5)VaFGU#{!+eU4T zk3mkwR_%H+d2U;1+xJg4e$$Vtf9zQdPpYtxjZT-}_DJ@&u-qoTH0$Yo$Rg<75W~(G z=+xYPIfFfy+SBch>f*v?t<$p&@3^uuw!pBkSm!Blm}mZzPXu9jczAB#DiaeE3)obm zeWEM0huy3kFXD9FB%RkJWn~A46XYyr8D69iCO4WN<2^OKTn`5ZmfRnmF%L#3dqo+;0teN;L}jOxtHOun5?RySA`!R>-u-r&y_ z|Jq1IDspgwY!XT8Cu_ZO^BAuQaIhx4n|C9+W}{vUkWD`#fBcM;UIwpD8CDxi1PPLs z*ZG-iH{Zr4oSvR)dJ?bfvC6aOsBp5sE z?r=T%x{t=qWBdR$fCUw3hPi(T>fcB6Y;F5Esjm>9~4l{S4kWf&Oup1+_0uH`?MIv<2AO@wS~UvL`H)e7|& zBS5$TlCIw{f9J#ZvQyc()%Smq0L%_m!tpX8&DC{R&;Wo72q|4=m;s3P3g1E4|6f4x zKVKqLEg^zsD4Q_APepAY;vWD&fTg>7N`N&^j0TCy~edrqqGl5Di7x~0f z`e}Ou!=>1Oa`~;wfLHKephQQOZfX1Ci8@*UkFlqU&ZSoIa$a8Hu4|YDpdbKB*}oB4 z;+tJ3Te0LHwlPy(HyYF+szF_fX0I%h=KF*SvCV$`?|0o;@(D7twN5Q#$|l?Nf3P4Z zqeQuWaok-_4i(=l|AA_eEGvs*b?XK7$ZHsRjrv}YfaZPW^XR&^5Pbh5&AaThza4S| zg1Jz|Z}|LQo^aK);2J1|aCy~br+^sH70`pM(dBPYt6etTwRX?Pr-<+0M_=_e2FB2p z`tb6m>!!W}gwXRY-vEC6i!GsdUAFBF#2-TlKxKOQH>en0ND9CElxi%TcIo_5QFtZa zD>x`$*#pLW6wtEG%sTo3Kx=O92m@K>YQq_CK?S|K&U$XoDx{6wB<$V0rZv$xaa3_2 z-!&!Z$$Thk%%X(`RRoL^Q2YsuoMYRiJ=N!-pMQVs*5e6%GC2g`kG~}&D8zNi?0!Bl zHnhP+t$GCfFTo$NP?nMF>fpXrd{V6~EaX;{0p=qFzafbB?zP#fc%v#3rT=K*<;O3s zl$5x2L}`UeXAb~L4|;??h!KGzs5~}@9c7Fb1>KR*ymX7`5pEzVan4lrN&>*?DvO|a zpm<=MOnz0|<#@6<)Bq~2+knPV9hKi<)o9QuKhxm&Qx$n`lLzJD$?W|S?|lB1y9l5; z=bE2za@r`X2!%Y~zH@y`|4Bv1Cb@89t+%(v(+y`0vk(yQpU`e{YgX}0#DaZ}0qz1A zOLi0;v(9F&ZwLNysK5Yy=18B*uz+)p$?o!xkSEVigXh0pV?sI9@*rU(2JDVjia=bf z=@Ts!s915ciAfn{*`qN5ej8Km)z5`MBV<1qh^}ci4m8>1hMvZ0PSiSxWVE#U5Nv7# z!s2P#VtrA)3)8twZR~E|vSsC&@mP{11!qqGauFY0OVXF{+{1-(YZ~`8u9Vx*NFVUA z)T>&}L7b^+dgtipGl7HW{(-%C|H(>8V@DoM_EGUZ%Zff+f2hp*oXm}(;z_&sm#5FI z-69)*R-<*XK+T^$rFgSb{4TNEJC6`j_DB#LRN+Cp*}1N@YCQi62ZOwvc__uCz-h|F zF*7sNh3R1+l8Ud(i}Fuqx1b5dK1=2&TIxD#Foce%w3Ky=4t-CPgqgLndQ150@H*4k zeLh45VmqHN523=UY-E`^4@TEeA3fl4dE(oH36p9W;j$9FS!Zn&_a|93Ikml*Fe9eW-KdeVadT?AKK2a z@$X3dvoD*6jg-DkPex*b$JV(b5i(A2Jx%v@9RbW__>4XLd`0#c{8t0GgJDGxGni`x&ZBuTYI^3Tzj3Dw(Ziq z{8>-Z$It>G`v7M3Mqj1PbQ_yK!sP{7p@>*B^K=$?U2(p0xfmD(3y@*SkrDz~Q`LJO zlgx%@Vm8lxNKE9+Kt(H86#`4IRP8y)CJ`AK37OrPw?M?h#lutbC`UnvkCUhEKMo_j z^E`P_NeEDHD1hSVvbAAjv}9sSudH$I5gPV|L`WB>AKfXJ6&eVy8f!@P+}CiOPcRKS z`)q1#+y-1NCJ1ft?F}ficpScd`rs}on$oAcL|h7P2kSaZg*)J|?^Ylr#e_*KMiyUT zz!03HuYgn~Wf0C|Vs2dp-;J&sgfC7p- z>V+vFvqRk`kF>P38Aypy++qb%edsuPHFWO}6(=TJ!o^CuyQPTmI`d(9B}o+M1Z-J~ zh%DD)Cx#bALO{XwrBL}o0OWhn;c;GPh@zJ5d+T;|Hk_|T16)}Q3yT$l4RwB}_GsF^ z3~BrXc8l2aFm}||JwBUW_~RhA0{IW)Y|s zVtrBW6S}lJZ-)588nZAR;depXG zxPnj2uFE+fqibbBo%$iM?FR+&urrYY8U2@&?D1PYXDcN+pF?!Rd%H;^2Iz7SG4GL#*ust!FU5d?`33{f*9e z>&C?jUHJJ9!o#C3ly{Z%*)I8Qvom~k4KgIZ6iI3?NJgt(yA-!HOzldZRjV1+$9nS} zde88f{$kgwEHlmz*#&Z{x~<@5+0eDeqI|crRY!~TeYL}VK;{iOPFR}H zYn|K{W)Nl?7(N0Ai5kzfMjU$pS84)?pteDDV7X&?`aqo2Q{@o_g+;WFrM5Yhq4()0 zF;B69RAN!ZX<5-0)a>OJkgrC|QcHbqCH%wjRQ(4gGAX?C$>qY1S@p!Wv-^pGgHKsq zSGie_oPOw4mLC=g3HWP%kc`4Z4p$v+ILc1&*p&T#l)&3L7pv7Z*Ti{;Ny|OH?dAnr z6m0>pDF&8@_m8$4-o^doIHRtdunQKkO2}c(^*_^M7SwS$i9%mCd(-M%SwG|IMLbfx zxm|)fEfpoUw|BJJ)v&}|cE&-0X0x%kq}BIjw6uw&kh004YQ?>4&RefeeR)OKLW7rRlKvzWRWW&yhx_-xGf{ETl833Jo-TTP`IbCDn78jGz$Tbp$a>6`^GX5Yn7b zJ;2A#`TVh=FzxfMF%U_vZuCIIINASo*y(^;Bw56f^0iKq(pj|UJUQlipI^_ zML&R+u>P5sSjj+$h2vg}1?$soX={_z_1F^i^a6Q-wn0y~^B+v4wFqY$TTj)xhOWGY zm$ymgeUb0I*(rUJf8sbXqI58sljHMPrAbCr&(qV>c)H%R8f^%iQ(KTrp&}#|hUGhM z&5VKKc$Ca!vfX=tybydRASVDcU4qP{(rXRL)_!LEqz%q483I1l*Yz!2tY+tL5+-cp z5*YZj6`r}yAXmR6CyOIEm%@{YtL!4BtDJHRW;<-T`OdZWT=?DOr~MbDc8Q)r;RJg~x{}#8V8^VpMhO<+0@~HUCd* z*B%aK+Qyd_%}z>62eBh$SDAH~8P=|ZSt0C>!+cYslqiQ1nrc{#@-3S%+l(S>bC|C& zBT<{yX|^pAAz@}%hp?Jf<2a10DQ552s6V#r+P}W%ujjh%c@FP0&wKd&p8NjYfdN+! z|B@ngKT0$eGJ5WvcgoXS5lw(Y8+&2Dk)h$9Qo4mY`&Fijsh=$=qW7*RMV;lEGY#sF zSN4XIWT3xD(gVWk`Q6?VJ0R(wis|SKWQ(&teu{EKCObtNOwxER;QCN%Gdm7^VruGU z69G>-EZlrob}8QYph2ZO?s*C(fx-3Rh`KEeIH!-VJvypJS@ngDGwOma#v6GnEQlXr z5(T|efU`UQyms~v6hxI7wOQ{Nxe!cy>M=3D3pY<4&Qi5HmEagWoRs(`D@C%=ch8G4 z0(_d_n4z$T|0fEuigrt4Tr9U{&c$WBaqc7UMyEQ(UlOVO;K$^E%AO#rHRgPHvjm_@j{}jyM{Bz(e$o&*Z)6ViNqprl; z?ywAXn$eM5pcf}@z{HMh{k;k`2R^wLVvLfS{Jfr0r6 z3SQcPSk+tfCl*E6T?C>6a#{bG0jyNo6`KcAn9Y4vF=8Y*7)ad!zE>6tB8ovN{8(wW zS~GrpLOkqv(^@T(`sM1>OLai*ZZ+si)h%ite0i?ZL@_@qFGScKF6^^pmQ1g$Hq7MU zn?RE__J>*8XK=L1l5=|=*J-vKnFb*#71M&DGWE23G7n!P92=$%@9t*xFE10aZIY3_zttY@a?vF`GMXB_ufOjoSF zu-_%!-Ai#Nce}kLy4|s@0^B&WejCp{^00OwxH9T>cEYGYP%HFw@CYbf4>Gvb)#CB- zbl5*LbGc1%?vf9*hn&Q`FH*FbL@Un}W zC6+Dc{!3?dPf<`&Ic8YJ0;?}>E^qpQkD_Bbzu~|UJwFJ^w!2Yd%e_e=)>L3$*^)}xPUq=~B0)jOXVE#!--DA&-kxQgIXi4g=~GWKuA zxsaVNdUvFom?4~hDp)C1PtO9TX!t6I1c zg=&wVCI=myeUu0+9C|K29M!nYPzi8bs3T7un^QuyV)y+t7xpc5FN5$-6B1jPk(v z!GkLCu#S$;;I%h z?y2*P;46^p)`xS+9QyR7yqQx&Kqd3&KMvT=@Y=X1e4MHI)4#9so}A+M?ud zcdy$J7No|;v)JqPFJ{nB>S?V5{)+OY6_s1;*pEV?bQWuE!so+t>HY_FyaMjI9;m_L^PymrgFUBmHRj)r^4L7~BDfg0hS4Q$`I^7?V4rv%B`xzSuqqO8ygtB2@ zM>l@AZ-sGpur`t^1OYv7fe!!_q`J(dASfm5J38JMm;Rr?#U%J8!1Z#v-QI@D0?4rV zj$%RDi?ta%Bw5okX|UAqJ30fwFG}7-DRlJ~@&GmjtbJIU(bD44?_kWnU6?VL0mHm& zc&doO$W^8&UOIPk(BGiN1d&5H)_aXzf;k9}K_Y@k^3_dB?rRBIE&1H8RE5ebDB&txnEw-R^Pd~= zPeylNuFU0o+a#>wU%q2wO^;bi=anX;c6Br;aVj{Uv5haLcXIJh!{g^lY^kFfw*t*l zF@_{Hso&W3>Idy+Z%6gsR$muUeyc#27{nKC3;CY&yK5Ra+;+8Mc1PA|)c5k%R=J_} zp2f6UF7Yeyz(S+@TP6ExxdcPPE^C)oUC}=22Z%QjLPbG=#YR{yC`zSBs4Ur3RG{YY zz70SovikqDEqAtTD+bbE%Bt}{IY5MyZBfoJYzEN&ZG|BkH9?3&ISBH%E&JRc6*${{ zzh?v?|EmeM;=6v7mjr_-TfJ}k;O*p#@2XzfH1&hA`e~zN-$UA}J<{V#tAWhp|6GJA Z3XP=4&l+RdW9~@TZq8qSb<-*E+~4F#ey0Ec literal 0 HcmV?d00001 diff --git a/docs/guide-ja/start-workflow.md b/docs/guide-ja/start-workflow.md index e410819..71c0f14 100644 --- a/docs/guide-ja/start-workflow.md +++ b/docs/guide-ja/start-workflow.md @@ -78,7 +78,7 @@ Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/ 次の図は、アプリケーションがどのようにリクエストを処理するかを示すものです。 -![リクエストのライフサイクル](images/application-lifecycle.png) +![リクエストのライフサイクル](images/request-lifecycle.png) 1. ユーザが [エントリスクリプト](structure-entry-scripts.md) `web/index.php` に対してリクエストを出します。 2. エントリスクリプトはアプリケーションの [コンフィギュレーション](concept-configurations.md) を読み出して、 diff --git a/docs/guide-pt-BR/images/application-lifecycle.graphml b/docs/guide-pt-BR/images/application-lifecycle.graphml deleted file mode 100644 index 525b192..0000000 --- a/docs/guide-pt-BR/images/application-lifecycle.graphml +++ /dev/null @@ -1,834 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - usuário - - - - - - - - - - - - - - - - - - - - model - - - - - - - - - - - - - - - - - banco de dados - - - - - - - - - - - - - - - - - - - - - - - - - - - - view - - - - - - - - - - - - - - - - - - - - controller - - - - - - - - - - Folder 1 - - - - - - - - - - - - - - - - cria action - - - - - - - - - - - - - - - - - aplica filtros - - - - - - - - - - - - - - - - - - - - action - - - - - - - - - - Folder 3 - - - - - - - - - - - - - - - - carrega model - - - - - - - - - - - - - - - - - renderiza view - - - - - - - - - - - - - - - - - - - - - resposta - - - - - - - - - - - - - - - - - requisição - - - - - - - - - - - - - - - - - - - - aplicação - - - - - - - - - - Folder 2 - - - - - - - - - - - - - - - - resolve rota - - - - - - - - - - - - - - - - - cria controller - - - - - - - - - - - - - - - - - - - - - - script de entrada - - - - - - - - - - Folder 4 - - - - - - - - - - - - - - - - carrega configurações - - - - - - - - - - - - - - - - - executa aplicação - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - 4 - - - - - - - - - - - - - - - - - - 9 - - - - - - - - - - - - - - - - - - 10 - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - 8 - - - - - - - - - - - - - - - - - - - - 6 - - - - - - - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> -<g> - - <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> - <stop offset="0.2711" style="stop-color:#FFAB4F"/> - <stop offset="1" style="stop-color:#FFD28F"/> - </linearGradient> - <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 - V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 - c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 - c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 - c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 - C1.378,56.689,0.5,62.768,0.5,62.768z"/> - <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 - s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 - c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 - C40.445,49.917,26.288,53.051,26.288,53.051z"/> - - <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#74AEEE"/> - <stop offset="1" style="stop-color:#2068A3"/> - </radialGradient> - <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 - c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 - c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 - C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 - c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 - C12.523,47.135,12.878,45,13.404,44.173z"/> - <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 - c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 - C47.754,49.045,48.006,46.574,45.777,43.924z"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 - c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 - c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> - - <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#FFD28F"/> - <stop offset="1" style="stop-color:#FFAB4F"/> - </radialGradient> - <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 - c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 - C36.627,4.945,43.59,13.158,43.676,23.357z"/> - - <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> - <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> - <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> - </linearGradient> - <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 - c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 - c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> - <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 - c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 - s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 - L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> - <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 - C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> - <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 - C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 - C5.569,6.97,4.903,13.375,11.151,17.751z"/> -</g> -</svg> - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" - xml:space="preserve"> -<defs> -</defs> -<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> -<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 - c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> -<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 - c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> -<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> -<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> -<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 - c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> -<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> -<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 - c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 - L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 - l1.46,1.834L31.04,45.982z"/> -</svg> - - - - diff --git a/docs/guide-pt-BR/images/application-lifecycle.png b/docs/guide-pt-BR/images/application-lifecycle.png deleted file mode 100644 index 143ed3881ae45535a387b898dcfca914052192f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40608 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 JOLZ^b{T-awKYIWG diff --git a/docs/guide-pt-BR/images/request-lifecycle.graphml b/docs/guide-pt-BR/images/request-lifecycle.graphml new file mode 100644 index 0000000..525b192 --- /dev/null +++ b/docs/guide-pt-BR/images/request-lifecycle.graphml @@ -0,0 +1,834 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + usuário + + + + + + + + + + + + + + + + + + + + model + + + + + + + + + + + + + + + + + banco de dados + + + + + + + + + + + + + + + + + + + + + + + + + + + + view + + + + + + + + + + + + + + + + + + + + controller + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + cria action + + + + + + + + + + + + + + + + + aplica filtros + + + + + + + + + + + + + + + + + + + + action + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + carrega model + + + + + + + + + + + + + + + + + renderiza view + + + + + + + + + + + + + + + + + + + + + resposta + + + + + + + + + + + + + + + + + requisição + + + + + + + + + + + + + + + + + + + + aplicação + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + resolve rota + + + + + + + + + + + + + + + + + cria controller + + + + + + + + + + + + + + + + + + + + + + script de entrada + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + carrega configurações + + + + + + + + + + + + + + + + + executa aplicação + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + 9 + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 + s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 + c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#74AEEE"/> + <stop offset="1" style="stop-color:#2068A3"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 + c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 + C12.523,47.135,12.878,45,13.404,44.173z"/> + <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 + c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 + C47.754,49.045,48.006,46.574,45.777,43.924z"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> + <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> + <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 + C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> + <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 + C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 + C5.569,6.97,4.903,13.375,11.151,17.751z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> +<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 + c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> +<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 + c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 + c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 + L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 + l1.46,1.834L31.04,45.982z"/> +</svg> + + + + diff --git a/docs/guide-pt-BR/images/request-lifecycle.png b/docs/guide-pt-BR/images/request-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..143ed3881ae45535a387b898dcfca914052192f7 GIT binary patch literal 40608 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 JOLZ^b{T-awKYIWG literal 0 HcmV?d00001 diff --git a/docs/guide-pt-BR/start-workflow.md b/docs/guide-pt-BR/start-workflow.md index e59aa59..3a5f0bf 100644 --- a/docs/guide-pt-BR/start-workflow.md +++ b/docs/guide-pt-BR/start-workflow.md @@ -89,7 +89,7 @@ Ciclo de Vida da Requisição O diagrama a seguir demonstra como uma aplicação gerencia uma requisição. -![Ciclo de Vida da Requisição](images/application-lifecycle.png) +![Ciclo de Vida da Requisição](images/request-lifecycle.png) 1. Um usuário faz uma requisiçao ao [script de entrada](structure-entry-scripts.md) `web/index.php`. 2. O script de entrada carrega a [configuração](concept-configurations.md) da diff --git a/docs/guide-ru/images/application-lifecycle.graphml b/docs/guide-ru/images/application-lifecycle.graphml deleted file mode 100644 index 6ef7eb5..0000000 --- a/docs/guide-ru/images/application-lifecycle.graphml +++ /dev/null @@ -1,838 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - пользователь - - - - - - - - - - - - - - - - - - - - модель - - - - - - - - - - - - - - - - - база данных - - - - - - - - - - - - - - - - - - - - - - - - - - - - вид - - - - - - - - - - - - - - - - - - - - контроллер - - - - - - - - - - Folder 1 - - - - - - - - - - - - - - - - создание действия - - - - - - - - - - - - - - - - - наложение -фильтров - - - - - - - - - - - - - - - - - - - - действие - - - - - - - - - - Folder 3 - - - - - - - - - - - - - - - - загрузка модели - - - - - - - - - - - - - - - - - создание вида - - - - - - - - - - - - - - - - - - - - - ответ - - - - - - - - - - - - - - - - - запрос - - - - - - - - - - - - - - - - - - - - приложение - - - - - - - - - - Folder 2 - - - - - - - - - - - - - - - - определение -маршрута - - - - - - - - - - - - - - - - - создание -контроллера - - - - - - - - - - - - - - - - - - - - - - входной скрипт - - - - - - - - - - Folder 4 - - - - - - - - - - - - - - - - загрузка -конфигурации - - - - - - - - - - - - - - - - - запуск приложения - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - 4 - - - - - - - - - - - - - - - - - - 9 - - - - - - - - - - - - - - - - - - 10 - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - 8 - - - - - - - - - - - - - - - - - - - - 6 - - - - - - - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> -<g> - - <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> - <stop offset="0.2711" style="stop-color:#FFAB4F"/> - <stop offset="1" style="stop-color:#FFD28F"/> - </linearGradient> - <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 - V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 - c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 - c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 - c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 - C1.378,56.689,0.5,62.768,0.5,62.768z"/> - <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 - s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 - c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 - C40.445,49.917,26.288,53.051,26.288,53.051z"/> - - <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#74AEEE"/> - <stop offset="1" style="stop-color:#2068A3"/> - </radialGradient> - <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 - c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 - c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 - C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 - c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 - C12.523,47.135,12.878,45,13.404,44.173z"/> - <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 - c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 - C47.754,49.045,48.006,46.574,45.777,43.924z"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 - c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 - c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> - - <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#FFD28F"/> - <stop offset="1" style="stop-color:#FFAB4F"/> - </radialGradient> - <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 - c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 - C36.627,4.945,43.59,13.158,43.676,23.357z"/> - - <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> - <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> - <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> - </linearGradient> - <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 - c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 - c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> - <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 - c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 - s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 - L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> - <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 - C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> - <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 - C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 - C5.569,6.97,4.903,13.375,11.151,17.751z"/> -</g> -</svg> - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" - xml:space="preserve"> -<defs> -</defs> -<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> -<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 - c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> -<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 - c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> -<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> -<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> -<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 - c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> -<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> -<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 - c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 - L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 - l1.46,1.834L31.04,45.982z"/> -</svg> - - - - diff --git a/docs/guide-ru/images/application-lifecycle.png b/docs/guide-ru/images/application-lifecycle.png deleted file mode 100644 index 08c4dd708cd44cd59eaa1b7f4f4063ffaedaf466..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35141 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + пользователь + + + + + + + + + + + + + + + + + + + + модель + + + + + + + + + + + + + + + + + база данных + + + + + + + + + + + + + + + + + + + + + + + + + + + + вид + + + + + + + + + + + + + + + + + + + + контроллер + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + создание действия + + + + + + + + + + + + + + + + + наложение +фильтров + + + + + + + + + + + + + + + + + + + + действие + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + загрузка модели + + + + + + + + + + + + + + + + + создание вида + + + + + + + + + + + + + + + + + + + + + ответ + + + + + + + + + + + + + + + + + запрос + + + + + + + + + + + + + + + + + + + + приложение + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + определение +маршрута + + + + + + + + + + + + + + + + + создание +контроллера + + + + + + + + + + + + + + + + + + + + + + входной скрипт + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + загрузка +конфигурации + + + + + + + + + + + + + + + + + запуск приложения + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + 9 + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 + s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 + c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#74AEEE"/> + <stop offset="1" style="stop-color:#2068A3"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 + c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 + C12.523,47.135,12.878,45,13.404,44.173z"/> + <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 + c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 + C47.754,49.045,48.006,46.574,45.777,43.924z"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> + <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> + <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 + C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> + <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 + C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 + C5.569,6.97,4.903,13.375,11.151,17.751z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> +<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 + c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> +<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 + c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 + c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 + L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 + l1.46,1.834L31.04,45.982z"/> +</svg> + + + + diff --git a/docs/guide-ru/images/request-lifecycle.png b/docs/guide-ru/images/request-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..08c4dd708cd44cd59eaa1b7f4f4063ffaedaf466 GIT binary patch literal 35141 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 用户 - - - - - - - - - - - - - - - - - - - - 模型 -model - - - - - - - - - - - - - - - - - 数据库 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 视图 -view - - - - - - - - - - - - - - - - - - - - 控制器(Controller) - - - - - - - - - - Folder 1 - - - - - - - - - - - - - - - - 创建动作 - - - - - - - - - - - - - - - - - 实施过滤 - - - - - - - - - - - - - - - - - - - - 动作(Action) - - - - - - - - - - Folder 3 - - - - - - - - - - - - - - - - 加载模型 - - - - - - - - - - - - - - - - - 渲染视图 - - - - - - - - - - - - - - - - - - - - - 响应 -Response - - - - - - - - - - - - - - - - - 请求 -Request - - - - - - - - - - - - - - - - - - - - 应用主体 - - - - - - - - - - Folder 2 - - - - - - - - - - - - - - - - 解析路由(Route) - - - - - - - - - - - - - - - - - 创建控制器 - - - - - - - - - - - - - - - - - - - - - - 入口脚本 - - - - - - - - - - Folder 4 - - - - - - - - - - - - - - - - 加载应用配置 - - - - - - - - - - - - - - - - - 运行应用 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - 4 - - - - - - - - - - - - - - - - - - 9 - - - - - - - - - - - - - - - - - - 10 - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - 8 - - - - - - - - - - - - - - - - - - - - 6 - - - - - - - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> -<g> - - <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> - <stop offset="0.2711" style="stop-color:#FFAB4F"/> - <stop offset="1" style="stop-color:#FFD28F"/> - </linearGradient> - <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 - V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 - c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 - c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 - c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 - C1.378,56.689,0.5,62.768,0.5,62.768z"/> - <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 - s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 - c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 - C40.445,49.917,26.288,53.051,26.288,53.051z"/> - - <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#74AEEE"/> - <stop offset="1" style="stop-color:#2068A3"/> - </radialGradient> - <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 - c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 - c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 - C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 - c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 - C12.523,47.135,12.878,45,13.404,44.173z"/> - <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 - c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 - C47.754,49.045,48.006,46.574,45.777,43.924z"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 - c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 - c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> - - <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#FFD28F"/> - <stop offset="1" style="stop-color:#FFAB4F"/> - </radialGradient> - <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 - c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 - C36.627,4.945,43.59,13.158,43.676,23.357z"/> - - <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> - <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> - <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> - </linearGradient> - <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 - c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 - c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> - <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 - c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 - s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 - L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> - <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 - C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> - <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 - C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 - C5.569,6.97,4.903,13.375,11.151,17.751z"/> -</g> -</svg> - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" - xml:space="preserve"> -<defs> -</defs> -<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> -<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 - c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> -<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 - c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> -<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> -<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> -<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 - c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> -<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> -<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 - c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 - L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 - l1.46,1.834L31.04,45.982z"/> -</svg> - - - - diff --git a/docs/guide-zh-CN/images/application-lifecycle.png b/docs/guide-zh-CN/images/application-lifecycle.png deleted file mode 100644 index a35ec56c8786346df36cb7c1bf4b1871403156ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39966 zcmce;c|6o@+dnQ#dn8H12qAm2GpKCIGTE~yTL>Y{Skpp@nUI}vm1XR*?@PqkB_=zQ z-Pp#y^E*e^bwBs>JooSW{qNf!ULTq{&*MCf_pu-6=lw%Xl?!LDoh2h9yP$esQJaj6 z5>7@&@$B?T@R#eCSnrULy(CjrysHZzTo^g^Lf1A9e=sClDAMCSJ>+a#x)r};<852# zA@gEr@wB+4MSMvp`Tdu7ZiL+>zj67_rAv1w`2*guC*QevnoeDlD}HvNiMDjn4T)7fprweYbxMR1O(;JHS(8I{P%DChQRB2R=2%O znRfje7B?TChLVw8gkKG0BZ8l4(oY|~zqXV#F;6M2Obb8WoJ7TGC?$mJ*+gifFxR61 zY#*8BwA&fz`C3jAC89WnAq)S5#Y4!xODrI>uHnrS{2Ar@E1Wf8MH2axkS3IHLkR9lS-{b9}d`{DR%L zF2I($2FmNiryJQZE8@hb76mN@v3V-ZU<1<0V?=7GK0Ky`@Hzk2dNv#=n&h{S_jWD{R8qhsnZH;R5^PnZa2 z@+GH*i!#yd6%|@?n1#l_J9F#ENbWSq(%Fy=n&F0Q^LA`Fg$R_z?QOL74bd-1%qw zF+0CfplmEQG%Qa;^_@i6Y5pANG?cBX#dWdTwf*F^j-b$ZMiSW0C=Ux4K2a&Ocx@%{ zrt^!ndt|uH_zz*fn!gWsV;os(n{@UCzFU1M-cszz0B!X#NY7Z|SGY#sxZ%4A13pF~ z`F0|J$Ya!ot`^PK_^98a>Ap?pP1vhUGd%JW)lAYPA)W0ae4oYUo)q!v1?E?&b{G8l z<;_WIa|dsC+XXu$^6;$}KL1k5LfOHeO>~FtcmuHJ(Oo2cAq&8CH?dUGOr2e~`#B#U zNKH|=ir6=y1$+vrr9h<($a|cE_?xSc(~wy6vaX^3BBy9XkigEm;%Hl)<+K;vXk$VR zzw*NH7~tD`?S@7#JAJGbV<;g!qx$m!u#vM(O2H3YLCBZQn0@d`0uGof)4 zQlgBv*cJec4+tuou%28|dDu;mn&f?CyYYmiUjI^cO4-%z`GS40&;?zRn*6&~pLhiz z@_$wPzpcRkHVQz=?ya~G=Ox~PkE}rVqevhmSt6hzB!hCSWq-8&Z*p!i0Ml@$?Kf@6 zzkh;_c>J}$dG&w#{;}mc^{>rgZK>nX<`Hh}$ia#IjS*hUJkTO;mvpGR zaIL0W>R(y+NOl&SqmENhaEX-X*+n2cj6ry^7SlBHJnwQt*H|YQcZ>WZZFuO-WPUhsWvWFI2($W>CR#sLSa?8p}O1|A- zLDox`F6B})-d6nC(_=l^9M%+aRrsE^jt(aekLvoC`Fw9i56v#tKXn{+IODK8#r#9a zGEWY(QJd6vD_an`r^5cFg=R#-EG&?QuRNg*qu2tSfT~|K6U-rGXRzY&-0*c zMFr2cdJ$f)oTZ=R*OO~niAnzQMO;}$#s4Y;gC}D4$7j6>EGl|`--m~v|I^OeOk4fi za}MpVsLq9yW^FNCzT7<762U1Tph1)LfC}%D? z(RJcrt#D(0O=XGge-M%8VbxtF71AB_m*ONF@lDaYckhluLP8QQvalRD`S|RkVq;_V z3T?Z@$2GLH!uU-qde_rY2ESFPlID6aOj$l&n+rU<))JTD(9pAT(Y*x7fpjM_IJm;t zGLQ9tY{d?f4Qn*#1CAGVb5BoKSC_BY9^*FC868N&Y9{6Ii{G&5X&Ap@!FTQc6;Z-% z-Gx{YTjb=_R7+g|1*f>Uey=@*j?Zftqn)$x{@pvc(vb+CwDfN2usaEkcYy5y=9Gjn z=G>`80!v3{Xh*sHY3R4<5E*0d^;s9h`fPVoFpEq*5@T2e&u@>HfTgL&K3N!`qobSX z2u3^X`ec~T6wJ=fUKxJCf+TK|I>M?^r8Q%@lxSsUco7*hK?xr) zrl_oZ_(4tz=*@v3H#az4?it153>L56&&C4-1D9A?mpd$s<>v}Tz+qjMwEjC&(P{b1 zNR}YO*pV)kb3e@FDIwbhUNc=R(k~>@;o+-=gB;lChspYf=@(+T)nl%gmzUqR?@cE# zir9p>=nHK4!OT@ysMF;93B4J&pZ>URH&#=Pi-hv7>J~ZlEtxIp{o8J+1JW6?+!lt5 z%0F*69Nfj9@fhAIZEkM1tM=YHv;(G~uj;)t;bIohp=(-c#-&b|7#O${rQL6fKlDgK zvdCO>Hdsb259;l%Ykr)xPzb#!>Nc(JlEbW>g_!P4Xj&&P_r;r1 zuPa-t+R@tLHK=FtqvjqR*B-ZTGE!JgO!{d`(E%0V_;%3j0Mb=evxc%HlrCnnD-(3YT|Vn+Y28R+)lOR@4TLx ztXGt(zNy;D@6m4Ot2yWIujRkDvh&{6YV@&`r0vHAwCuxQumwJmo{F}QZ!~wO8n0z} z2j1XhG*?hU12NuzGXD5I5-DCOgp#iOW#hXv3E}!L5=rU+q=w4NavHWoHt}?yfwGl( z%^bZC32E23f4}Uub?c`r8wrKZwzi0+kxI4NB^K+u`a%Qdx9)55-xp=?WE4_v{406w zWLwRCK!MXe^VnPbW|ziUvb;{xK%OlOi2$u-6n_>o=ZpBl&Qbd=IQUwQd6WEe7|GI- z;?jR%Kj^8UlwwxyS4)ou>%cm?S)7dhQDW@D-WJKY>A2YLZ?7m1t1b*^>4z>_XE#Yr zSode}Z88fo^BbpaM60%}{LFC+d9gUC2Mn<_fLeH1m|%XsunjpZ_3&Wv9THiC@{R-B zooT1Le-Tcy2E<3y$8zeqOx^utnFSb~T>Q=!fa|Lh6esWBy?gg{fJ)-XgTGIB7Hr?K}bYreDaQ;e{EypAfFd?JL3&CH#)25d74dz71}yM zY7ZU+yV&FgZjN`?VsV7M$x$w%=v1AhJ;FXGZ^Cghe@zA+b~6%_5pa3!zRu{ zHx6o@HuAp>VVeVM&?B`%3uTGd8YXNkcY@BzkfXf&&*%@I(Zvhz6+Xb98L3M~^mAZa z*^Dl*c%HUc_&|EF=eW*ln(j-@tT3?yw?dSMAst?pZA@hYVvFLeD0-G(Fdc@dLt%0{|55N*4 zo)!wpEu3ewF@Lk|RoyX+b@w&*@B!fyCAx_bp8bZ259M5QlAZ7Oka++m7rVV%Gxq$w zXeit2_9eJ|P~zjJ#5lNA8$W^FJCDEcyVFha_q z*WAl<>yq`i(od})nkHLYcwsWD3wL`NpY+BS4tJrgx9rifI~3M7UY>K^smV9i37pk* zmr@k=p4zdR&I}X_Dyt|@yBg5J>xGHim(&(O`e#x@(*2ipbeb+BNdeestcD26e}n3( zxq*Neohvz`#=^GIZwMm$Bm|~~;Q=Y!=kPkZiU91GZTIapDMb*HJXBIvmZPPocbAls z+6f+19Oxk=b|iJSPWSMKe=|!Y(;odIiYC1ec z+`>#WGkP7ld~;=GyKr2hr`laQled^g2tn0|Wi^(PM$dB$QGQsNl)PEg4ZV+`}{ zr(MN91l1r4A7tcHLPRW%(@GFz#Jv0PVXqP>{5J5(RS|J7 zep99YeXy%~s7{)SQVla5%gB50_`0563KR0lefrpHOmZf1MDI>ZFUoiYO z(Q$O7Z}4-wz(}jmMMzu(l{l)*?0hfGGR{BCf8`7bArJ^$yg*ieL}Vl0*BN0IB(#l^{$&7Y+t(6aNr^@;;>Vt2(g2yDyF zt>H;1jmW+SJ=PsDx!S@t-ibjk2IvvNfcJTVEQIsWZmlr$?;h{k$I)EGr=UC_^;hp! zakgKTyqSsUWw=l1?d)TsPeVudO9vQ2MwP7!&D+LM-}EU^d3=5g!0MT3N>V|b>oqM| z__C&;XSO#u&x35|kx65ZIEYc2U!I`gwe5)0OC^Why&G_YlT)>;vwOJ%a%Ig`$xK43 z{4p^!NR6KQQ|RvAW(VVSdFD8FSFe(N_>0U0!&vsl?IqV?RG11&Zt<(tbSztq2`QV~Lo88@2{Xax5Q=o9%8%7+%{v_eE5&OMk^i8wW zvTGi%dx)hB-2bw(q8=Ehf%zy=IM}>YXK8!$Y;=<47vv5|pli5EB`od~kii@oxGU!X zu$bIeSI^dVu?0x~S?WAy9=H*_Gr!u7WPKL@vuEwMA=QDk0ys%E)G$-C)S{-kf2?{n( zlC8|m9#h^X_7?k?7ur$uG!+&6eSpeWDurLAs`a}@Wk*j!_`1t$=B;LUVgAgAlU*R- z*c#NO?q&zr0?8_!4H_{Wdjw+tuwS1Qf>1#hnDjx^&XXwPc?egm?KgPfChcGA;N{Gb z#+)R7A6Y@gxZ&Xr|K%ND5L(7zyB3-u9U&yooX9m3tdsgooxxDPB&+J-!?lZfbmvaC zm9)rO>*;e3WF8^xwVou>s`xJC@1Qxl?dapC&xbQ+jNB+W2;Ezm9qaod?l`zFyLCGN z!*dGaZ1%3dx}N*vk=KGokp&egU{b&f)4|(wgERQ1`)T1mrebuwK~LWf0uwa`D?15s zR)ATKzQ%rNI7_j&7jUZ%i&-;+l3QwCnErCo$q`4>}8m%UUT4_Zayc z#bFDAOsl;oTPZ?t67k%dA6Z29S`ECpXFcPBWvGx+5-OSNJ9FRp5x$OT*=_S&sZuTl z-pbBWi|3^XU5h&2s#;#B4CQX?^K!k2=5TX1=~x?o^=)@0eFMW_pvAt*C3K270P_1E~^*XMOe#F(2#NkQqU#w?fcNI zqbGi4+KUQ^xHRrv9o=?agWXS1pH#rxk%w`Mi*NcXD=Sk61J^jlCcXOO&A0CPKI9yG z(9C8u!`a=IxZzIabggeQ_kZ7+AZ9n5qnpZJ{RV)!s;Cto{SPVF%I zTDyC2YhjE%S)z)~Ynk1>Hmo@;LnEOM%GmeP#?gaSJ6=`gkXKR2cVRz=B?qLcOA|~U zxixlWD5(}8jQm?>$I6xQbNy`g4)%HdGG*RppucOpxIytQ&m7ySP*mi#+5FYDvf$Mp zd_DpuZ9bEc9JNCqdnm2=q0UlZU39wesp0vGlWCE|U4v7D?FdyMNpW_4eH-^r z8W8=p^jV$oK9yb14>{CO7hx@|$ZpY*h^IgRCLbu&iF*!@8yHV!oc*sj{Py$o?$g&HSD33Pj51(gSlC1CCFuWcq z)Dhjry*iZ>Y%&1l{3bb>>0@GG>5tw3(Nz3=;bhi9#MJgr3+?cpfvd%?GmSg1LlwU2 zUNn-;EL`YZ=Hrg07S>-)f0*(l!h2FG*Sv2(WC<65QG3=q&_232RiRefRG>`BYX;S zu9PnTi)Pq!m+xW^ya<0>8yU;OY7_-2G)|;aqe2Trc(sOyT(zVMm3G{nJ|k;|&8}I+ z9jbPgO`Mfkvwy>aX!O0(iYr{3%zCXeHQD;Rz~fn!OMhgXrCMMMu7_&1=Y8zzQX2EX z?c&nxs{>lULg#qBH}aAnqtgUyqPrtlMA^dcVJazX^ekbYHv!r+jGe-sK zm{w5ty#O7}?d?k(Edw!N z;$uyexg#F(A$rxt)T+%28`v_xQOnBnAUq3WYi?ey!{V8HiUqOJl<{+HYi+K4wPi`Q zp!E62{Mt@*ImJ|EvPejq*5{d@-&$NfiaE%0MD_P(&CQRNgH>fG>(ltly?lcAH_G`3 z#09?5B5XEu^XFE>6Da2{(+MP6vddq)%oQ{P~q%fkpP9H>Q$VV8J?jQcG)UA+wihLUZx!+93N3|F5H58?6o9 znyNd3N&FvSo0{QWn;PK`P1YSEg0RH5^U(~pEttyHNn-sCp3b>v+3P@H3WCsRPFL3o z6B#)}x&BW)##~#X;!ovb#+G+$WYjc`nf=C0`CJy))v71zY914r=GeVmqB10 z=b-x3GpphaKtU3X@$m~sf8zP-DrEe@qYC% zEv(5*3TNA{?b7s4Y{>%4=sxr*2`WAGVxrfw9YNJ?j6+CrbMn#QM2O(C0Ykr zr{n&lVE?Osb^`x{7mDcjvXk5UcaQUoe+r%?nby>@#?3;Yqi?R5Z*H$_&WpboaQ9^n zddl`Rz;oyf=wmX=c+)@RsH z1%0Uc$mM!dVe)=j^9KYHCzgwo!MR{%7x)`kT(B{hhAkp`}j>0&nbLnd3ZIMk=dR6hz50Nwv_TDk8(<9hSCx4t)!AprhnC!Ju z`G~+Re&sj#E?nQ~8djVAJY?5dEceHR@M>>04T^)$hzoj}K@VO1;wP)A{wcFT z$`zsJFC~L{oqdflNBqrb!L7mrM-o&1lvDqy;hgDEC=!j|>^+lOXDPl80<)t!kxaMV zRa#-^bP*fJq<*a$e$SI=1rWHX1T(i>l9GNf`TgpFQo{=@A)bJfS+cO5+NiTsUu>SR zphwXn>=zr{O7Od9A?{E6=ZpeozTXI&pxc-ie~|0A%x#_rS2j!9oXvMPTpXO5D&FA+ zGWr`vln@fTKn-OK0@WwK54v#$1+MSwUe`gsM6zs67KG(<>*5C_#PkK7mjqmYAmCAa z#B_Qn)=fz>Q=!;Kiaj*n73+vY(!%wnY*URV4S~`PUxZJ4pN8%@1=v>1)VbX>&UKvU z7|Yu(^pV0SwHOx;?w4rE_5WKzi^LnzfWoI@QKUdz1s~uUV5^Hc6&)HfQqG?2i_4$W z(vz3(OSZvFWs<{?%`4sPLP&ZkS*^(_a%@xUQkG|DUZzxT^I96;D!)70G%ME^K24aA zj))q9KsPASS;k(io^9wVFFUigdo2!YTO@%9-L8x90gM2Jo#P+{O*{jQdn;mzaLaU; z86ExMF6=#W8cM9>S*voqvysyzhbzn=kJ+CAB(jBm+hglkUCc_s{^Y;!q= z%f>s6vo?4<_U#lQ26#gYcH-p3Ij?eBY5Eq6eMnO>0|Y=5rqv zbU}&`tEOs#ZDU22F5~Fn2|>1ESK;esjc7?!Weq+R9yMj`j@Pj5H6O8hczFXRg!4^H-9? z(9Jxyc&#kBS=?`vmcn*gxJi&*b+Ptj)t+*jJ0<#BmM4@7Qd+k5MH=c*)%-0?ySzHd zL=gG$gPZZfe#KvnvKnGUUHRu!w?K2=8#H-i@aj29=eXXH^n{Xwcnj(wa@TKxRJSH| zpSfoPxUHPXT6+9^0ldCDM;GnPF%)+f?AiS^we6PveHKcms0sUNuBc8cC804n70aHN z85+$X{RO!PfhyxOK;Gzp)(l&^;@L@v_OuBMI`HhB>vmJzq>jvr_fEeMl_hwkPavHiSmm>sz^Qn(Q9B37Xy4gcL+`NxFr2#>9lL6Rg zF~Vye{%_cgO^t{T*Hfu-#`axIRj|r!K`QTw9OafgMduV`mx%srEFf18s>8yE=tV89Q4F3{xp;VFv4JXL;l5leXID<3m3DtBIhW%oi-uk zOZJXM3njrbDSNyS+eu-YOt;~q-1;tcm1ZpqOw)AhlJ|0ZZm}2O-&Ci|fdk9WyoN)o zuxbUx%^R&a0okd_DOgKt{gu=t0sDiaoi*_lF8h8dcPdDsH<5C0w=(EIkpl`5*>w~1 zt?|!?;%5vP&awLJ&hO-Cnwv2>Bn0p8S{Om}SIXE?gD91^5cg*N4RzNl)9NGL94T2P z|07Y~G?^yJ%Wa6Ozs?-oMum3Q+LUnI%FrpvDl2q;m+z(GLF1YL@x43WCD`FCrOkq- z=cVO%7=Uf%YGd0vAl{25P3au>vHwgPkz}>M{DDf~aB+P2ib$>LXbGWp?SSy8QHO8! zYP=vUTa1nww4)4IG5QDTU0QrEd(#VDGupJf@0;dU>^H>j_A#-o-mBnPV7^Z~Ag^vU z_Rtou`pIF)tBocLt%XsM|I57V*XOUTfpwNkw*>x!bOK4G))U$ghAq#rcJHq}edmm7 zHzsy9^~5BMH!mZaq$oP!whJzuss{ZnZqM3HSUgQEY(H7*eXLM-A0RlS$E4JZp35M` z9?bVWPD1(!EXC!n346@C%c(avX$hF|1=Z46(IDvit<+LM9BF8QTL8BYp#W{dq|bZL@$-BmX4 zpXY`{dJi*Zzyc@c)9Wn1Csyb$L-}^yWe^$o01u7v0J-xNu*9)*LgAo{0o+l;2T5?$ zV;v^7pUBG2A%oNXh+4*I83g(4oWNPO(x~J=hHb>})tiuz!A=KDR7Ek4}MwXe+ zhQ<2Jx{Ht-@;MTlqvbE`mR{?O@%RvHY2oAy@P$Wn-#=K9CSO21ha5?oE(r)~29kb7 z4__F3jg8M^(oO0@5Y2_Ilq9Tl{N&CI5wT|svM*PG%=|V|E^-M(S2WRkw0}>$7G#rw zlTmFVuuQZYwxPq-){LBvs=iK*>|R*sBZobug!KIX9LbJ7fcu5hOXy->^jTxMUH9J# zdo|`Gn!KLe(&F;s`m1G&EtZt=3-c$iJ!NuWGiYNX!PnECH7@c-q|9#1)X$qcPt3AV z^5`LH)8M5eA&u#~a+KsK)4fY8{}R{Bzs0qF>rLWws3M=0{si2YW3qI&qp|)9MXlM7 zUFYb&@Ao66P0NFYbDKeHQisKx5W|74*9;7bl;J_@d|75STKkc`+PT_Y#hr39Z%hbv zL#Tg+^?fQ09sCs?+-KJe9;Qy3T%&}TeHT8i(U6_~Nl4^kfq!D1hHmF2bvnu(e0Ym8 zID7<|Ieklc(#4pxi^)WY6rq*|RRwXkf0GzEfpqzm9h~c$pC0-Nw!{X*2xV5tB1Wcc zR8#4X!gM|4160}*lt(~h)V5XsFVV685#6afS5Kk8ddz$rmyu5Cx@jt2lLY#t%6@}a zm-{(X-ZD=7;I*A~(Qqfa&`2|G1SMYcUXq;XM1OO&){)q;QDqvCD=t*TbbQ)Vk>jR8 z4RCm-d@?`m`u>yi$otORGU&?CKudgus_t_UkKrgZ4jdi;3)!2;c;U)Zu>J~81Xf-g z#>@1=?a4}XSVp1MM2geu#yECr=7K5nU1h2`!jA|K+3n$5c20W>W%bCt%)~es6_%)t zwkE+<$L2_v*^=wr2%|6p7jEZ0KpO&{D;qWoPRY>{tK_d@8J%)Wj~#* z&{c9mgOa8@edi!itopKi2BjM=Z?3t=MDmTo6Rc)FKPs-*++Z_&@9JpmTyAp7&ZNYs zdTn(4W=n@^9#Y0Wjytk7>9)9P*0AX+w)cWT9A{*E~wCX(#wReJOb8Xqm3eik0g&POv?95JocF-xR zsxtrIav;+zr8ai+UP}oNAGA=SLQ7o1f(mk`$7VDi{mSY{uzVY^(oCOcTn)X;GizZ= zOdR9A5RTa!ddr1wj>fO{i^P>{OjqCJ+s}|3q!3f(gQ?CF%IoD{3$n0v$bvwRz~CL3}oA78ODX4{cqj7^LSrS;7Fn);z2|_ca)ETEgn&m$MF*cCVeGa z5lO8wEv0HnAJx{38Tp>q^c?NEx}@x9*B-RGjZ6}v%v`PAU^}VoW`1U4s)EtdG;2oN z?`VT+jCWHGH#@bZ(PfA()|tsRc1a{BbisI zLrk!o{aekAq4iq-%5~KV%e-fEcHa|tiwkUzeh?bUc|9*goy)4gvA{2>O(B0Xh4iGA zwvTGz_%kMZHB>pnNJBQq>hZ^Ig8=$Rir9SNYOMr}w*{bj*AfIt=^sq8MxD9Krx%#) zv+FX3#qJ-)1h`rov+h{yczg;J!Ey}0c7@YX?b7{8RB!9y2N zU<3jB9U3j0vLMy4%!3xOrtN+&7-lJ^RaVv2!hOq&0u{G+yY#{2I^9qEbtifsxhlj{ z!{m|Y#~%3K7k-#$9Iocy$Dc2GR5H0yo34;VpoXrvI`-kE>(vK05Z@M3yc1fh6{hM5 zkP9c#-pWp4>9O2X0~y%KrI49iDHmsRDF# zRI*3!;Bs33)d|r#weeI}&+wUBZp~thX6^5;>68l@%H3RIE0>zvb-$V8+8!D(Ga6>h z>Gg|ePIM*#D)sxX;VA7x%fgg!c4{0u@z&vcNm9lM=9jmXn2!y|ORjPG@Ycgr!zV3e zGCjPx`-oKw#ES(vdOiC$pRU+tS+9rOLsUbJd1+E`=Whqi$A|rzzMm%Cw@DLy&Vi28 zzljndX<1Ag1EoTrDoBb(QrV`i4M(RmEcC2CToSaCOIfI%R<(XzW_t#zj%SA{1O#mZ za|OnDt3fD^XFCLkCOa*1B$bll4y>Cjjg_o9eZ0TE?xYKIn!D`kzLagKy16btlYUop zU#VskUr<4orFuhzwG&c$dN54O)nZ0*KpSeHpZiF#(BRpp{`V3PaS!hYDXn_Cbseu)Z4&MNSWRBURkQTZ?{H7dXye;V~|LL><``CA5i*%;XqgSIKEl zk8{hO_VIq6o#5vbl`Uk(PtWwLZJ^M0s6ZB@`RS7ChP!7@d zRV)$}GGeJ1uIbj*(xZcHPPC&}Rxd}~&lpBmDF+ISa@(5A2nErwh8J6BSu3pElQI)F zt{F_?)>Cm)L>k6Sl;d>V`3-7hB{j_kZ|jIh3w|u-+NyyerdCBYr3K^jTAb$9`46EqYG=2B?rqyw<) zmJ+2*-~=y!L`O$&4Iu|U+%`(f-N$b!sQH!K-H#m>c~YpTF8}+{8IhUnB1Zo^P8w#m zZ|La}5Y|G~s3k8|xr22b#9D`h^;T|TL7LUuPkClHPqof8SIS^oX@an-xcqK*?0gJe z-^@(1S(XLDT=A4cL=Uk0fuUX=d z!7{b1C7q8_CqPwv6Ht-cnX89`X21uIt`*>u%1e(U-(&wyvLL{_-ARrRvltxd=D3ox z+wgV#!&V49m)G@|s-47yQaPVxgv&{RV#EBioWi?Fq`;;0ys^WZNaMgy4@w7QrtsyS zQy+wCZn3vBIajfHdn`wZrDmnRn0mq^WOieyuQQq#EH`ht+Ns)|Qzhf59aGl~m>*wVicT-cz}~ z#jX*D#d`RiYClt>&{0Pd347Agxl}uQf$`CPz`F5H%|3#l zHSq%zgd@aA&3rFr1vS6GTrvIC;jjYbKtZ|dGo!l?Yjz2I9P9gw&i)aeW4?X;LbhFK zS?wCXoKM+CyqtU=m`~W^HneE(=kyNf=HCT_etZ~MlDM3KXv6>di_+JMDU2VyTy-*P3#ScSYgbpWGt$ujd-k3~^b=;QeK;cIT;>7p2;Ra76 zKk<3{jdqc_dxzoWqwRN7tizG|W;^Xg6JQS3V3@IB+8N2S7r$<_TLKL)?Rq4TtiM$D z>cO*bh7-5aD}PF;u6@_uQD`+%jVUztNc1wU*NG_R=E-YCcos3M9mvL>Gt*WZ>$8!gOOEGf9=Q6Zlj?bcA2t0v=h3vG}VnMWr zV`9x}LuHSIzEZo7*2(PMI$DobW((WdIGEM!Ak3|zSK zDD^$=?QZkdsPaApy zfqC0s+%~@mD+2dA$OJln4082+P-%xvwfrV!NyA+HN;zj*%eJqA+qe3BLM?1F(HGN+gDz#c zZzdp&U4v20A`_*}zKruzB^G^MA5*C*yl>eCL1m}XU7kL|NX^(kOWW@+J80U_V!9_U z_xmMOb}>e{n4*hr7iyC|Ilxwm$dkTW34d`V5kTfa$9$A0Cn zNtYd%ij|<8ufbr&1Nys!V42*n5d~%)GfnBWSqfzp{BR9O`v_+(jAW*Zd8Z8z3ZATW zJ?IT#2-QI0?5`E?PXE@T4=-4!l3HK&7W>k9iq)T2MiU*a)u?jg$@mq!*y6i~F%_Nf z6nF{gB4!znQZ{$qC-~K$mRhn<(O7SfP`0WNNHs|$H$^9`zk}hZa7QP0(RmDfD>I8vZ)`mS-tc%&8C>Q{4SdTB7_*=MOPggC@5o#!B5=_VV+e z^1D#py~6s7mlK5b&t>!^W#JSB+&r%et0exa9tojCHj6BlaS&(MdOvZ9k)xz_)fRbP zI7dly7!2UV?LN?;SmbvY{qBKlLH@uTpZk|NK6h-6MR+8({N-i7JZ(yBv6jz}weKCs z&y>&=bXzFbky(=b(#a5>Y4dub>vxk0jqK}S`A<$C#y(-WA)=a?T=6IRw%OWz&LDB& z^-R;d8f1_m?=N4}F4?$~)6hB@_1Pf=CvQKck=0!}wX(7oD)LxKCRuY4C!O1nkB-}Z zwIW6Mnj;?y?|di5yP(((wF8|e1H4Pl_{wECgvtMo5o*NJq-jy%gTEiY<6Nd{gzHg6 z(&hiHA_eFcBlM5kjvJ|0l1tP|m7H7g;WQ2j!flVLb@-Oj|B5L2t)@D(9howpe5j5) zT7n=<_SVkx9%j*c4PLb^$h<|4lx}~JSg`;8j8Jo-4yx_7l+09Gine7cO8S#p&JQi` zt@I?4;l>o=w$3ywxOiEUl#k9;AI+rYYKQe)|8ll3B^LSo+X1xn;@qn#zrh1mSzApyp&b^G5b!3=H*UP5EKDn058AXiB?e zPPtJ|vi^2DG5Jt8=ux@;TzXG#RzvyWr+n2x4Vkps15S>^^jj%kP=j46iFfCby%&Dk zw>w$B)$Co+xs>QXcoh|3ySu_9ZloVDbLL>aBo_V<694=Tgr(LT0x9h(XYDdV@cYhX zad3Ccw!%Pyo-e=p+?zBu4a_ZgI*zy5_-rsoNt+xD?d1~H``97_+^1w;HVd+o2&BYTzGx2zo_yhTbGEtHfl7q2Q)fl*O@`e%UE zG*b(oRGJpTDpjD|rJQ*Z)V11Ke!XZpAO|*cf~)SQ_X!AX>B*$97|@+l_-1Hl{(QQr zPNZ?pXdM5_FZVi0KWJY?{51sdTS5H$4aIJER5J&_`^ckf$` z5`IWKHl_wCFNdSm#%@!muEOE^p>=CYi2+!8L`Xw%rooDjes!=)BRhR4@cE9q|QT$6~DUMb4Hox<9L|4co zpZ!tV_>f2;0+B}~04oV~n23f zP=GjWeYp)uV&!mrx!%%!!5p6(?skm}JQGe++{ag4k8{`Kvdt;7SD9bG5?NU_&Cy<- z_H#lgr2O^j=vqDsjgx2sJ(S)Y!2;jS@fwp9oe$6&3e}TY0>rj%rE~>vh0Le0qs~IN zLWb=rnToXvuWd*Xdl=^vTjcJ#k~LuSEWU(!V(<0ByQ*AG82fCaSBlJ?ch$d?IKhVL%qnmq{@Z7 zN!#a+3$vp{)^$;|9`;Qv^nt@PUE0wZ;@W;b z^>-(J@Xlx@Xsj^OXIvsO6xHC)dChw=RQ|Jon zo{E)cMxbDST2`Xd7BYc!*g&3Dk&RA}(3Cy=5i=70b-@v3`$IbbGc;a%_1jc#$jpr= zzdmdv-Oc(|xAw#xpJ7(5V~%fGV}|Q~su0>klyelDKva!gpVX(Ek@`>DU$JYfh2~Os z8G#e(=<3=LZwbtpK>-DlCi6PB%^9-Dtv-5BT}kb|x%9_BGd=JwL;fn&rf;v)Tk7Jq zXwyDlh;lv+bpp*(auoK!6ZBgwhgh7`sU;qIs28sqr!_$PQ=H=w>;YK`rYZvLftYk4;2{w(0y%_wF_i35~#|f1I$} z(9BEaC022E7s6U(IV70EQa2A}+!OD%>EP{%m**mwnfT++Kn2`9t_InSBvzymYJO+& z?qra#ims!CFxA+ScE{%@fjlR)K{nPnG*Zx>3g&E!U#SYl<}<)T6^awWu%~4mrhNLiLl+wg!VKL=1A$qrYiEyJvoxO(wTai%QXRN?x zZ%o0w1@-`p`kY)JoZr2g;AXZ|J8{7CGqg?w z7(+-lJsc#nLLHY#V_knHUjBvrg{30*)!t7H%8D6o^r*ehM#bzX@7WAz6IKVGTw~Hs z`Xj^9#kfa2I%9-Hh*~F;u!`dgpRQ&Bkg=t0jjdR}wl1yf@md%q=%mQUc*_#^?Y;w_ z`XFOi!pEIn9^9AxA3GA>hj1nh+k#SCCuwx2QD@?zKxsqq$;jcWUWB-BOIaQvWovze zvSdMnw=sL58j0azb@?EJto9r>SWfSV(fffAbxxwy)y)=mgGZ$vc=Ds~s!@U3*6il* zsns9EDf10RQzGww*g3P~-4tRg<&*A6(nb}nl1UaE^!IQ`fKP{V{WaYn^hukCIeIb# z*OQVkZ0^0#v*NrZ!|Tka}^ljS1iDVZ8g zt3TVjdzSH-;J*iIfHX;?8)SFxT(~M*h!_e}V;D`;*51GtokhGDmYY!5V+nn<8ceI1 zX?vKZtgfY{q|rx}XAI$JF8dOaPnfozxR@@VqTd`5K`leB@msAam|Z2sO5`R9PK{6#fS;X;nw^lr1T^qb`G1+Jsne&=sMAwz|92-7pEJhsdYUk*>pB>-g`lp zH88SJ#|SydCZOyXeQI4R9y%6ZtVc48V>HHmo}3H@va(MGke{Wfwx*`04&st{$!YfY z6faYvpPzxgK6#;F!{H+QVk_#~FzOhp*KfkY?}8IX#CqoO5SI?+4nW2(H2-b-@>ui zLg1Pi80z2iZtokjr9`J4kPj!Zeb0S4*|D*{xo1DS5|8x+I&%FD1{(;42d*oEa{%pmNeT}GxE0Mpwq3mk>A}lIH26p_Y)GSRue0P@6dPX6)W^$FlGNUp*Swjj!S=-$T)`?7c* zdM%zmND;i2L!vz-PblWVC2=2AJnU9c9Y(TQy4TK%jmn7|`6h@lAw}b_Ex0iuz!@vrJaW`@ z<8+Jut5Autpu90m9^eVtb;@zl8sP5a=!Y{RE{cV}UsT35T5kf>pd{oYeiwNK(L6zP~8sK`Dk1O!9Iwn`ae98B6DglW6^0pQgtsH5BJ z_>7Gk^6g;Ao>M$RbzaeMVJFt-p_mmK>@BgN(Z6_D890rhZ9 zMs3X3)i;J~Pk5>$>yi!old`0 zi61nI_--Fbb#+S`l2O0D{{a_^vdce=dI@0_{)>T00N_COM*x5SE zp)ECl=Ki9ejpnFja4)E1+-~^K=r7qD3vj*0uWX96DHFQi(4?I1U0w3dSAXPmL#;lz z3y9@vQMD4F&%-J=Ii)=Xd8FIJKl~<{NXQ2aF2tOnGi!|+^h3yN&~=e z`A1Z5@`T71whfH@kN8AjhsWE&%Cf&cyZK~$O;`*xNX7nKoFKb67=Zb_Z8^R8Uo&|W zK<&s*Yvb*19`-W4ETj4_hXw`*$;j?O55H=Iy7C{7b39AP4!Obuv=|NNApwE=5h3w^zCm|k z7s?p5Qi+qu)RYa0E*V^DU!o!W;A>(lR=( z^Y^BptEKaAfK+5t1ri4kL1S+~;@b~tAS)BwxL3SD7YnE70+8l);t-Ae)B8^gv!J71=c41-&P=(-;;Fq+?BbFhi4zs zD9^1j>*gAy;l~gkLnokJ@b>(F|4u$_Am9kny&ziZ@7-HfKa52#j5_!$mrjeWKfjA0 z^eO(%rBBf2W#3igJ38NgcBP~L@qqTKzY6~w_mZ0Jo8TrfzW=*&VVfZ16a$>`U=5K` zx(ZJ`w0ih~gQ4OfBq5_zOASVDZKEVYISO)v+D+y)_<@1CJoId2NOhs^K_iXL4CK@6 zPTgf_?OSsml|7D1lp?5i3VpM-nQ7siPiETj@K8sDkjvqg&ZF|C;80;xuZh`Mu6>b5F zHn%{vqXJr>NB6G+$RH;#6!<)>(7qbzonCtDJTS2B4J8^G$eW#*wap0kPsX?UGodeP zZ7{zrFnjYOF`#r<3DmQ@dch~b9Z zB84ahOmbwhA?N^^)!ciKkfJ|sXF?bTV}Y6~#7Usn7a?0#$h<+WS3>OwqKs<^9>hTW zg9tKX>=I(wxTP`rOURAOEtyQtl#(#l=Ad1X%6#Z2ITrmZu}PWrN>*9{H#U5U-f8Rj zS4C}Ja!ApeycJk0%`)qQ&j)(1D!($?zV*&o`nNF*bj~GN?!%s>KWp@pC@adS7GpE# z?j^5YSvvahR^BZi^pY}^eu|W^bB~{p3mk{mlnW=7RdN(14EgVTeetr?<=!Ur?l7)2 zmWo#u%(#evr?>WLL4hPl1q47j;&m@HzR0tOV`PxF$tq7nTW`2Xs=|LKOL3I?D;(BZ zAO}G1O0hIz;gyT8`N?oEn3a7YM zn?6`3EnS7fFBvX#{%rk~(A3Zinb-5Z#OvM>tExB^#lN3zG$RgY+2DqVSr1f@^IG-E z(J0iERMteRm$l~WGsvs)z-sH&A!z8Yk=Mrsv--;#p>EQ9I4{u`Aih+bxTa=hF--;r zo!bzcF8Fq*u%2q+ypwFjc(K;5D5%Rv@cxpGaAA*4sy=Fcxmx+~3VlV_-NLgBU#sEW zWiw)gUpf`Llg81LA}FSSS&(;c)ibz6?+U}_M2f>igbIfTj$mGSIF84p4Xd5cPb&Cb z4!}3!=MX(ds7GCOieX* zc)VoI#m85d=^=B6t8D&VhhN7nQ(+sKmOPn+Gs*3!JD#6dD>zi4m2x>s5@Y5y*5}^- zx@{W^8Ik!(`{d>~O-WEXE6 z6aHWA#lLp^U+l$yq5E$={wv-8uuzMM`B#bjqh;|d!~)LWBKQB$(W#lI4=#ppLofoj zXNDvFr?p#A*>Q~-cX4fgbhtPfftu+2My_{Tq&kZS8SKU)y$4vkSb5OaxU9`D-u7@NJ}Yf50V*fgS?QzwX*Q3Oa94EN}AS|&{i&{og(FUB{YO?;d19e zSEuw=g+!vFP@+erM?vXIxNYnQv322NEj7(&+ruZfR<-wtncwpJOnqV~xJ<&!>hBcg z6s5i_-C(yDH*CL*tm5N8$+&*|hYNyZW*wy;AOgPzWz1J6q%zd5I`=Ib@ovhkqf4(* zZyUz6coKV#w`^9Ju?^+4f6fa(ub^~F!7-xZte*fT)3?#cBJ#*Y4 z);*jsb!Ol4C(PwPF(a970aQsgs3I`C9Lq}!&(W5Nqy~%7gAz~Q9Um$m6QJ}iqv*E_ z!S@SAR$&|SXm6WEpBIv^K7P#*5GUz?k`X}T))AIc1ZLGkI;%oXU2PV~E;Luzj9(7J z3nO+D`gu^U_r}4Q4;Oc6cQE9aEEOm5BWeouh0{qGC2AG9&VP4;teKQX-3f#$-Ze-q zsJ$F(xkc@yaGw6ug=fcJkRx}-^Bwqg7ZB?3?DC@Cj}Ym)mk9~=7nb0p{S}D&C&N!x zBSeWKE*N^#p_j|X#oVRKZh=Q|I0ykq??3b788NkaxZ~0l9JZxHf>E4A{NKd#-0K#l zhe=VHDf#mWVLEM632khFX{2>-2M~Gww`W8$h*quzQh?!ko_|6p|Bq*Wq|ichAk}%n zqD?G*UZ5RrR{SAFc;OX}aBP^QW%f7JfBCzKy~g&!Sq!fSTXd z?EsbB#tw&tH1_1_?1!eu`gNLja)P#aZN z_21aMD>FpM1NOG8nmZ`AUHmF=zgQzv?_tGdP?>CLCc_3@l?@gs5bz z>(gjE9lnb@4M`Y2)m?p5$9}t>t$AXg!&YvqvEr*>>ETcyrbU4;MdZxRsz>eG!QPj# z1UFz*XP%`y-j7Nr?TIf|oF7VFw8uzPD6?Z~r@gkAk}y%k-WZMxD&h#L1@9VO+%9r3jf$hvEx~JNz^t zdshD<^J|*J$%K)C%-|1fo9#tpUHT!eL{q+z)w++V=E9`Ei($oxo}Id{n4P1aSg1fc zd1>`RTh{n)OT9jMSXjA-P4K#9phnu+pkg7uOKJrcG2Dpw*wL}U6<;I~a<(z5FFe&V zAHXObR6I7m{*`t6x*w$;#Ue$1{b?!Xw21u9%_K}@MJd7(Vq40rEu&%?4tqfwr5_be z{I07~Z8A`(pmA!~{s{s~FHDmoW5#OLEQAz4_3q|k!t*6$!`e&M{FJS;&k!`=7+SsS z=P~Hw?i0-Z>A~4s$E8DBF2h}r2rodW|7@DmqZW{;+XMC6ZV@B1?+oJP0x8ENSCY8y zCp^t*EwQp~{k!85Pj*Iy2PcM|92jU=Pe8Q}eu({6)`$r8z0vxs9^P@|Ox;nTTMmQr zw|`W>;erkU(wnLtT6lgsRoB|Pkim{jzm0Nj6^^cc_7e&pvR9N2dfEl7xAKtN+6yU;mdXB7BX!(xJ=ayXk$%d`2rErJwB+=;(nXp#}SAlsKGGK6i7ALB~i3gw^@} zs%wRF<+s&E2a~S^cQ>sbNf{r_me7m#PT?YkEh!{S3+5Ux`MKox5ed~=W3`%{b>qS1 z%pFmgdV)hQx8ujb55Ru`dwMxr_c@gzD~9XgA3QKJo9(Gl&{#0ns^$IqZTZe~)hw=u zU8%^9aa6vE6r6RA5v~;8m!P<}>cc4W=a7<4i^+S3(Sl&t-v0(r!7F(!!bb;NTrJ^{ z$zG*!PG1aXCShw!lTVGO3%Ssg>rhc%_YYaFCnSw$XSHT>+;agOb(HUzjS)?nHWO*W zk54phJV+P*%#c?Qz27^aYpjNw(71ai^UpM=yL~UCu3J=I*gM`c;23&rSU>V~sLCsA$ySLY(jj|7L11D_Dtq@f*MRUF8u=5kl<>wcGxx39@^0k6oUSz967Eg35xI z9ASJGi~;7AcoFaPqujRRZ<}vpqU`WOgw&ZY`}4K$rw|iD@dhS|oXl~2shsgpnUJ#e zL~!@cLAy9xjR`x6rcXly5>4)1a^g)6J?dmzYfks?WXK=L6|_kcpM8CK)b4Y1Gn>xA zjALK3iVMv1i7yAku9GucGN-OI&-- z>Nh3ZX$lq2O*mmwyHD$X`Le07<)g?N&yVX1jlK7ao49TlCk$v$_q13HR-~7;7bxjG zi>3-`ovYoVW%5SL>-7!u=D{PsdU$(zdf1tnHY;Z;&srTf@EA|;*)n(Sj0gVgWe=j& zWk#k|Ukls6n;7rKh)tDfQM727b7Z{n^LE`i^}u|ntVL(r#5VQ;m{dCS!E5IzG5EQY z?cIEo)2rnIMfBR4{L<+CUA3YtLSs2Lfd4T7W$&;X%dr+1_JLgd6;?%Xd4y7efO(*dAt^qYoRB=X z(X+JLSdDj0gS(f_w5x(Nqbd3Hj$X6918U=!8aoLWU3IXA?z<_CZt_RG=#65~i=oG0 zcI`wW-i0#v?o&{Sil*UEqgHgzXxmiZc3}MGt<~6sk?Qqp3B}^LE(L-^bTTzq_d@xY z#WB-iY2t1F6So4WMc?InFHAR9z6jTNw!bsk)!5ja?oGp_!l-tvk?^#ofpT4gL5;E zs)lzj?yRTjMURhbp1j&zhJh4#<=bx4rMCj%j%qMb4mL z#JW4hF8^f441cnrc(&*9%gl-HP7VBs2VEh6%0MwxS#vHwz8mr()lRvZJyJ{Dt~zvX zv_32C@!m@pJ&W5}RmrgVdd4NaAS;*AmlhkA6Blao-4|OP^K`hpxSttxQ4p&j6J%HQ zCDOxjiqat}H=tWEdvdbGF3+UZsrRKulUGiROT%rM@$|OLJk4z4MT2Jf`2D3gx%>9P z_m59Jker_>@^9zKh>kLv?vWHdr&9gm`!(-;si4X9=%tjq_hLEQLkGx4javpk&+gdt z*~KOAtbO;#irl@*8mBy1AB%1JH%B*rrC>8Aou+4>)s;&|ehq4~wKfo+dcAY9YAU$= z_CWMeaU<95ll8e}LFNUHve|b1DILt~0a98-&QXVf7e(c`vs;g`yb@KjuTQ@1sE*|i zlE`lipT03T+rfW-Y^STN_0fXD$C{I^(>WajX2}M#F17|kDlNIA={*yy>t|kNRwaDp zFjRUnrrpmly5hACoF1$F%!oH@c6fRH!`-662_iq^TfP6_{mY~Fo^*fkt&-H?K3I^si z%CPfVHl%bNEY9VZ{H&zoabwq|qHp&`t8`yp?ZX!4%?>?T7P9$;`5tw{v0v;tNeNBI z`w0%GdMP?88Gqs?USA%!Yt{OV)9Xr>nCSfatg6t+F>5mVti-k1$roK+(Mi^}1^AM; z6r~xb5|SS)WTx&#R}lYaMLRdknLq<_vQ}Pq1exrOCF1pJYV+f-wZ7778Z#@(PD*#~ zPkGwoB)iw{zFX`b`NZ$q`b{3PkX~ppAa>8^tcuk5o~za)zUrC7=Fw+ertj*O zm@X1PqsDTWYR{C}49N7#-@}Rf_9DXy>?bVRyZYb=hK%;PxFYxuiM95lG{&fUmkyvW9X^& zv}>e(?$uNWhnSJ6O++soIiE-Mz)X)k%T2g3}dyf}Z>ImyYO=#E(LLp49;t$kl-Y64?yD{2m; zj2hKuGYGXpgrK0{z&|szQ*)JqhFJYq?_1i9OCL8iMJ3!aTo|7`>)MIY%82LmyGHf- zMU|<^ZIsCO@Njh08TBy;^K1AN-In*deOgDsHPbFKZ}jxc@BTJn;!|`>KqZ9c%&{xY zxjiSE)29zk-zcAj#3aI2BVyH#>bWvL0w3HC#gb)1a&!G_q{?{PEKJ zP3IV$Vm9*6I-Dw{HH4D;HANjOs!Q8ntcnjkYmO~=G21>nK4zZenK|fC#b0IGDIsCt zV$a+gFL)(Ej@^_j`jsxTWjXT~{ivF&uL;o!u-~ zZ{{E$H-~l*)FZ11HLn-hHo_rKa*si%wzf!{V%&%AZ zDQ?8-vg!QI?fxHDr9AIBDVxxJFE%~Q!p#$(SO0ON%$Re@2iB{v(Z!L1>onwQG}B%X zTMB2aPD{z>xA&N})@?*H8~|q^<{JW^)x0zfz45YvhE5FoWwV5QJZ$M6f=pqsC?3V) zhal1$5+QiKdH%DwTe7MgiP>LzZ&~`fG}!LeM$x{b3%Mc*wko_y%(2PQLH5_%@`FXw zODQ`A*QF&cgY*Kll#s`xSR{%P#EvJct;KoXI3P#Dm(1R400%l>#8EXY%?TPxCNY_I zN+m+Q!$O3!Du*i*bKN6CVTT_LY%Ho-_MrhQupPVE)0W+{1T36B_|3C85n&3AELUjW zLcW$`PhY7iAUL%=34at%P4k$m57XNW2?7ubtR?98**Au)z*>G!gXr1=?BuH@%P4?L z<;30NRi$jO55uTwFF4*zv+OlEvn8~{(e{XghC#W7d&?IMz+IpIWR3S=ai~_|#Y^^+ zSqbXFBwm`Fq1c0Xl@1IT*Zez%tfJs#>Z#BNktRcVTu%%$NG3c|X_cB3`w!nH=2`Dy zJzD>@iFU`_ph&Z3F_l6SuNJD~z)&1vsAzf_C00;l{9E~DdII^pd163vp$WxfGTSuP z{GrK^glEP&u1YuF)6CWR2;r@@KEPwe-2LLj*lC9fT&Nh96T);gogEs^4YDgp#gx*L z{F=Hx7xxeM!e4~&CZx%W&(V*z^3p!YKrj2*d9GO2dB+_robKdj9g37v$9w)17q4TZb#=jU%5gyd}+?o4!_ z=Ra34;?aFaPQN9>W3;5jzM|4^Vs<)bqNaUjuxWg?soTz1Oy%f%n=>;^R$%My<2rY+ zM?8p!Y=(R|?2(NGN~?=9<%@%q_{{gy*t{pB$C@Y0GFO+5=V+Bi#t#^j8tl=v4L5Qc zi(|Tm&d^8wo@LS!`nGE2V+;1BcP#laWXdnY99JMBU$X#HYKK>z)ga*ynHImBqI|5~ z7@V2m+%nTuz%VCXbZznvzOSyOmA%W>>#A#WZkCi+Zk)WhdBavAm95$9iDr%V(q?;X z$PF%;WxbuuByGyFjZBM+oh3#lp1WILcHg_~oDXNp2i^x4zo0mK6Mr*ZuOOY%-kEPY zc+w4@_eIFn#ndl8Gx~m;jrDy_n})dS9veUPO`pp4D2$bEj&2L_@N%%neavXg$u zRZHMJ^2;&LufM@6=o~F?S#`ZVKs7|(%iS2%%IO_`>%6}ZoNUxUwY~|D*;F|7{_bc0 zH0hkL=E=U6Uj6mdw5*>mbr&ScnHQuoD<8hllka4N1`xwoc9X0J8n3j%Pt^0)VlwDq*4(SRgc~IV1cJdSeIw#FaX01#Z2IgC{Z_&oV%en+@l8(H zIG1E*Y(un>_b&1CuDiVQU+lK+&6Xc};5X5;>T->v`D4n>;cVZ-h6os`5puK*KfQqw zw;_72>rIP}ci!VJ`tRum%s5-@BmLGJyTrW*E@1O=6X#9S+1>6g-W*$Jy; zXMO#PSzY!zXSiKv*G%WBCiC2j?E%4Uk>}4(n$%?bxha)Ts`La|>i)XJZfqr1BkaU0 z)wP4HxA&Z@)=6yj`$BjvdG<_Z*}IlkVrlou(e73jjujRI%IVX#&PBfbp$$<}z_;G` z-WSKca$ZZb#4c#fShjhmV+%(5ssmW*p8a=B_q0Wrxv(>giK|;x3tvnc+SN-CJzCy6 z%Gs!fR?6AaJW$*0R%cn3EhEu{*zumx&wUP)|oGl#MQl~mthwJ;>B2S$e z8NGVB%r5+Nb0-&6!*bP-2+@5mvee=dWLAk0N)2}VQo?lSdJSa)up_f6Hfb_@L*$Zh zU&H$ECvD^eTb{Alaea;U&~dOd9@{Uu>S-H~e>g7*aOLTqr#+wQ>mLO??>C!?xc4D6 zX_vZ}s*6PL_t~~YnSoXctH0muOhxCHHj0T`6D2zLe?pnhpVQ0yUep=#(xz)acho-> zDt}X@6TDk=HHMr|d_DR$Q&eyEqHfVxVbu8+cbMi$k#Qm8Cht1OmFJN|1*99oGTjOi zGj4N5dso=F2`r@*Mj8^QW?fhJd$}}qlbL5szKosy6+iPZu49_W|LnS_V^H6LP31{| z6w9pj03$Pr1d%yf{>2P_@UB~jTU&kyD*GE|XW_+I69JPnv?5oSu@7?}onmOJE!xV3i zUTUMn-mChy<{#H)j+wBO(zYWDji}j|g58FqZ~<&vl&Ki3RrohC8_aGZhBk4)@>@2!IhM-cAkk3dfsi;-z|gh z+9B8<*w@?Gcy!D)IfZD@@RG^t$!)X3U0PHLq+APsozh<$5~gd8*lnUB%hY)n>zvm%uPjS%xONo+0$3kKcVkFQ zH4-!FGJiW|W7S~V86U>DggE(X(|L;{<=wpn`ct(J_2SQdc70^ja$|CWV-V#px@M=d zM$@N!vb)QUgeDKg+1G+T?Q~96`QZ3!sWS7#<9iDr=FV=dh`}{`DN~vqq`c+^6DC?p zKO;a3b@s4AuMeI!RRAlbc|cqa{uEa0^Srh9U+gUjdKh4IuBmrt?f9sd@5sG+14Fy^ z=HY%yn4Wp#%*^n$pzwlB83Yk5tls}jCNZBlm$l!qnOuRr-xCy$BrhUMrI1m>yJk`l zyC#pQNTHpg8-M+yxN;?O>J4%5$VSQg>-22z{u+YqbuV6;AFFCTxPRDCME0J3E+jEG zUk@n#vuclg{>16(B{*8wY3CBX&UtJU4%;^!N^I=RZ+dw_03RO5$(SJr#1~cf^~W$e zp90QN>CL$`1q;$>$Ca?BFg4m3f8VNYU&43o3=%VN4X#+vZ6&rMx6K8zCIF+rdOwi9 zWGN*+L(>iHqE4zHw(z|7_PGA{IC{5RE<`Gfl2nsrl&2Nk(1uGhgmuF@nX`q_k*7_R zZF{PBL{f*_TD8RGy5!lFi8)*A9M%y4Mnp#&y(#)(EP;;)$IRWV#`iGdLi;$0c-Ng8 zKX-J6Rn)D0s^}+#B!fQxuEnXp?4G_t6~++3W(2 zRHmIX+}o~mf4t1J;$b_+PV50JN^XE4bqC9P+(^IW>n4Ta4Fq?u>Pii;lHJc9#r-6Dwy*u?`HUZ$2h7$Ewd~!b$|W z@Zq`XTR+epvJZFhlUwZckV5j=(i+wJb;%9dvd`}u8A-@Hb0R8S_cpqARM0{)JiQ!# zV?t~9M5Q)k%-u5-3jiH>WHR4GPmbC%BmD=zPdyu~9m^o3ztJ#jY7tKki_Tr|w(0aE z@|}>)7WSjDgtR!x(E3q7tYE$*&S7WY%btxc?qEHcA<@HMTlM6xmSw|)%#gtgw4}e; z%`!US-MK$iPSa3CMPJ&FX0}4j@ab`Y5Y1{{M%k__vQyn zqP1*>{XUY<6Lv$|i#W}~;Yo*inKS#jF%K$e|YKL*Cm7R)%h6- zqdpcxrO#T_H=WXKiDSs86N6R6?qfbn_?3MY^V4aw3GgvgDX}}-Pd4A1NcMJ5Q!Y@? zm$jYV(LSek64qk;Twt=@w*u4{IzNw$4p?ld=@yZLjmn4?Va zpu&e>IsLuTqry6Ldt~>(>R0!(EuhQ`&u8DL{vs;ePP2WsCu_2R`tp%*7E;=4ubA_KHNKIK>GNcxd6DUA1>yVPpeMT*eMh_D*-qWx2L2(jt7+#b8DZu#H8 zq^PO~hS!;C2R+^7A`{DSyg&1+au^@noB0l$V_YWf!NrP)JX zSrHC!j7Qy1Zy6vSuJ1N7Y27q@?7XHRw){^)pP;ff^>FN)oWXXjJ&A3c+mq={wh_km zJ#k?lg8#N4vI6#)_vI|1ZH{i)xUeL`3O9FUyY`aph|UACVtS%#{O zQ}Igm#0NdsYT1}>W15l~JA6zrXFWkAc`3!x#)g>sbjT?+D{oJP;n$$bX8Wfzjbt** z&9dbid4QPf#w52{TjyFF`qhwD5#vp?I^3-I3i8qx00c5R;Q&Zg_RX^TdcaKDG<%I& zedsUrVjdms*b|>o-9-Gx*eDp5Sy=b!%+^f+ z0zbJVv-Ecewlp<(Idf=7YQN;i;ana!WQuAv7AWYRbj^`Tu<1Sa;+%SLtwk7+zDAUm zS#Zj`fc2^;?eMTm^yK$!n|K#&MnddRL+|lN`F8y^9j#}4+LJo@+kN!L%KBG{`~thZ z+}VM++2vSRMMZ*Rue=y}bUVkmW~m~VS+da((!j6)STAW6usx{hJ zZrLLt`DT0bnaq*A(^HY@V)D=WE@4l3X#Ne3;7H6AGOnbub}Vlh#cg9)dv*{c<#RJq zvLGYnk7Vlb`?yo`&%kmcsKlgYom}6BdFX)TF8Dyb6{5Hjy^?kiLk>7BAP_qev-=hPl8g8f2-!9>BDOCAAVZr7 z;+zSm%C8~d+n@Jb$~*0@N%{J9?|k!+Us5E&ON)6bl)Vy*?0M)))a*KB5 zMJ**w+>g)1!6HY^pa~ykvtD&+ubTi?Be_<|jo3wE{CbMAnD*Ge!JN}M_73IV)9*gj zE;IMAHEc4d`=Dm$bs4umoI3m|bS&I7w2eA^tUH@!{l;r1Hr3bM zlS4d$jLs@oCsrLsM}OplP5 zzI*!R9UHP`ewH#PG1F5W2S0^gUqS<{a>mi2VQ5K|mPu+MV{Dn=nat`}ZVuCZIdhEa z?wxa`c;WdVywfv(&VT_qR6gJQH8y%rH7Lkvy7u-xY-?4{w5k(ZC30@o>sx`IYe6Gn z67aa%fLmgAFWye#m{-c!6$gMzNumU^y&9WW4Q(K7>dRj{JpKq5XRTGIbkX8G^H+&C zCSDg>d;>V2#ckjUuP5UJ=e~~gO6<{?@FttD_wGsaMYd(;^MbZHkM>d2H`UMBx$f0q zzse0&nVF(&^w~7i*I#rVrtOuYB?IE>%%(1)^9#)N#66qRWXRf!6Q8_wu z$tyrcal9?-VThl*%g&VKf=AZO0UM-w|(i2L$!s!>NJ(|bI{0M8;^s%YfIZ%Uu@ zI#hCJnclU%`ROlNLmxJdhN&c5f0s3@|9GaBL(5e%_^mdr-f(VwCfy*#;moPj_WshO zh{T>;@$<&slZF-7)V$t2eKH((I7Do&?bgtQ1V(#0PzTI4h|u~AZvc`*Ls-pU5I+44 zvJ)+yb;w4+5db#4r3CY$82&6z*u~LN*kxUTB^+Og8h|g$1F-o;Rgm4(&;)oH>d(Jk zh3&4kfCJ<|>QV#CEI>IIK0|zo7B2`#*QpzC92P&^{j(Dfk7%Q=_My{cSgTy<15JCQ zt8SgRTTu?`u%cr-$4-HF_;w& zZ(_JH*2Ww3!SKbO2_1uk#h>AOqeY+5n2b_Hl9NKiW@R`K&$zI_=7Yyng&D1ut5%_K zr5!3;G**Oo3`ysqeWPv;Ms^us8w+x_etbkS0NIZ=uuD4DAPHXZX{k8YXNkE!65&GP zi30q1>v#aZN3hI%iN>&)WlP1q55Ts{gGNkt^!s|6SS1IV`KuK6qQPxyaBkU` z0oA`ZMuF|<$p`A)dC}keWQ)WI#XCv-Xy3CpAUsW3CqdZnt3LTa%rn0&@CG0Gy(9=W z0hOl2YQUD8B95utw3Ljz5ja3Swfv{U9qWLTPbhIHFC_d4Qheb7G?|sWXc(4bC3kGF z6eXkzu8k;-^0*uDi!Ww7QXocLa6u0EPRosuCnj-cEuq#;Hq|YU&s`!yoOZOJ<_+ZT z{G|}Qv|X#Qjio+s`TVVID?RedEMAi^O+;bAkzQiC%VKuyyU$ebtr6MfXUPfb&z>?$ z6Z|=%IN_~HZD@sr<0iCwbYxLcF2|~_!rpc}{K}d}EtjHq^f;tA(XNS93jfwvEK|r_ zwpi*lS;4yW?%t-!=`9ZH)KXV$YviL?w+>ubf@BwiCW7*z;H746Qo>YBaA4=&{Y^*kz6b zQM0z;k7!iL$`YrI$-nQ4E%sqZRUlglf2rwAL9?rJvWe0;Ufh#B{T!g`COU}7lrXZC zX(M4I!a@bd&b+P7x5H(~O9z*!wM9b?9;hX{PO+Q)zOErc`nI6ruNz^|wnQ8W*B7s_ zwp$)WR&YXfTUSG5fy?bD&fzHnXXxu>StCX(uxuaZ6`*7r+%o~4eO8&OsyD^}d6Mjd zv)ggrv~O6r$)`+$7u3mOS*1ybstTz`yI*j0L4(Aq(y1w-h8T>j>L1y_MFG zG*eK}x|+L+g3OSMzb~UWF$0mNmLgFPvaht^M#tbi5|yzAImv;}D+K7E28asAiA*g5 zGeq71H(eh@7GscR4#8nbbceFT%SX!#q8IqHpKA%!&0$CiA*75&z>j^Gwv%<1FI|Ub z=%G^^!4rr*SSSG3I7u$Kbq`HDMEZdw_=4wu>-UH_dFAr$=ynd+QQkGnwi2-0x7`D4 zI#2sQ&4Xp)C_-Q)@yB~&1xd*?bUN#}xJmZ9l{^Tq_$ zmcJibi^5;9jw`V30TCZ>Z)-<=E3jh^D_aY>g~%Egh%RtGmPCsKKcJkq?)@-j>s+DM z(sigoMCA^4pSuWz3b4Q?00PV}Gd z`XHhOpuU~k43ay(j<9m)R?88KnS9Rz&DDs}$W(boH20-`OxmAmLMS4yB>N$Ju70d*Aa#Yd^oifNSLV#je0A&z#Y1QN2V$iRJ(YB-tGk0+dfmj!Htt@}kNDhv>q6JI^8Pa+L!)S&VSJ&-`IXxr|9{ zY93rVdMOapl-nXjer&1duGY5rwz=-$KdrrIPk1*An9{pv>`Z_?;j41~6p^Q*+wQ|f zPv|%c=zTdFJ2-d1oYOn9*^LkE`XmtaO%R(uXVYZfyt{+ynBR7r7k9CYa+*?|hYSfS ztoM5KZn>ZinU9w1uTM=8_@-ce``a39!`&!S`|&4y6ag>VO6;=rg#B*2o$-i3xD$q| zume}g@7^A999u5M?%=H7L&96~QF;$Y)odk9t@@*3Qezi;!xg%2?Bp@yghQ>~m`*d8 zVkoH{(!ZMwc&SZ3q$)tx#lef1D7YgK+|eGkzy?RGEuwVXnZ7|AjC6!Xw+FWS?qmIT zfm8)W5bbNE@SQP-?gT~JQ(aZY5&EIE=zi-`$}g+139_uJI>Sog$_TY;y6`L{c6}<} z!OG$Xg#;Bx4uKRc&(fBG6xt8%FCQt=0^Un+2=tfE)GJFte%51#I;tSMvw9pOi1{Bc>c@l zuS}Z>7f^$3zYj`-!U6O`$%Dn=h@~L~t;!)?8jiJ|ZP{vOcOkP|hnpH#))A)sG@i+`VDej$*0>y4Jrst%dK8sl`6Sgv@H_^J(10uuVkW=V$Z0=4~leFopv)mhRI2X}41~ zgnZu#V4n?&gRw%4@q!K@1|2bA@CzM1FaYo&`1o?&(HxUucRQ662XsxDsWd08yRCL@ zZ8QVs%&PgF39vZOBVM16QqZpdg3NJ_6>{Yp9$Rua&Z#x?$3%mvEBtGzJLKZtD6JkX z(2D#LbbLbid%uF)c@jU@4=u+cR6NKgw#0BO5(M_P98;lM4vnEi{mpiOU5g~nSUTE0 zKFtUF!GEIzu}KRi8hk&OEnI~3o@Bup zaP1~;^%C5*n;eF~Sbt`>QRGNBX5D)oFjsE-B@wrB>-H-Vgr z`9~AJ>RbndZY$|@pneKP@My#aJ3h?-4`3Yt+38y<{-o@8u?43CF$DcBFmq0t>Sl-74cbRE&l}h`_jZ4nP?~Jesu5)hCp_>0FV25(;f02VuYs!|#8o z#xqYP<}orVOBTQgdXQ-$9z$jrq^NU)nR!|LwH61Qfg}+g0RezzM3wkN3#OxQa&k(hT@2yNAhnL9WdGw0$IrK843dM`VQeA$Bd{JlCnc49M1-hYd~2w z2&5EFd^awGpbZ>RcQpf%9+D+kioi5Pfk54F%8L>_tRP?3`VHXEFc`=OQ`F&Z`N>M& zMOuK4GaL(f|DKTo2aUEh%x#g45Vy)_Ch{UkLpGXJ#<1k2z2BF=V=>MY`N;}jp@A$U{1}OQ>fjR3hQCLXf|WtIj7uN^xH)S6uoYJ+ z5jDMi6wVeQHtWlcW$1wLBVr@(am^|9^Qn%{PY8X!rxC7P>h~khMp^2z){bA z`Na7_#KQOSZCvRgsak;aa(HQ@+u<-~#pbk0)rbO|5TR6`o;`N|N%Fve-AsO=_2Oo5 z-zX&tC#=gmm@%TZAWnQGKZR5fRW7WWAny?^Hh*#px=Cr~qv%(|U$#REEr%R-EzO6F zKa#hh76ZOtM>xWWHBQjn8ZAzu>_Lrn8E(jTH`(CJJ^;&UT{phcRF9u33nV?0HAs)W_o5PdqcHUXqj0Y|#7KgqClXya0DVf5{TG0{ED?d*|pO@7Xpra1)X5c9WwH0BTggguC)=0VfFS7ZY=e0P7KU@h2nlKb*}W#T9-*Ny1Ug4$DLhh_15dx^4K0 zim~)qU-=kcdG>Neln6^e^?Pk!U_+~0%g@lWhpW|};R{5#MenkFClA^Mvp6D^G}>6d zFkF6F=e=qrfb1))urpCB{ydhAMi={6V!Izj1Yh0uVT8F7yTk{El{*TShbd0mPk7r) zMN;b;INf#;c{Vu%K2KI)8)nr{05>ZE@0|2B&rtg4N!*{Gk_y5+a2vli1^y5v4u;gc zt9|t!-CBRtc{+S;YeF;_^F90i&(U6U7k)Vw_vE`fpo6sA)0!e*q4~mPI>S59b$f{c zmfc7=DctIc=|n+dx!r^=vp>m|@8jcHiKp@+gsG_t6Z%j41+m@O8hxg3EcE(^8$C<8 zqht6b#bhbP$;+USJR||o-Iac2HCFg8+`V~_7bjg6b{rRLZ+up2coNv7C;~+IBh1Oa zUQnv%p87!uQv9zBCws}(k9TfGMEl)Rm{6PjM!IF7cc9$PyzTgSVV!E^`+;YWeBd-E z7Jj^W_a~~t$F?&NL-0{%FX?$7Diua%n8h+-!v4usEr#3vu!Zhz!euRQ!P#8;7^$f{B}K^OkcfzwGcQE6^VDR243y*FLnM3~~t z>_WG6$o}DaZ>CFZ!HBKEK4TPM8=Ji`A#W3#VmTJ9x2Fz-U71wquKvlpZOsP#Wn3^b zPXDR2ScBjoMrgiWra^c=D~|1+c2zEP@%{}{_c*wGaKFbmUARicm^Cn-MdbG4ws8+) z!I8--7j~tyT{c?3&E@gyU|sDG9hKYQjU3E(A{-+xrw>ST6I`qzu+qOoPS!>%Qr@k= zc2fowJ~keV@DR8ys07E$mPls8(UXtJL_%#a#A|#jH44^~U_0fsh+G&l9PP))pmj!V z{OQo~0bP}Ys<-hIyg0Qd_?LP5?l0y3_0a_!0+BiSHXNbx*B^szpuv~-xcHFWNhd?AlG6p(xWM&i2nU}wfj2zX68zn+_H^6#MlHLuUP!cNk>ZiqWcmJIlNJV3=N4ySQ5SBb(ryt`J{7 zN34J+JzII?!5tzh2wM1Z?2?&qf7ZPD!CicmA1qSrX;bU}OM;?Y(bhiuNl(T7yfmYn z@>B#KK^C-0Ye;od>~L?){w#gjkgm&@XJ$kiy_y?6^5&N))<|k>Hzi6Thfu*ged6?( za7<()GkXV^Rvf^e%YS{>bLBxy56`4j=*qBC*$paR<>av19)WPg>^Zpq<5sJzS;~I#8 zrP7ej#A^}MQ)}Vy=Ch;pLO*b|Zs67?f;wkB3z6YU zfWYw&-OKjT4?UV2Fd;sMb0U>xfQjKhcRU|ZgO9~-zEV45A1y?R-?juN6^My4j1>7k zgBLlrf961{M#0i5UDIyH+ zU?af~GV4(cijoE)3i|t}3;KNGix3ZZTm*Z=_USx&g5LqN<`Ea=XD!!| z>RYIeKEroV7-)cNbPzh1@StBWyg*_L-KB(dU z_hS2A0A0pUs@v8hmH+A$!Q+3u_;0lTjhKJ0y1)`LEDLP^t?CcKER_6@wvei5m47V( jqWk~%@7MM@{_XGC&buGj!X_UNkM7~)+DX4$xb=SkOOGX$ diff --git a/docs/guide-zh-CN/images/request-lifecycle.graphml b/docs/guide-zh-CN/images/request-lifecycle.graphml new file mode 100644 index 0000000..2f88673 --- /dev/null +++ b/docs/guide-zh-CN/images/request-lifecycle.graphml @@ -0,0 +1,838 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 用户 + + + + + + + + + + + + + + + + + + + + 模型 +model + + + + + + + + + + + + + + + + + 数据库 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 视图 +view + + + + + + + + + + + + + + + + + + + + 控制器(Controller) + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + 创建动作 + + + + + + + + + + + + + + + + + 实施过滤 + + + + + + + + + + + + + + + + + + + + 动作(Action) + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + 加载模型 + + + + + + + + + + + + + + + + + 渲染视图 + + + + + + + + + + + + + + + + + + + + + 响应 +Response + + + + + + + + + + + + + + + + + 请求 +Request + + + + + + + + + + + + + + + + + + + + 应用主体 + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + 解析路由(Route) + + + + + + + + + + + + + + + + + 创建控制器 + + + + + + + + + + + + + + + + + + + + + + 入口脚本 + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + 加载应用配置 + + + + + + + + + + + + + + + + + 运行应用 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + 9 + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 + s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 + c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#74AEEE"/> + <stop offset="1" style="stop-color:#2068A3"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 + c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 + C12.523,47.135,12.878,45,13.404,44.173z"/> + <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 + c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 + C47.754,49.045,48.006,46.574,45.777,43.924z"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> + <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> + <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 + C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> + <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 + C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 + C5.569,6.97,4.903,13.375,11.151,17.751z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> +<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 + c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> +<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 + c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 + c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 + L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 + l1.46,1.834L31.04,45.982z"/> +</svg> + + + + diff --git a/docs/guide-zh-CN/images/request-lifecycle.png b/docs/guide-zh-CN/images/request-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..a35ec56c8786346df36cb7c1bf4b1871403156ca GIT binary patch literal 39966 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 literal 0 HcmV?d00001 diff --git a/docs/guide-zh-CN/runtime-overview.md b/docs/guide-zh-CN/runtime-overview.md index 9f58843..a1c61c2 100644 --- a/docs/guide-zh-CN/runtime-overview.md +++ b/docs/guide-zh-CN/runtime-overview.md @@ -18,6 +18,6 @@ 下面的示意图展示了应用是如何处理一个请求的。 -![Request Lifecycle](images/application-lifecycle.png) +![Request Lifecycle](images/request-lifecycle.png) 在这个版块中,我们会更加详细地描述某些步骤的具体运作。 diff --git a/docs/guide-zh-CN/start-workflow.md b/docs/guide-zh-CN/start-workflow.md index d918ad3..a085769 100644 --- a/docs/guide-zh-CN/start-workflow.md +++ b/docs/guide-zh-CN/start-workflow.md @@ -59,7 +59,7 @@ Yii 实现了[模型-视图-控制器 (MVC)](http://wikipedia.org/wiki/Model-vie 以下图表展示了一个应用如何处理请求: -![请求生命周期](images/application-lifecycle.png) +![请求生命周期](images/request-lifecycle.png) 1. 用户向[入口脚本](structure-entry-scripts.md) `web/index.php` 发起请求。 2. 入口脚本加载应用[配置](concept-configurations.md)并创建一个[应用](structure-applications.md)实例去处理请求。 diff --git a/docs/guide/images/application-lifecycle.graphml b/docs/guide/images/application-lifecycle.graphml deleted file mode 100644 index aed5293..0000000 --- a/docs/guide/images/application-lifecycle.graphml +++ /dev/null @@ -1,834 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - user - - - - - - - - - - - - - - - - - - - - model - - - - - - - - - - - - - - - - - database - - - - - - - - - - - - - - - - - - - - - - - - - - - - view - - - - - - - - - - - - - - - - - - - - controller - - - - - - - - - - Folder 1 - - - - - - - - - - - - - - - - create action - - - - - - - - - - - - - - - - - perform filters - - - - - - - - - - - - - - - - - - - - action - - - - - - - - - - Folder 3 - - - - - - - - - - - - - - - - load model - - - - - - - - - - - - - - - - - render view - - - - - - - - - - - - - - - - - - - - - response component - - - - - - - - - - - - - - - - - request component - - - - - - - - - - - - - - - - - - - - application - - - - - - - - - - Folder 2 - - - - - - - - - - - - - - - - resolve route - - - - - - - - - - - - - - - - - create controller - - - - - - - - - - - - - - - - - - - - - - entry script - - - - - - - - - - Folder 4 - - - - - - - - - - - - - - - - load app config - - - - - - - - - - - - - - - - - run application - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - 4 - - - - - - - - - - - - - - - - - - 9 - - - - - - - - - - - - - - - - - - 10 - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - 8 - - - - - - - - - - - - - - - - - - - - 6 - - - - - - - - - - - - - - - - - - 5 - - - - - - - - - - - - - - - - - - 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> -<g> - - <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> - <stop offset="0.2711" style="stop-color:#FFAB4F"/> - <stop offset="1" style="stop-color:#FFD28F"/> - </linearGradient> - <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 - V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 - c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 - c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 - c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 - C1.378,56.689,0.5,62.768,0.5,62.768z"/> - <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 - s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 - c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 - C40.445,49.917,26.288,53.051,26.288,53.051z"/> - - <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#74AEEE"/> - <stop offset="1" style="stop-color:#2068A3"/> - </radialGradient> - <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 - c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 - c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 - C56.055,62.768,54.211,55.906,49.529,51.225z"/> - <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 - c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 - C12.523,47.135,12.878,45,13.404,44.173z"/> - <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 - c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 - C47.754,49.045,48.006,46.574,45.777,43.924z"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 - c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> - <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 - c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> - - <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> - <stop offset="0" style="stop-color:#FFD28F"/> - <stop offset="1" style="stop-color:#FFAB4F"/> - </radialGradient> - <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 - c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 - C36.627,4.945,43.59,13.158,43.676,23.357z"/> - - <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> - <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> - <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> - </linearGradient> - <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 - c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 - c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> - <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 - c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 - s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 - L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> - <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 - C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> - <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 - C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 - C5.569,6.97,4.903,13.375,11.151,17.751z"/> -</g> -</svg> - - <?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" - xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" - xml:space="preserve"> -<defs> -</defs> -<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> -<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 - c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> -<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 - c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> -<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> -<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> -<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 - c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> -<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#3C89C9"/> - <stop offset="0.1482" style="stop-color:#60A6DD"/> - <stop offset="0.3113" style="stop-color:#81C1F0"/> - <stop offset="0.4476" style="stop-color:#95D1FB"/> - <stop offset="0.5394" style="stop-color:#9CD7FF"/> - <stop offset="0.636" style="stop-color:#98D4FD"/> - <stop offset="0.7293" style="stop-color:#8DCAF6"/> - <stop offset="0.8214" style="stop-color:#79BBEB"/> - <stop offset="0.912" style="stop-color:#5EA5DC"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 - c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="0.0039" style="stop-color:#9DD7FF"/> - <stop offset="0.2273" style="stop-color:#BDE5FF"/> - <stop offset="0.4138" style="stop-color:#D1EEFF"/> - <stop offset="0.5394" style="stop-color:#D9F1FF"/> - <stop offset="0.6155" style="stop-color:#D5EFFE"/> - <stop offset="0.6891" style="stop-color:#C9E7FA"/> - <stop offset="0.7617" style="stop-color:#B6DAF3"/> - <stop offset="0.8337" style="stop-color:#9AC8EA"/> - <stop offset="0.9052" style="stop-color:#77B0DD"/> - <stop offset="0.9754" style="stop-color:#4D94CF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 - c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> -<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> - <stop offset="0" style="stop-color:#9CD7FF"/> - <stop offset="1" style="stop-color:#3C89C9"/> -</linearGradient> -<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> -<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 - c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 - L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 - l1.46,1.834L31.04,45.982z"/> -</svg> - - - - diff --git a/docs/guide/images/application-lifecycle.png b/docs/guide/images/application-lifecycle.png deleted file mode 100644 index f9ed032cec2432925eea80ece48ad35194c3074e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38617 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�?E9#H1_bo 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 X?E)*)L#|uB2U+3i>gTe~DWM4fWOCxu diff --git a/docs/guide/images/request-lifecycle.graphml b/docs/guide/images/request-lifecycle.graphml new file mode 100644 index 0000000..aed5293 --- /dev/null +++ b/docs/guide/images/request-lifecycle.graphml @@ -0,0 +1,834 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + user + + + + + + + + + + + + + + + + + + + + model + + + + + + + + + + + + + + + + + database + + + + + + + + + + + + + + + + + + + + + + + + + + + + view + + + + + + + + + + + + + + + + + + + + controller + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + create action + + + + + + + + + + + + + + + + + perform filters + + + + + + + + + + + + + + + + + + + + action + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + load model + + + + + + + + + + + + + + + + + render view + + + + + + + + + + + + + + + + + + + + + response component + + + + + + + + + + + + + + + + + request component + + + + + + + + + + + + + + + + + + + + application + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + resolve route + + + + + + + + + + + + + + + + + create controller + + + + + + + + + + + + + + + + + + + + + + entry script + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + load app config + + + + + + + + + + + + + + + + + run application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + 9 + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 + s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 + c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#74AEEE"/> + <stop offset="1" style="stop-color:#2068A3"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 + c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 + C12.523,47.135,12.878,45,13.404,44.173z"/> + <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 + c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 + C47.754,49.045,48.006,46.574,45.777,43.924z"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> + <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> + <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 + C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> + <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 + C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 + C5.569,6.97,4.903,13.375,11.151,17.751z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> +<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 + c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> +<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 + c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 + c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 + L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 + l1.46,1.834L31.04,45.982z"/> +</svg> + + + + diff --git a/docs/guide/images/request-lifecycle.png b/docs/guide/images/request-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ed032cec2432925eea80ece48ad35194c3074e GIT binary patch literal 38617 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�?E9#H1_bo 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 X?E)*)L#|uB2U+3i>gTe~DWM4fWOCxu literal 0 HcmV?d00001 diff --git a/docs/guide/runtime-overview.md b/docs/guide/runtime-overview.md index e674582..ca6d849 100644 --- a/docs/guide/runtime-overview.md +++ b/docs/guide/runtime-overview.md @@ -19,6 +19,6 @@ Each time when a Yii application handles a request, it undergoes a similar workf The following diagram shows how an application handles a request. -![Request Lifecycle](images/application-lifecycle.png) +![Request Lifecycle](images/request-lifecycle.png) In this section, we will describe in detail how some of these steps work. diff --git a/docs/guide/start-workflow.md b/docs/guide/start-workflow.md index adcea31..efe8e1b 100644 --- a/docs/guide/start-workflow.md +++ b/docs/guide/start-workflow.md @@ -77,7 +77,7 @@ Request Lifecycle The following diagram shows how an application handles a request. -![Request Lifecycle](images/application-lifecycle.png) +![Request Lifecycle](images/request-lifecycle.png) 1. A user makes a request to the [entry script](structure-entry-scripts.md) `web/index.php`. 2. The entry script loads the application [configuration](concept-configurations.md) and creates From 5e3d81901cbfc98f50e02991f86c283afc2482da Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 7 Nov 2014 20:45:22 +0900 Subject: [PATCH 110/144] docs/guide/structure-filters.md - typo fixed [ci skip] --- docs/guide/structure-filters.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-filters.md b/docs/guide/structure-filters.md index 4268348..1a98151 100644 --- a/docs/guide/structure-filters.md +++ b/docs/guide/structure-filters.md @@ -141,7 +141,7 @@ For more details about access control in general, please refer to the [Authoriza ### Authentication Method Filters -Authentication method filters are used to authenticate a user based using various methods, such as +Authentication method filters are used to authenticate a user 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. From 1b5e1023be419d053a986acbc65ce89fa147f736 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 7 Nov 2014 15:39:54 +0300 Subject: [PATCH 111/144] Added application lifecycle diagram --- docs/guide/images/application-lifecycle.graphml | 527 ++++++++++++++++++++++++ docs/guide/images/application-lifecycle.png | Bin 0 -> 32044 bytes docs/guide/structure-applications.md | 2 + 3 files changed, 529 insertions(+) create mode 100644 docs/guide/images/application-lifecycle.graphml create mode 100644 docs/guide/images/application-lifecycle.png diff --git a/docs/guide/images/application-lifecycle.graphml b/docs/guide/images/application-lifecycle.graphml new file mode 100644 index 0000000..850863a --- /dev/null +++ b/docs/guide/images/application-lifecycle.graphml @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Entry script (index.php or yii) + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + Load application config + + + + + + + + + + + + + + + + + + + + + Create application instance + + + + + + + + + + Folder 5 + + + + + + + + + + + + + + + + preInit() + + + + + + + + + + + + + + + + + Register error handler + + + + + + + + + + + + + + + + + Configure application properties + + + + + + + + + + + + + + + + + init() + + + + + + + + + + + + + + + + + bootstrap() + + + + + + + + + + + + + + + + + + + + + + + Run application + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + EVENT_BEFORE_REQUEST + + + + + + + + + + + + + + + + + + + + + Handle request + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + Resolve request into route and parameters + + + + + + + + + + + + + + + + + Create module, controller and action + + + + + + + + + + + + + + + + + Run action + + + + + + + + + + + + + + + + + + + EVENT_AFTER_REQUEST + + + + + + + + + + + + + + + + + Send response to end user + + + + + + + + + + + + + + + + + + + Complete request processing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configuration array + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Exit status + + + + + + + + + + + + + + + + diff --git a/docs/guide/images/application-lifecycle.png b/docs/guide/images/application-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..6a505ccefb89072e4bee7691114dd6cbe2e34bc2 GIT binary patch literal 32044 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 M#?fO9(&T8+BG-Yon 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 literal 0 HcmV?d00001 diff --git a/docs/guide/structure-applications.md b/docs/guide/structure-applications.md index 0298fff..93a9735 100644 --- a/docs/guide/structure-applications.md +++ b/docs/guide/structure-applications.md @@ -589,6 +589,8 @@ followed by modules (if any), and finally applications. ## Application Lifecycle +![Application Lifecycle](images/application-lifecycle.png) + When an [entry script](structure-entry-scripts.md) is being executed to handle a request, an application will undergo the following lifecycle: From fc9240499933347560e3711606a9bae3886c9af6 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 7 Nov 2014 21:44:05 +0900 Subject: [PATCH 112/144] docs/guide-ja/images/request-lifecycle.png - replaced with the new one [ci skip] --- docs/guide-ja/images/request-lifecycle.png | Bin 40306 -> 38617 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/guide-ja/images/request-lifecycle.png b/docs/guide-ja/images/request-lifecycle.png index 1a47ee99dd5df6b3f8d9a59ad21e003f265940bd..f9ed032cec2432925eea80ece48ad35194c3074e 100644 GIT binary patch literal 38617 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�?E9#H1_bo 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 X?E)*)L#|uB2U+3i>gTe~DWM4fWOCxu literal 40306 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 Z3XP=4&l+RdW9~@TZq8qSb<-*E+~4F#ey0Ec From 1d50532cf2cb154f2b1356a79bed1184437b756b Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 7 Nov 2014 14:10:04 +0900 Subject: [PATCH 113/144] docs/guide-ja/structure-models.md - typo fixed [ci skip] --- docs/guide-ja/structure-models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ja/structure-models.md b/docs/guide-ja/structure-models.md index f87767e..0f8cbeb 100644 --- a/docs/guide-ja/structure-models.md +++ b/docs/guide-ja/structure-models.md @@ -402,7 +402,7 @@ $array = $post->attributes; しかしながら、このメソッドを使うと、どのデータ項目 (*フィールド* と呼ばれます) を結果の配列に入れるか、 そして、その項目にどのような書式を適用するかを選ぶことが出来ます。 実際、[レスポンスの書式設定](rest-response-formatting.md) で説明されているように、 -RESTFul ウェブサービスの開発においては、これがモデルをエクスポートする既定の方法となっています。 +RESTful ウェブサービスの開発においては、これがモデルをエクスポートする既定の方法となっています。 ### フィールド From 0a54def2709e9b729733dc1736803be5c0031972 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 7 Nov 2014 20:47:21 +0900 Subject: [PATCH 114/144] docs/guide-ja/* - fix regarding the word "rate" [ci skip] --- docs/guide-ja/README.md | 2 +- docs/guide-ja/start-installation.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index 97442b4..4a1e9d7 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -136,7 +136,7 @@ RESTful ウェブサービス * [ルーティング](rest-routing.md) * [レスポンスの書式設定](rest-response-formatting.md) * [認証](rest-authentication.md) -* [速度制限](rest-rate-limiting.md) +* [転送レート制限](rest-rate-limiting.md) * [バージョン管理](rest-versioning.md) * [エラー処理](rest-error-handling.md) diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 8cc7142..244b8a2 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -35,9 +35,9 @@ Composer がインストールされたら、ウェブからアクセスでき 必要なら別のディレクトリ名を選ぶことも出来ます。 > Note|注意: インストール実行中に Composer が あなたの Github アカウントの認証情報を尋ねてくることがあるかも知れません。 -> これは、Comoser が Github API の帯域制限にひっかかったためです。 +> これは、Comoser が Github API の転送レート制限にひっかかったためです。 > Composer は全てのパッケージのための大量の情報を Github から読み出さなければならないので、こうなるのは普通のことです。 -> Github にログインすると API の帯域制限が緩和され、Composer が仕事を続けることが出来るようになります。 +> Github にログインすると API の転送レート制限が緩和され、Composer が仕事を続けることが出来るようになります。 > 更なる詳細については、[Composer documentation](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) を参照してください。 > Tip|ヒント: Yii の最新の開発バージョンをインストールしたい場合は、[stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability) を追加した次のコマンドを代りに使うことが出来ます: From 20563b2b7a40e90ee6be4cc9138dd04a4297d235 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 6 Nov 2014 23:53:45 +0900 Subject: [PATCH 115/144] 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 + +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 + +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 + +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]] + +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 + +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]] + +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]] + +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]] + +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]] + +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]] + +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]] + +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()); +} +``` From 7dd5ac083127eef30ca73b85738ff597a55182b6 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 7 Nov 2014 14:10:31 +0900 Subject: [PATCH 116/144] docs/guide-ja/structure-filters.md - WIP [ci skip] --- docs/guide-ja/structure-filters.md | 92 +++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/guide-ja/structure-filters.md b/docs/guide-ja/structure-filters.md index 4268348..26e06a5 100644 --- a/docs/guide-ja/structure-filters.md +++ b/docs/guide-ja/structure-filters.md @@ -1,19 +1,20 @@ -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. +フィルタは、[コントローラアクション](structure-controllers.md#actions) の前 および/または 後に走るオブジェクトです。 +例えば、アクセスコントロールフィルタはアクションの前に走って、アクションが特定のエンドユーザだけにアクセスを許可するものであることを保証します。 +また、コンテンツ圧縮フィルタはアクションの後に走って、レスポンスのコンテンツをエンドユーザに送出する前に圧縮します。 -A filter may consist of a pre-filter (filtering logic applied *before* actions) and/or a post-filter (logic applied -*after* actions). +フィルタは、前フィルタ (アクションの *前* に適用されるフィルタのロジック) および/または 後フィルタ (アクションの *後* +に適用されるフィルタ) から構成されます。 -## Using Filters +## フィルタを使用する -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: +フィルタは、本質的には特別な種類の [ビヘイビア](concept-behaviors.md) です。したがって、フィルタを使うことは +[ビヘイビアを使う](concept-behaviors.md#attaching-behaviors) ことと同じです。下記のように、 +[[yii\base\Controller::behaviors()|behaviors()]] メソッドをオーバーライドすることによって、コントローラの中で +フィルタを宣言することが出来ます: ```php public function behaviors() @@ -31,45 +32,44 @@ public function behaviors() } ``` -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. +既定では、コントローラクラスの中で宣言されたフィルタは、そのコントローラの *全て* のアクションに適用されます。 +しかし、[[yii\base\ActionFilter::only|only]] プロパティを構成することによって、フィルタがどのアクションに適用されるべきかを +明示的に指定することも出来ます。上記の例では、 `HttpCache` フィルタは、`index` と `view` のアクションに対してのみ適用されています。 +また、[[yii\base\ActionFilter::except|except]] プロパティを構成して、いくつかのアクションをフィルタされないように除外することも可能です。 -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. +コントローラのほかに、[モジュール](structure-modules.md) または [アプリケーション](structure-applications.md) +でもフィルタを宣言することが出来ます。 +そのようにした場合、[[yii\base\ActionFilter::only|only]] と [[yii\base\ActionFilter::except|except]] のプロパティを +上で説明したように構成しない限り、そのフィルタは、モジュールまたはアプリケーションに属する *全て* のコントローラアクションに適用されます。 -> 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. +> Note|注意: モジュールやアプリケーションでフィルタを宣言する場合、[[yii\base\ActionFilter::only|only]] と + [[yii\base\ActionFilter::except|except]] のプロパティでは、アクション ID ではなく、[ルート](structure-controllers.md#routes) + を使うべきです。なぜなら、モジュールやアプリケーションのスコープでは、アクション ID だけでは完全にアクションを指定することが + 出来ないからです。 -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()`. +* 前フィルタ + - アプリケーションで宣言されたフィルタを `behaviors()` にリストされた順に適用する。 + - モジュールで宣言されたフィルタを `behaviors()` にリストされた順に適用する。 + - コントローラで宣言されたフィルタを `behaviors()` にリストされた順に適用する。 + - フィルタのどれかがアクションをキャンセルすると、そのフィルタの後のフィルタ (前フィルタと後フィルタの両方) は適用されない。 +* 前フィルタを通過したら、アクションを走らせる。 +* 後フィルタ + - コントローラで宣言されたフィルタを `behaviors()` にリストされた逆順で適用する。 + - モジュールで宣言されたフィルタを `behaviors()` にリストされた逆順で適用する。 + - アプリケーションで宣言されたフィルタを `behaviors()` にリストされた逆順で適用する。 -## Creating Filters +## フィルタを作成する -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. +新しいアクションフィルタを作成するためには、[[yii\base\ActionFilter]] を拡張して、 +[[yii\base\ActionFilter::beforeAction()|beforeAction()]] および/または [[yii\base\ActionFilter::afterAction()|afterAction()]] +メソッドをオーバーライドします。前者はアクションが走る前に実行され、後者は走った後に実行されます。 +[[yii\base\ActionFilter::beforeAction()|beforeAction()]] の返り値が、アクションが実行されるべきか否かを決定します。 +返り値が false である場合、このフィルタの後に続くフィルタはスキップされ、アクションは実行を中止されます。 -The following example shows a filter that logs the action execution time: +次の例は、アクションの実行時間をログに記録するフィルタを示すものです: ```php namespace app\components; @@ -90,17 +90,17 @@ class ActionTimeFilter extends ActionFilter public function afterAction($action, $result) { $time = microtime(true) - $this->_startTime; - Yii::trace("Action '{$action->uniqueId}' spent $time second."); + Yii::trace("アクション '{$action->uniqueId}' は $time 秒を消費。"); return parent::afterAction($action, $result); } } ``` -## Core Filters +## コアのフィルタ -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 はよく使われる一連のフィルタを提供しており、それらは、主として `yii\filters` 名前空間の下にあります。以下では、 +それらのフィルタを簡単に紹介します。 ### [[yii\filters\AccessControl|AccessControl]] From 01850733bb3e7e4664c5d081f535631a19d2ab44 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 7 Nov 2014 20:47:42 +0900 Subject: [PATCH 117/144] docs/guide-ja/structure-filters.md - completed [ci skip] --- docs/guide-ja/structure-filters.md | 121 +++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 60 deletions(-) diff --git a/docs/guide-ja/structure-filters.md b/docs/guide-ja/structure-filters.md index 26e06a5..aebb84a 100644 --- a/docs/guide-ja/structure-filters.md +++ b/docs/guide-ja/structure-filters.md @@ -105,14 +105,13 @@ Yii はよく使われる一連のフィルタを提供しており、それら ### [[yii\filters\AccessControl|AccessControl]] -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. +AccessControl は、一組の [[yii\filters\AccessControl::rules|規則]] に基づいて、シンプルなアクセスコントロールを提供するものです。 +具体的に言うと、アクションが実行される前に、AccessControl はリストされた規則を調べて、現在のコンテキスト変数 (例えば、ユーザの IP アドレスや、ユーザのログイン状態など) に最初に合致するものを見つけます。 +そして、合致した規則によって、リクエストされたアクションの実行を許可するか拒否するかを決定します。 +合致する規則がなかった場合は、アクセスは拒否されます。 -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. +次の例は、認証されたユーザに対しては `create` と `update` のアクションへのアクセスを許可し、 +その他のすべてのユーザにはこれら二つのアクションに対するアクセスを拒否する仕方を示すものです。 ```php use yii\filters\AccessControl; @@ -124,31 +123,31 @@ public function behaviors() '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. +アクセスコントロール一般について、更なる詳細は [権限](security-authorization.md) の節を参照してください。 -### Authentication Method Filters +### 認証メソッドフィルタ -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. +認証メソッドフィルタは、[HTTP Basic 認証](http://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC)、 +[OAuth 2](http://oauth.net/2/) など、様々なメソッドを使ってユーザを認証するために使われるものです。 +これらのフィルタクラスはすべて `yii\filters\auth` 名前空間の下にあります。 -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. +次の例は、[[yii\filters\auth\HttpBasicAuth]] の使い方を示すもので、HTTP Basic 認証に基づくアクセストークンを使ってユーザを認証しています。 +これを動作させるためには、あなたの [[yii\web\User::identityClass|ユーザアイデンティティクラス]] が +[[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]] +メソッドを実装していなければならないことに注意してください。 ```php use yii\filters\auth\HttpBasicAuth; @@ -163,17 +162,18 @@ public function behaviors() } ``` -Authentication method filters are commonly used in implementing RESTful APIs. For more details, please refer to the -RESTful [Authentication](rest-authentication.md) section. +認証メソッドフィルタは RESTful API を実装するときに使われるのが通例です。詳細については、 +RESTful の [認証](rest-authentication.md) の節を参照してください。 ### [[yii\filters\ContentNegotiator|ContentNegotiator]] -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. +ContentNegotiator は、レスポンス形式のネゴシエーションとアプリケーション言語のネゴシエーションをサポートします。 +このフィルタは `GET` パラメータと `Accept` HTTP ヘッダを調べることによって、レスポンス形式 および/または +言語を決定しようとします。 -In the following example, ContentNegotiator is configured to support JSON and XML response formats, and -English (United States) and German languages. +次の例では、ContentNegotiator はレスポンス形式として JSON と XML をサポートし、(合衆国の)英語とドイツ語を +言語としてサポートするように構成されています。 ```php use yii\filters\ContentNegotiator; @@ -197,11 +197,10 @@ public function behaviors() } ``` -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: +レスポンス形式と言語は [アプリケーションのライフサイクル](structure-applications.md#application-lifecycle) +のもっと早い段階で決定される必要があることがよくあります。このため、ContentNegotiator はフィルタの他に、 +[ブートストラップコンポーネント](structure-applications.md#bootstrap) としても使うことができるように設計されています。 +例えば、次のように、ContentNegotiator を [アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の中で構成することが出来ます。 ```php use yii\filters\ContentNegotiator; @@ -224,15 +223,14 @@ use yii\web\Response; ]; ``` -> 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. +> Info|情報: 望ましいコンテントタイプと言語がリクエストからは決定できない場合は、[[formats]] および [[languages]] +に挙げられている最初の形式と言語が使用されます。 ### [[yii\filters\HttpCache|HttpCache]] -HttpCache implements client-side caching by utilizing the `Last-Modified` and `Etag` HTTP headers. -For example, +HttpCache は `Last-Modified` および `Etag` の HTTP ヘッダを利用して、クライアントサイドのキャッシュを実装するものです。 ```php use yii\filters\HttpCache; @@ -252,14 +250,15 @@ public function behaviors() } ``` -Please refer to the [HTTP Caching](caching-http.md) section for more details about using HttpCache. +HttpCache に関する更なる詳細は [HTTP キャッシュ](caching-http.md) の節を参照してください。 ### [[yii\filters\PageCache|PageCache]] -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. +PageCache はサーバサイドにおけるページ全体のキャッシュを実装するものです。次の例では、PageCache が +`index` アクションに適用されて、最大 60 秒間、または、`post` テーブルのエントリ数が変化するまでの間、 +ページ全体をキャッシュしています。さらに、このページキャッシュは、選択されたアプリケーションの言語に従って、 +違うバージョンのページを保存するようにしています。 ```php use yii\filters\PageCache; @@ -284,21 +283,21 @@ public function behaviors() } ``` -Please refer to the [Page Caching](caching-page.md) section for more details about using PageCache. +PageCache の使用に関する更なる詳細は [ページキャッシュ](caching-page.md) の節を参照してください。 ### [[yii\filters\RateLimiter|RateLimiter]] -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. +RateLimiter は [リーキーバケットアルゴリズム](http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%82%AD%E3%83%BC%E3%83%90%E3%82%B1%E3%83%83%E3%83%88) +に基づいて転送レート制限のアルゴリズムを実装するものです。主として RESTful API を実装するときに使用されます。 +このフィルタの使用に関する詳細は [転送レート制限](rest-rate-limiting.md) の節を参照してください。 ### [[yii\filters\VerbFilter|VerbFilter]] -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. +VerbFilter は、HTTP リクエストメソッドがリクエストされたアクションによって許可されているかどうかをチェックするものです。 +許可されていない場合は、HTTP 405 例外を投げます。次の例では、VerbFilter が宣言されて、 +CRUD アクションに対して許可されるメソッドの典型的なセットを規定しています。 ```php use yii\filters\VerbFilter; @@ -322,14 +321,15 @@ public function behaviors() ### [[yii\filters\Cors|Cors]] -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. +クロスオリジンリソース共有 [CORS](https://developer.mozilla.org/ja/docs/HTTP_access_control) とは、 +ウェブページにおいて、さまざまなリソース (例えば、フォントや JavaScript など) を、 +それを生成するドメイン以外のドメインからリクエストすることを可能にするメカニズムです。 +特に言えば、JavaScript の AJAX 呼出しが使用することが出来る XMLHttpRequest メカニズムです。 +このような「クロスドメイン」のリクエストは、このメカニズムに拠らなければ、 +同一生成元のセキュリティポリシーによって、ウェブブラウザから禁止されるはずのものです。 +CORS は、ブラウザとサーバが交信して、クロスドメインのリクエストを許可するか否かを決定する方法を定義するものです。 -The [[yii\filters\Cors|Cors filter]] should be defined before Authentication / Authorization filters to make sure the CORS headers -will always be sent. +[[yii\filters\Cors|Cors フィルタ]] は、CORS ヘッダが常に送信されることを保証するために、Authentication / Authorization のフィルタよりも前に定義されなければなりません。 ```php use yii\filters\Cors; @@ -345,15 +345,16 @@ public function behaviors() } ``` -The Cors filtering could be tuned using the `cors` property. +Cors のフィルタリングは `cors` プロパティを使ってチューニングすることが出来ます。 -* `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`. +* `cors['Origin']`: 許可される生成元を定義するのに使われる配列。`['*']` (すべて) または `['http://www.myserver.net'、'http://www.myotherserver.com']` などが設定可能。デフォルトは `['*']`。 +* `cors['Access-Control-Request-Method']`: 許可されるメソッドの配列。たとえば、`['GET', 'OPTIONS', 'HEAD']`。デフォルトは `['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']`。 +* `cors['Access-Control-Request-Headers']`: 許可されるヘッダの配列。全てのヘッダを意味する `['*']` または特定のヘッダを示す `['X-Request-With']` が設定可能。デフォルトは `['*']`。 +* `cors['Access-Control-Allow-Credentials']`: 現在のリクエストをクレデンシャルを使ってすることが出来るかどうかを定義。 +`true`、`false` または `null` (設定なし) が設定可能。デフォルトは `null`。 +* `cors['Access-Control-Max-Age']`: プリフライトリクエストの寿命を定義。デフォルトは `86400`。 -For example, allowing CORS for origin : `http://www.myserver.net` with method `GET`, `HEAD` and `OPTIONS` : +次の例は、生成元 `http://www.myserver.net` に対する `GET`、`HEAD` および `OPTIONS` のメソッドによる CORS を許可するものです: ```php use yii\filters\Cors; @@ -373,8 +374,8 @@ public function 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 : +デフォルトのパラメータをアクション単位でオーバーライドして CORS ヘッダをチューニングすることも可能です。 +例えば、`login` アクションに `Access-Control-Allow-Credentials` を追加することは、次のようにすれば出来ます: ```php use yii\filters\Cors; From 8923d20a3f6d0cd300ac55c6c6d0b882577cd15d Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 7 Nov 2014 09:53:45 -0500 Subject: [PATCH 118/144] Fixes #5619: `yii\log\Target` should not attempt to start session when there is none --- framework/CHANGELOG.md | 1 + framework/log/Target.php | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 12e2751..28f9e03 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -10,6 +10,7 @@ Yii Framework 2 Change Log - Bug #5570: `yii\bootstrap\Tabs` would throw an exception if `content` is not set for one of its `items` (RomeroMsk) - Bug #5584: `yii\rbac\DbRbacManager` should not delete items when deleting a rule on a database not supporting cascade update (mdmunir) - Bug #5601: Simple conditions in Query::where() and ActiveQuery::where() did not allow `yii\db\Expression` to be used as the value (cebe, stevekr) +- Bug #5619: `yii\log\Target` should not attempt to start session when there is none (klimov-paul, qiangxue) - Bug #5657: `yii\caching\ApcCache::mset()` and `madd()` may cause warning in some APC setup (LAV45) - Bug #5665: The `currentPage` meta data in the RESTful result should be 1-based, similar to that in HTTP headers (qiangxue) - Bug #5682: The `asset` command would incorrectly combine CSS files when `UrlManager::linkAssets` is true (dmvslv) diff --git a/framework/log/Target.php b/framework/log/Target.php index 94a447e..c89138b 100644 --- a/framework/log/Target.php +++ b/framework/log/Target.php @@ -270,8 +270,13 @@ abstract class Target extends Component $ip = $request instanceof Request ? $request->getUserIP() : '-'; /* @var $user \yii\web\User */ + $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null; - $userID = $user ? $user->getId(false) : '-'; + if ($user && ($identity = $user->getIdentity(false))) { + $userID = $identity->getId(); + } else { + $userID = '-'; + } /* @var $session \yii\web\Session */ $session = Yii::$app->has('session', true) ? Yii::$app->get('session') : null; From b5ddde0246301549c403aca65c2e90ffed8988e8 Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Fri, 7 Nov 2014 17:17:42 +0200 Subject: [PATCH 119/144] Code style fix --- extensions/authclient/assets/authchoice.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/authclient/assets/authchoice.js b/extensions/authclient/assets/authchoice.js index 3f29434..07a8f0f 100644 --- a/extensions/authclient/assets/authchoice.js +++ b/extensions/authclient/assets/authchoice.js @@ -54,9 +54,9 @@ jQuery(function($) { var popupFeatureParts = []; for (var propName in popupOptions) { - if (popupOptions.hasOwnProperty(propName)) { - popupFeatureParts.push(propName + '=' + popupOptions[propName]); - } + if (popupOptions.hasOwnProperty(propName)) { + popupFeatureParts.push(propName + '=' + popupOptions[propName]); + } } var popupFeature = popupFeatureParts.join(','); From f1812210a85b34cf8d30eb7f21be5dc01c356618 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 7 Nov 2014 10:29:04 -0500 Subject: [PATCH 120/144] Fixes #5768: When setting `data-confirm` attribute to a submit button, clicking on the button would not trigger form submission --- framework/CHANGELOG.md | 1 + framework/assets/yii.js | 2 ++ framework/log/Target.php | 1 - 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 28f9e03..c9897e2 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -16,6 +16,7 @@ Yii Framework 2 Change Log - Bug #5682: The `asset` command would incorrectly combine CSS files when `UrlManager::linkAssets` is true (dmvslv) - Bug #5702: Parenthesis should be automatically added to `Validator::whenClient` to avoid js error (mdmunir, qiangxue) - Bug #5745: Gii and debug modules may cause 404 exception when the route contains dashes (qiangxue) +- Bug #5768: When setting `data-confirm` attribute to a submit button, clicking on the button would not trigger form submission (qiangxue) - Bug #5780: `QueryBuilder::batchInsert()` may cause "undefined index" error (qiangxue) - Bug #5833: The `message` command fails with a FK constraint error when trying to update messages (qiangxue) - Bug #5893: `yii\helpers\ArrayHelper::toArray()` now applies `$properties` parameter for converting descending objects in recursive calls (otsec) diff --git a/framework/assets/yii.js b/framework/assets/yii.js index 3b5b7a0..29458d2 100644 --- a/framework/assets/yii.js +++ b/framework/assets/yii.js @@ -131,6 +131,8 @@ yii = (function ($) { if (method === undefined) { if (action && action != '#') { window.location = action; + } else if ($e.filter(':submit') && $form.length) { + $form.trigger('submit'); } return; } diff --git a/framework/log/Target.php b/framework/log/Target.php index c89138b..d05bdbf 100644 --- a/framework/log/Target.php +++ b/framework/log/Target.php @@ -270,7 +270,6 @@ abstract class Target extends Component $ip = $request instanceof Request ? $request->getUserIP() : '-'; /* @var $user \yii\web\User */ - $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null; if ($user && ($identity = $user->getIdentity(false))) { $userID = $identity->getId(); From fe546cd22f9f93f166eb9e94385c14df52279755 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 7 Nov 2014 10:47:38 -0500 Subject: [PATCH 121/144] Fixes #5688: Added optional `$formName` to `Model::loadMultiple()` to support customizing form name directly --- framework/CHANGELOG.md | 1 + framework/base/Model.php | 30 ++++++++++++++++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index c9897e2..9601969 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -32,6 +32,7 @@ Yii Framework 2 Change Log - Enh #5600: Allow configuring debug panels in `yii\debug\Module::panels` as panel class name strings (qiangxue) - Enh #5613: Added `--overwrite` option to Gii console command to support overwriting all files (motin, qiangxue) - Enh #5646: Call `yii\base\ErrorHandler::unregister()` instead of `restore_*_handlers` directly (aivus) +- Enh #5688: Added optional `$formName` to `Model::loadMultiple()` to support customizing form name directly (qiangxue) - Enh #5735: Added `yii\bootstrap\Tabs::renderTabContent` to support manually rendering tab contents (RomeroMsk) - Enh #5770: Added more PHP error names for `ErrorException` (mongosoft) - Enh #5806: Allow `Html::encode()` to be used when the application is not started (qiangxue) diff --git a/framework/base/Model.php b/framework/base/Model.php index 048baf5..e1a2818 100644 --- a/framework/base/Model.php +++ b/framework/base/Model.php @@ -763,25 +763,31 @@ class Model extends Component implements IteratorAggregate, ArrayAccess, Arrayab * @param array $models the models to be populated. Note that all models should have the same class. * @param array $data the data array. This is usually `$_POST` or `$_GET`, but can also be any valid array * supplied by end user. - * @return boolean whether the model is successfully populated with some data. + * @param string $formName the form name to be used for loading the data into the models. + * If not set, it will use the [[formName()]] value of the first model in `$models`. + * @return boolean whether at least one of the models is successfully populated. */ - public static function loadMultiple($models, $data) + public static function loadMultiple($models, $data, $formName = null) { - /* @var $model Model */ - $model = reset($models); - if ($model === false) { - return false; + if ($formName === null) { + /* @var $first Model */ + $first = reset($models); + if ($first === false) { + return false; + } + $formName = $first->formName(); } + $success = false; - $scope = $model->formName(); foreach ($models as $i => $model) { - if ($scope == '') { - if (isset($data[$i])) { - $model->setAttributes($data[$i]); + /* @var $model Model */ + if ($formName == '') { + if (!empty($data[$i])) { + $model->load($data[$i], ''); $success = true; } - } elseif (isset($data[$scope][$i])) { - $model->setAttributes($data[$scope][$i]); + } elseif (!empty($data[$formName][$i])) { + $model->load($data[$formName][$i], ''); $success = true; } } From 0c8f3f22709aa2febd55a7a70048e85f7f64aece Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 7 Nov 2014 11:17:16 -0500 Subject: [PATCH 122/144] Fixes #5965. --- extensions/composer/Plugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/composer/Plugin.php b/extensions/composer/Plugin.php index 1f08d53..3ddf277 100644 --- a/extensions/composer/Plugin.php +++ b/extensions/composer/Plugin.php @@ -28,7 +28,7 @@ class Plugin implements PluginInterface $composer->getInstallationManager()->addInstaller($installer); $file = rtrim($composer->getConfig()->get('vendor-dir'), '/') . '/yiisoft/extensions.php'; if (!is_file($file)) { - @mkdir(dirname($file)); + @mkdir(dirname($file), 0777, true); file_put_contents($file, " Date: Fri, 7 Nov 2014 11:30:25 -0500 Subject: [PATCH 123/144] Fixes #5452: Errors occurring after the response is sent are not displayed --- framework/CHANGELOG.md | 1 + framework/web/ErrorHandler.php | 1 + 2 files changed, 2 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9601969..080af13 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -7,6 +7,7 @@ Yii Framework 2 Change Log - Bug #4471: `yii\caching\ApcCache::getValues()` now returns array in case of APC is installed but not enabled in CLI mode (samdark, cebe) - Bug #4889: Application was getting into redirect loop when user wasn't allowed accessing login page. Now shows 403 (samdark) - Bug #5402: Debugger was not loading when there were closures in asset classes (samdark) +- Bug #5452: Errors occurring after the response is sent are not displayed (qiangxue) - Bug #5570: `yii\bootstrap\Tabs` would throw an exception if `content` is not set for one of its `items` (RomeroMsk) - Bug #5584: `yii\rbac\DbRbacManager` should not delete items when deleting a rule on a database not supporting cascade update (mdmunir) - Bug #5601: Simple conditions in Query::where() and ActiveQuery::where() did not allow `yii\db\Expression` to be used as the value (cebe, stevekr) diff --git a/framework/web/ErrorHandler.php b/framework/web/ErrorHandler.php index 5dd19ee..8022605 100644 --- a/framework/web/ErrorHandler.php +++ b/framework/web/ErrorHandler.php @@ -69,6 +69,7 @@ class ErrorHandler extends \yii\base\ErrorHandler { if (Yii::$app->has('response')) { $response = Yii::$app->getResponse(); + $response->isSent = false; } else { $response = new Response(); } From 8af62ee97b1525dbc323a1850fef0619c51f5a54 Mon Sep 17 00:00:00 2001 From: Mark Ragazzo Date: Fri, 7 Nov 2014 23:20:03 +0400 Subject: [PATCH 124/144] fixed fixture controller config for applications --- apps/advanced/tests/codeception/bin/yii | 1 + apps/basic/tests/codeception/bin/yii | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/advanced/tests/codeception/bin/yii b/apps/advanced/tests/codeception/bin/yii index ee73d59..ecdd8f6 100644 --- a/apps/advanced/tests/codeception/bin/yii +++ b/apps/advanced/tests/codeception/bin/yii @@ -22,6 +22,7 @@ $config = yii\helpers\ArrayHelper::merge( 'class' => 'yii\faker\FixtureController', 'fixtureDataPath' => '@tests/codeception/common/fixtures/data', 'templatePath' => '@tests/codeception/common/templates/fixtures', + 'namespace' => 'tests\codeception\common\fixtures', ], ], ] diff --git a/apps/basic/tests/codeception/bin/yii b/apps/basic/tests/codeception/bin/yii index fda028e..c7f2653 100644 --- a/apps/basic/tests/codeception/bin/yii +++ b/apps/basic/tests/codeception/bin/yii @@ -18,7 +18,8 @@ $config = yii\helpers\ArrayHelper::merge( 'fixture' => [ 'class' => 'yii\faker\FixtureController', 'fixtureDataPath' => '@tests/codeception/fixtures', - 'templatePath' => '@tests/codeception/templates' + 'templatePath' => '@tests/codeception/templates', + 'namespace' => 'tests\codeception\fixtures', ], ], ] From 95532377776e93a1cc7b2498363b66f4e45f780d Mon Sep 17 00:00:00 2001 From: Alexander Mohorev Date: Sat, 8 Nov 2014 01:41:01 +0300 Subject: [PATCH 125/144] No need to return from __construct --- extensions/bootstrap/ActiveField.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/bootstrap/ActiveField.php b/extensions/bootstrap/ActiveField.php index ac7de5f..908d7b4 100644 --- a/extensions/bootstrap/ActiveField.php +++ b/extensions/bootstrap/ActiveField.php @@ -153,7 +153,7 @@ class ActiveField extends \yii\widgets\ActiveField { $layoutConfig = $this->createLayoutConfig($config); $config = ArrayHelper::merge($layoutConfig, $config); - return parent::__construct($config); + parent::__construct($config); } /** From b54ba5b36a379f8e88fab50888768376588d9d44 Mon Sep 17 00:00:00 2001 From: Nate Sanden Date: Fri, 7 Nov 2014 15:53:19 -0800 Subject: [PATCH 126/144] Just a few changes - seems to read better to me --- docs/guide/test-overview.md | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/docs/guide/test-overview.md b/docs/guide/test-overview.md index 5ab442d..33f455f 100644 --- a/docs/guide/test-overview.md +++ b/docs/guide/test-overview.md @@ -3,11 +3,10 @@ Testing Testing is an important part of software development. Whether we are aware of it or not, we conduct testing continuously. For example, when we write a class in PHP, we may debug it step by step or simply use echo or die statements to verify -that implementation works according to our initial plan. In case of web application we're entering some test data in forms -to ensure the page interacts with us as expected. The testing process could be automated so that each time when we need -to verify something, we just need to call up the code that do it for us. The code that verifies that result matches what -we've planned is called test and the process of its creation and further execution is known as automated testing, which -is the main topic of testing chapters. +the implementation works according to our initial plan. In the case of a web application, we're entering some test data +in forms to ensure the page interacts with us as expected. The testing process could be automated so that each time when we need to verify something, we just need to call up the code that does it for us. The code that verifies the result matches +what we've planned is called test and the process of its creation and further execution is known as automated testing, +which is the main topic of these testing chapters. Developing with tests @@ -21,25 +20,25 @@ behavior is achieved. The process of developing a feature is the following: - Create a new test that describes a feature to be implemented. -- Run new test and make sure it fails. It is expected since there's no implementation yet. +- Run the new test and make sure it fails. It is expected since there's no implementation yet. - Write simple code to make the new test pass. - Run all tests and make sure they all pass. - Improve code and make sure tests are still OK. -After it's done the process is repeated again for another feature or improvement. If existing feature is to be changed, +After it's done the process is repeated again for another feature or improvement. If the existing feature is to be changed, tests should be changed as well. > **Tip**: If you feel that you are losing time doing a lot of small and simple iterations, try covering more by your > test scenario so you do more before executing tests again. If you're debugging too much, try doing the opposite. -The reason to create tests before doing any implemenation is that it allows you to focus on what do we want to achieve +The reason to create tests before doing any implemenation is that it allows us to focus on what we want to achieve and fully dive into "how to do it" afterwards. Usually it leads to better abstractions and easier test maintenance when -it comes to feature adjustments in for of less coupled components. +it comes to feature adjustments or less coupled components. -So to sum up pros of such approach are the following: +So to sum up the pros of such an approach are the following: -- Keeps you focused on one thing at a time so both planning and implementation are getting better. -- Results in test-covering more features in greater detail i.e. if tests are OK most probably nothing's broken. +- Keeps you focused on one thing at a time which results in improved planning and implementation. +- Results in test-covering more features in greater detail i.e. if tests are OK most likely nothing's broken. In the long term it usually gives you a good time-saving effect. @@ -49,7 +48,7 @@ In the long term it usually gives you a good time-saving effect. When and how to test ------------------ -While test first approach described above makes sense for long term and relatively complex projects it could be overkill +While the test first approach described above makes sense for long term and relatively complex projects it could be overkill for simpler ones. There are some indicators of when it's appropriate: - Project is already large and complex. @@ -64,8 +63,8 @@ There's nothing wrong in creating tests covering behavior of existing implementa In some cases any form of automated testing could be overkill: -- Project is simple and isn't getting any complex. -- It's one-time project that's going to be expired. +- Project is simple and isn't getting anymore complex. +- It's a one-time project that will no longer be worked on. Still if you have time it's good to automate testing in these cases as well. From 33c16380b450899ccbe92eed028f933f4138de5d Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Wed, 5 Nov 2014 20:06:01 +0900 Subject: [PATCH 127/144] [skip ci] Fixes for structure-views.md --- docs/guide/structure-views.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide/structure-views.md b/docs/guide/structure-views.md index beb77f9..ee048cf 100644 --- a/docs/guide/structure-views.md +++ b/docs/guide/structure-views.md @@ -585,8 +585,8 @@ $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php' ``` The above code will register a "keywords" meta tag with the view component. The registered meta tag is -rendered after the layout finishes rendering. By then, the following HTML code will be inserted -at the place where you call [[yii\web\View::head()]] in the layout and generate the following HTML code: +rendered after the layout finishes rendering. The following HTML code will be generated and inserted +at the place where you call [[yii\web\View::head()]] in the layout: ```php @@ -606,7 +606,7 @@ $this->registerMetaTag(['name' => 'description', 'content' => 'This website is a ### Registering Link Tags -Like [meta tags](#adding-meta-tags), link tags are useful in many cases, such as customizing favicon, pointing to +Like [meta tags](#registering-meta-tags), link tags are useful in many cases, such as customizing favicon, pointing to RSS feed or delegating OpenID to another server. You can work with link tags in the similar way as meta tags by using [[yii\web\View::registerLinkTag()]]. For example, in a content view, you can register a link tag like follows, @@ -626,7 +626,7 @@ The code above will result in ``` Similar as [[yii\web\View::registerMetaTag()|registerMetaTags()]], you can specify a key when calling -[[yii\web\View::registerLinkTag()|registerLinkTag()]] to avoid generated repeated link tags. +[[yii\web\View::registerLinkTag()|registerLinkTag()]] to avoid generating repeated link tags. ## View Events From 12f9180b40704b31a2d7557dbad650e52d97fdd7 Mon Sep 17 00:00:00 2001 From: Paul Klimov Date: Sat, 8 Nov 2014 14:09:13 +0200 Subject: [PATCH 128/144] Method 'oneWithModify' renamed to 'modify' at `yii\mongodb\Query` --- extensions/mongodb/ActiveQuery.php | 4 ++-- extensions/mongodb/Query.php | 2 +- tests/unit/extensions/mongodb/ActiveRecordTest.php | 4 ++-- tests/unit/extensions/mongodb/QueryRunTest.php | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/mongodb/ActiveQuery.php b/extensions/mongodb/ActiveQuery.php index fc80373..d84089c 100644 --- a/extensions/mongodb/ActiveQuery.php +++ b/extensions/mongodb/ActiveQuery.php @@ -169,9 +169,9 @@ class ActiveQuery extends Query implements ActiveQueryInterface * Depending on the setting of [[asArray]], the query result may be either an array or an ActiveRecord object. * Null will be returned if the query results in nothing. */ - public function oneWithModify($update, $options = [], $db = null) + public function modify($update, $options = [], $db = null) { - $row = parent::oneWithModify($update, $options, $db); + $row = parent::modify($update, $options, $db); if ($row !== null) { $models = $this->populate([$row]); return reset($models) ?: null; diff --git a/extensions/mongodb/Query.php b/extensions/mongodb/Query.php index 7975c33..27a07ac 100644 --- a/extensions/mongodb/Query.php +++ b/extensions/mongodb/Query.php @@ -205,7 +205,7 @@ class Query extends Component implements QueryInterface * @param Connection $db the Mongo connection used to execute the query. * @return array|null the original document, or the modified document when $options['new'] is set. */ - public function oneWithModify($update, $options = [], $db = null) + public function modify($update, $options = [], $db = null) { $collection = $this->getCollection($db); if (!empty($this->orderBy)) { diff --git a/tests/unit/extensions/mongodb/ActiveRecordTest.php b/tests/unit/extensions/mongodb/ActiveRecordTest.php index 617b116..b89fdac 100644 --- a/tests/unit/extensions/mongodb/ActiveRecordTest.php +++ b/tests/unit/extensions/mongodb/ActiveRecordTest.php @@ -264,14 +264,14 @@ class ActiveRecordTest extends MongoDbTestCase $this->assertEquals(7, $rowRefreshed->status); } - public function testFindOneWithModify() + public function testModify() { $searchName = 'name7'; $newName = 'new name'; $customer = Customer::find() ->where(['name' => $searchName]) - ->oneWithModify(['$set' => ['name' => $newName]], ['new' => true]); + ->modify(['$set' => ['name' => $newName]], ['new' => true]); $this->assertTrue($customer instanceof Customer); $this->assertEquals($newName, $customer->name); } diff --git a/tests/unit/extensions/mongodb/QueryRunTest.php b/tests/unit/extensions/mongodb/QueryRunTest.php index 928fa18..46dceaf 100644 --- a/tests/unit/extensions/mongodb/QueryRunTest.php +++ b/tests/unit/extensions/mongodb/QueryRunTest.php @@ -211,7 +211,7 @@ class QueryRunTest extends MongoDbTestCase $this->assertEquals($rows, $rowsUppercase); } - public function testOneWithModify() + public function testModify() { $connection = $this->getConnection(); @@ -221,14 +221,14 @@ class QueryRunTest extends MongoDbTestCase $newName = 'new name'; $row = $query->from('customer') ->where(['name' => $searchName]) - ->oneWithModify(['$set' => ['name' => $newName]], ['new' => false], $connection); + ->modify(['$set' => ['name' => $newName]], ['new' => false], $connection); $this->assertEquals($searchName, $row['name']); $searchName = 'name7'; $newName = 'new name'; $row = $query->from('customer') ->where(['name' => $searchName]) - ->oneWithModify(['$set' => ['name' => $newName]], ['new' => true], $connection); + ->modify(['$set' => ['name' => $newName]], ['new' => true], $connection); $this->assertEquals($newName, $row['name']); } From cac70705b07522ead9d0136666a036315ce1dc04 Mon Sep 17 00:00:00 2001 From: Paul Klimov Date: Sat, 8 Nov 2014 14:14:14 +0200 Subject: [PATCH 129/144] UPGRADE.md for 'mongodb' extension added --- extensions/mongodb/UPGRADE.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 extensions/mongodb/UPGRADE.md diff --git a/extensions/mongodb/UPGRADE.md b/extensions/mongodb/UPGRADE.md new file mode 100644 index 0000000..4df689c --- /dev/null +++ b/extensions/mongodb/UPGRADE.md @@ -0,0 +1,16 @@ +Upgrading Instructions for Yii Framework v2 +=========================================== + +!!!IMPORTANT!!! + +The following upgrading instructions are cumulative. That is, +if you want to upgrade from version A to version C and there is +version B between A and C, you need to following the instructions +for both A and B. + +Upgrade from Yii 2.0.0 +---------------------- + +* MongoDB PHP extension min version raised up to 1.4.0. You should upgrade your environment in case you are + using older version. + From 1008249b54ef2826b0d62062ab44ecc08a2505d5 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sat, 8 Nov 2014 08:52:27 -0500 Subject: [PATCH 130/144] Fixes incorrect submit button detection. --- framework/assets/yii.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/assets/yii.js b/framework/assets/yii.js index 29458d2..280591e 100644 --- a/framework/assets/yii.js +++ b/framework/assets/yii.js @@ -131,7 +131,7 @@ yii = (function ($) { if (method === undefined) { if (action && action != '#') { window.location = action; - } else if ($e.filter(':submit') && $form.length) { + } else if ($e.is(':submit') && $form.length) { $form.trigger('submit'); } return; From ca8f0b6e9e0b37949832e1bfb1fe0e92fb89206f Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 9 Nov 2014 03:37:41 +0900 Subject: [PATCH 131/144] docs/guide-ja/images/* synced to docs/guide/images/* [ci skip] Conflicts: docs/guide-ja/images/application-lifecycle.png --- docs/guide-ja/images/advanced-app-configs.graphml | 436 +++++++++++ docs/guide-ja/images/advanced-app-configs.png | Bin 0 -> 13392 bytes docs/guide-ja/images/application-lifecycle.graphml | 527 +++++++++++++ docs/guide-ja/images/application-lifecycle.png | Bin 0 -> 32044 bytes docs/guide-ja/images/application-structure.graphml | 430 +++++++++++ docs/guide-ja/images/gii-entry.png | Bin 0 -> 45302 bytes docs/guide-ja/images/gii-preview.png | Bin 0 -> 41620 bytes docs/guide-ja/images/rbac-access-check-1.graphml | 368 +++++++++ docs/guide-ja/images/rbac-access-check-1.png | Bin 0 -> 19024 bytes docs/guide-ja/images/rbac-access-check-2.graphml | 368 +++++++++ docs/guide-ja/images/rbac-access-check-2.png | Bin 0 -> 19364 bytes docs/guide-ja/images/rbac-access-check-3.graphml | 368 +++++++++ docs/guide-ja/images/rbac-access-check-3.png | Bin 0 -> 19336 bytes docs/guide-ja/images/rbac-hierarchy-1.graphml | 312 ++++++++ docs/guide-ja/images/rbac-hierarchy-1.png | Bin 0 -> 16085 bytes docs/guide-ja/images/rbac-hierarchy-2.graphml | 368 +++++++++ docs/guide-ja/images/rbac-hierarchy-2.png | Bin 0 -> 18786 bytes docs/guide-ja/images/request-lifecycle.graphml | 834 +++++++++++++++++++++ 18 files changed, 4011 insertions(+) create mode 100644 docs/guide-ja/images/advanced-app-configs.graphml create mode 100644 docs/guide-ja/images/advanced-app-configs.png create mode 100644 docs/guide-ja/images/application-lifecycle.graphml create mode 100644 docs/guide-ja/images/application-lifecycle.png create mode 100644 docs/guide-ja/images/application-structure.graphml create mode 100644 docs/guide-ja/images/gii-entry.png create mode 100644 docs/guide-ja/images/gii-preview.png create mode 100644 docs/guide-ja/images/rbac-access-check-1.graphml create mode 100644 docs/guide-ja/images/rbac-access-check-1.png create mode 100644 docs/guide-ja/images/rbac-access-check-2.graphml create mode 100644 docs/guide-ja/images/rbac-access-check-2.png create mode 100644 docs/guide-ja/images/rbac-access-check-3.graphml create mode 100644 docs/guide-ja/images/rbac-access-check-3.png create mode 100644 docs/guide-ja/images/rbac-hierarchy-1.graphml create mode 100644 docs/guide-ja/images/rbac-hierarchy-1.png create mode 100644 docs/guide-ja/images/rbac-hierarchy-2.graphml create mode 100644 docs/guide-ja/images/rbac-hierarchy-2.png create mode 100644 docs/guide-ja/images/request-lifecycle.graphml diff --git a/docs/guide-ja/images/advanced-app-configs.graphml b/docs/guide-ja/images/advanced-app-configs.graphml new file mode 100644 index 0000000..05a053e --- /dev/null +++ b/docs/guide-ja/images/advanced-app-configs.graphml @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + console + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + + + + + backend + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + + index + + + + + + + + + + + + + + + + + + + + frontend + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + params + + + + + + + + + + + + + + + + + params-local + + + + + + + + + + + + + + + + + main + + + + + + + + + + + + + + + + + main-local + + + + + + + + + + + + + + + + + + + aliases + + + + + + + + + + + + + + + + + + + + common + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + params-local + + + + + + + + + + + + + + + + + main-local + + + + + + + + + + + + + + + + + params + + + + + + + + + + + + + + + + + main + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/guide-ja/images/advanced-app-configs.png b/docs/guide-ja/images/advanced-app-configs.png new file mode 100644 index 0000000000000000000000000000000000000000..daa9a6f9e8b00c2017962288d48ef56277c33d78 GIT binary patch literal 13392 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 + + + + + + + + + + + + + + + + + + + + + + + + + Entry script (index.php or yii) + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + Load application config + + + + + + + + + + + + + + + + + + + + + Create application instance + + + + + + + + + + Folder 5 + + + + + + + + + + + + + + + + preInit() + + + + + + + + + + + + + + + + + Register error handler + + + + + + + + + + + + + + + + + Configure application properties + + + + + + + + + + + + + + + + + init() + + + + + + + + + + + + + + + + + bootstrap() + + + + + + + + + + + + + + + + + + + + + + + Run application + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + EVENT_BEFORE_REQUEST + + + + + + + + + + + + + + + + + + + + + Handle request + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + Resolve request into route and parameters + + + + + + + + + + + + + + + + + Create module, controller and action + + + + + + + + + + + + + + + + + Run action + + + + + + + + + + + + + + + + + + + EVENT_AFTER_REQUEST + + + + + + + + + + + + + + + + + Send response to end user + + + + + + + + + + + + + + + + + + + Complete request processing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configuration array + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Exit status + + + + + + + + + + + + + + + + diff --git a/docs/guide-ja/images/application-lifecycle.png b/docs/guide-ja/images/application-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..6a505ccefb89072e4bee7691114dd6cbe2e34bc2 GIT binary patch literal 32044 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 M#?fO9(&T8+BG-Yon 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 literal 0 HcmV?d00001 diff --git a/docs/guide-ja/images/application-structure.graphml b/docs/guide-ja/images/application-structure.graphml new file mode 100644 index 0000000..f6fce48 --- /dev/null +++ b/docs/guide-ja/images/application-structure.graphml @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + + application +component + + + + + + + + + + + + + + + + + entry script + + + + + + + + + + + + + + + + + application + + + + + + + + + + + + + + + + + controller + + + + + + + + + + + + + + + + + filter + + + + + + + + + + + + + + + + + module + + + + + + + + + + + + + + + + + view + + + + + + + + + + + + + + + + + model + + + + + + + + + + + + + + + + + widget + + + + + + + + + + + + + + + + + asset bundle + + + + + + + + + + + + + + + + + 1:1 + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + 1..* + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + + + + 0..* + + + + + + + + + + + + + + + + diff --git a/docs/guide-ja/images/gii-entry.png b/docs/guide-ja/images/gii-entry.png new file mode 100644 index 0000000000000000000000000000000000000000..0a145f909f622664b5bd709a8d08d34ef5e5093a GIT binary patch literal 45302 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�!ha9!B8Wn0j#sGzj%76GY((wmBch2C3;7$Qmt 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 literal 0 HcmV?d00001 diff --git a/docs/guide-ja/images/rbac-access-check-1.graphml b/docs/guide-ja/images/rbac-access-check-1.graphml new file mode 100644 index 0000000..4407851 --- /dev/null +++ b/docs/guide-ja/images/rbac-access-check-1.graphml @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + + + + + + + admin + + + + + + + + + + + + + + + + + author + + + + + + + + + + + + + + + + + John, ID=2 + + + + + + + + + + + + + + + + + + + + Jane, ID=1 + + + + + + + + + + + + + + + + + + + + updatePost + + + + + + + + + + + + + + + + + updateOwnPost + + + + + + + + + + + + + + + + + createPost + + + + + + + + + + + + + + + + + AuthorRule + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + + <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 + c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 + c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 + c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 + c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> + + <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 + c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 + c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> + + <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + + <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 + C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 + c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 + s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 + c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> + + <linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> + <stop offset="0" style="stop-color:#49AD33"/> + <stop offset="1" style="stop-color:#C2DA92"/> + </linearGradient> + <path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 + c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> +</g> +</svg> + + + + diff --git a/docs/guide-ja/images/rbac-access-check-1.png b/docs/guide-ja/images/rbac-access-check-1.png new file mode 100644 index 0000000000000000000000000000000000000000..77ad551c26d4f4b4a3cf4d9b7cfd5f4b7472ec82 GIT binary patch literal 19024 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 literal 0 HcmV?d00001 diff --git a/docs/guide-ja/images/rbac-access-check-2.graphml b/docs/guide-ja/images/rbac-access-check-2.graphml new file mode 100644 index 0000000..c521d42 --- /dev/null +++ b/docs/guide-ja/images/rbac-access-check-2.graphml @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + + + + + + + admin + + + + + + + + + + + + + + + + + author + + + + + + + + + + + + + + + + + John, ID=2 + + + + + + + + + + + + + + + + + + + + Jane, ID=1 + + + + + + + + + + + + + + + + + + + + updatePost + + + + + + + + + + + + + + + + + updateOwnPost + + + + + + + + + + + + + + + + + createPost + + + + + + + + + + + + + + + + + AuthorRule + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + + <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 + c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 + c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 + c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 + c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> + + <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 + c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 + c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> + + <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + + <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 + C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 + c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 + s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 + c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> + + <linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> + <stop offset="0" style="stop-color:#49AD33"/> + <stop offset="1" style="stop-color:#C2DA92"/> + </linearGradient> + <path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 + c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> +</g> +</svg> + + + + diff --git a/docs/guide-ja/images/rbac-access-check-2.png b/docs/guide-ja/images/rbac-access-check-2.png new file mode 100644 index 0000000000000000000000000000000000000000..254f307a89e5e59fceda04f27667982b60c3fcab GIT binary patch literal 19364 zcmeFYbx@mK_%@h2P+Ce_N>i+O@!}3G?(SM3K#|~52vULI5*&h*;_hxO8eD@1iaWtw zHhtfp?EbMkJG&Z4FI^)hJAW) z9%6HRgWkLZ0OW0CB|d0;p594$5)#~${?oMM?%l6|uYh!S$|ImBhHQf@ zO9o?j=YwkI=^Wwx4j5U~d!US%{G0CN+f-go6Al_KT31ZffE-7P2Zdz|bl#hjhXmWm z|NFo9n^e(x8v|+G{h!qB8=4+!D{`Y+$HZ&)5+su!000hcvu1M1qR|Kyb#t_lxVZXp zvZ!{##mtyG@BZgH#S{)yLVr@RTl?I*V^zjELg>I4K)oX6v?*HgapZ}4?k)UUL6awT zaK|ko!E<8FESoXuKxw%QPXKee$kH>Uj&x3WvMKe+d{bGy0d7)1LpUn*FnffIJ=UT$ zPbs?xp|{z`0?1r|xuoTN&lch2?j9Q)5H`{lzxX}omh(eHh@xINoabx*fbg!dBI=9) ztTUqFcj!*!;6kN2?9rqYb~AWB9ceNhYXX;W%QfI|*$E_S>`tkisiV#=aZT^q3NjzP zo4Esv85MV!W*)EQ&g{+R5WHo@yvW&dgQ9nHMx`umC(>B!jl@0sJkI;S;E!6Ia4~Hu zLR@wO$=t(745k{^tEo>K^p#3#qT@&fO?N-f!&I38nZM@hl)`+LXJ@X_Q$Gw8>G|MI zt_WwYvl?fYbw;$H&y6uprq@8WnX`yilfgU*^fb+t+98=C$_f5u+z})l{{59r=;h!8`!i;8e45zaW|7p zN&pd|Hda&?T1_i-b_>_fsEfn*PNr^?PWD}Mn`4WvNECL9e$q|5s`N20Owm2)OU=Q*Xa61F-a@*s>pXd7su5uISU5W;#Ox>mDY+&yROMa(yqsRu!5A$xS zH6a)x#Lm+>RRBOnom5|QEq!Ury5;pJ+|mX2-y}(?1T*MEwf1zvlS5IZnDu#!-j$Y@ z-777``b5`VmOxkAYJ+zZlBBQg2&U%v89#|fzoqU*eYM%tzOYe5TY@X>>E?86KkV)u zANR+w88-(UEO)EZ`QBV*DD3d~K1!@#URj~lTRlBoJ@CbQ@wT-8N~CYLTCLciE)|&~ zc#7t6`vv$DC;dI-8Y57auQdL=z}oex9`W8~9)yfFMVMon{JJY=f3aaW_y&?H;ltbN z<0QW&|8?uGMVf&z{q26o&FLX)n``YTaz~cBhFr?Umxxhg-78Nm%alpGm>E@|9WUUz zDTA(eEy~v{h&#Kyl#gZ9%v4C^7+$R=?!RvBzotWYa!QAjp1zR;)H2-6k~+*A7v!(v z>CJy$$zv%ROuaNoz8*K@3qraHeJ0KseHXEYqg&eL5Fj5bA$qVT&CW`IESorhJaeuM^CvL zE=!1RR=$ltB*mTQeZzB6Q+KQPE!Fh|`4+mDt!09pXww!`c`F;QiuyS>rDv6yE*fB4576nct2z9JHQGVx%lN)s=Wc zb=fAg*$Th?!)HS)>p_G!npM^)zSF!RUv~x`^y}RRK38m#>qc2}v1*jNdj|)e zgF^EujVpl2FH1I86i*D)eWx~>uGyrnc`(%>L-{Qt@uh~srgtZJug=oUxzo&@Lz)+7lEE*A{kc~vEC-cV z0l$8CR~;J(l+~ZyF`PUwE_~hOzoB;7-On=qps3_DJN3`t%kIzXZ~MpW47oi8v!#U# zyv`3CMMOmO!=BCmK|cb7{Ni?f=x4k240ya%2qsS7iV0EIpKedlQEzA_JiKQM4-J5; zO#o@-?xS~A(=R=O{2voH$B6pg;0-uGyYq(nd40z4cY3XfDUXvq8BRt6howC zG#$f=GYgSE!M2Z5{?R@0Y!n+JMEPm2)tg-$`7g}v%X}|`3X^9) z^bK9qvt6tjl+(qiL!YIY$^*bEH+rf|{l8rA1cVj>Q>ajcY2oWiiK>4(j4k-2yjuoh zB3U5IBhBel^NNvykQB0vwt4JxC{6!rpF8#k_Z_Db!Ps?6r}0o6&7|KpuM_4)>sQy` zxmd>6KDW6GOE%EQ$X2U#zK6 zY8_036OF9L3lrBp{3n3sSTr8pG#s@xP5}X+m>*BV5CL{u4h9e6*I(p;@;2VGIcSpc zLqBKImIc}eAQQ>ZG^<0e;MCE}i>Y^jWexG%Dfy#6b54(HKD~w! zQEzP2pma@Kg`hNuQ0WD~Q1>#V-0O4&V5L!!tnpTV8ac>bw5i>g@Of>JzN26HdKJ(8 zJnwDQ(LrW7$x9|Zn%PjL!%_wS$J?)4h)}_%8f6I$AVsJ5&1D&|x-JED?ONuSJ(@x} zGu`Xobg$i~ohuiUgY58r%D-s^Vr*AO=*y0!el->4(xP&6;dR<(`LOl6yMwH$quJii z&wgh;Su7>~$m%6Rzk}RZw_r1^;@++qQ2OWq9`Zx-rD=LmoJZ^ zCciHgrLYpEdx>f;2Us~-Uw+z{NUzplT%*@y)Q&n>>6I-Ruga9?>>9H+cTTif*1@_B zb zFJyL+Uk6|I)EXUUy2VDRjU&gM1*&8gTHWmJF;qMv1ux#1IhktixWWTOf)zJk8J(pz zJGn_K2MHeqCC{Mrv1|_KoN16P$71x=P!--nPcydtcZ_+)Muhg2TmXffvFk`*CCX)(qz(208OL|RUsM3}pj zJd`SwWI2yzR5geTgRqGD42!>>V5VLP`-~>uIwN9xt&N;%kW1t+Kl{Y%} z6M>RTtEVM&kjjlzpgD!yV8+Vp_Ff)4&1U1si}^ORCkied)LjLHQwu zCr88$;rAny+_}gLK>cNmn}52Ttj(NpXHbS>HP!LG^I?wL9loMdWq&?M2L^(l)~cfw;cCA=(d0ni~>Hs{?59pmy}?Pn?)WhBWI;ddF%LUiZj}G&xXL3q2jP&)de;wpOyjM;|(IpdZ~b2jcv4g;C0TtvWy<`xVQaN(RHo9_&{6^=R$nCRsMaKt zesbg0XZBXhRY_;Ws-u>P{B@=l7F)*hs%Yd%F_j=RDLG-Aj2xr$E@R}fBeqGIOq4rB z6x!nu>@3~K&1B+tv6Jh^F>B_w=SC36qOLFd-P&g{WnTVB-v9iU-52~opG1u4yv9sg z4F0i8$TLok#>ysy)mv(^FezfT+U)#F(DkCNj41YqR|h^TL;6UI2hYvPi}4y>KDScB zY(NO6hrHIit62E%h^ClI`TH0d8MU}ssc`V@^{$@W=a@y$fGu*nM`A z!|>7I&mT3uZR>K(a?60FMfv%P>|DZ}{7w0*?!KXZ?C4RIBHOJ(OH`i~W-w<0uB~aY zVwJLx&f!04cdhS1g#x)~Y9#R|tYp{)FLjv|i=OXAN17}zz%NirGgwi*m*Tt;)A%$z z{FC8@?PPfzyEb^T4Y?;C9qVHu-Gj3oz%Y;)#7|x~`haURWy*Qik1W-}^`y`YMqRjs z+UJ>!BT?(_g zW*|WgYwRQuu;nBwR~wnKh70-i3%XU0Y=fl=xtu(F@f%&;2<1nzIcH~QLMGU;`;<8O zrWvC+hJcci;waijP=4T(ypT1Qd;K~(GXeJ{VdRhBRlbgh! z`DC!~rF_~eLUU1JR?NlZ${l!lo?$Y#=H_d%O|jSRl$%czi#gDier|haT{5bN?x;YA zBh=K)5-E`#XGC3d?4&kNsk8!v6Qzs6990PM%@%n#{AVn`$&k*uR{(PT>Rhwm_Jhr)t?=#j4`JrcF4Wt7Cs&f6>5IMZJwt0KMmmQq%I#cH@PXNK0^0=KB3;&N^Bg1 z7EV$%rLu+WBpU0Cs1DKXUV6?b+u0o-i;^JN!(u6=0_p@M6UaL>+nXgwBae4iJc{S`;XJ7S6t>RO zU~XTae=^It){`Rt&GYg;m94kA=U6CS2C=ULrIT8Eiiz1lOLxOl04|Qv%I!E-mGMZD zzb4<|LoGVvqUU5;3vKA!AaAF27D?2*nEDx-1?ptq+Dj>U*u31DPojE7?$K)T!ZJy9a^faloTs|+^GO4|%re3YSg`nH z22D+c4NCed73TTA{p20ZPHFSn((?FIXQr?3Ov=J_g*h(C{%&?)*}0i%9LgOma|kvs zfKW}@Y*inw(EUDU0S4~PR{jKzV>J2E`~}I@N#_UMu+t-aYYS+yI~f2-{L`%GXzRJn zW{OBzqi0{DZpTi1b0NbCcYktNUTnoir5n=mJGAaK+?i|Lpp(4j=htL}q1xS++|P?? zD<~h~viuYHa~qQFr`RxQ!H*}3u=^04JzPDb1>eR?5aQQ``x;(;+D1ThKSl5pva@<& zFSQRrx>|#9T6CS$;2bQo++Ffpd39bpYe^2Z7%tgalEjIZtXPs|S=!Du%&!{h#8A3` zej=_n#aDF~0Hk-(&3F`1Qi#4yBf5Dcmh+PMRa$drF z#|LztOBatD(?gYTdp0|P6_qfF*MzC$YqY;vD5B)W=b{gVjpItIl_#m|TWs6U_V(4E za1!Zk57G|-e!21q^I!%-(zGHgDz28Vl1H@6g7pbMN=!`ZW$%6x8F&bO9f#&huZ_I} zY$z<2V9BL{a|Q>^8J`~Xn-TpX^KZw&tvyBkx=4JQW_uDT>?uc!Yjs-b_taZ{pr3)3 zP#v$=zs_7Cdo$6CyUc>5czK{`oR22=u{moW8$F>^=5U%e5jxQs`7Q^!eit~mV1t40nWe^ai(J7B1xomBLeo}MqYxJ>Y`FACTFx$n3t)wSxlD(c}2oN@Tv zP{#u7k$;d;ZaId^$qkk^)t%2A-!hU?elfoN9lh;k^)w@1Blgf)o&@)0wH-xGc^S7; zXtLHAWm~!w%nVOvcFzDf%@K0#)j|rKz8H4?{RCt8Y;n+q0brmEo97A?#zGFQR*_Kmv1 z@{d^{XUQ%R$kPI|CEzr-4VD~u%ewIVF*0%goK$^}&bR*g%OXx<8~ygR0l2U`=;aGg zqVj+nl#=!5;o-@l_k81v>8pjbZ=2{8>5Cbi+6Msb_4#?;(GACQay+uMt*O#74}$i> zPYKA)VYdNwhUBWL3LvYmG%WI!XW?8c|d#|>Lb%FI_+iFrN*6_F2P{=ll~ zzrCJs*;(}CD5Hd=MXd*|EH9poocz&>kVlrf(^!~C)0Dd}fkG1&=)V?G#8zN^yf&hd z8Pp@gh6~w`lpr{bnuN~*r#Ip2KQ7#PhYty+7_o6L3w7uD9nq=Fy3;OCO$LGVKjF-2 z%V9U3Fym$atSYun$S0flq6@gTVX@bh=C@7H9Vegc4=M3*y*0)^Dtnj-oiV3#7S%a;_|2fe$M-O#6?H&3! zuJO7&Z(#DRiEOJaLNBjPg@Mm&cMr_E+;Xt|TxSNXU3tP7w!3mc>8wZgm zP}604tokaU2ABI?7~Vh3JRHM|hzG41W{!+eA?6Y{Nenka@(;%Q7Rx{BelZy8%rO2Q zt<&MF;}k)Xn`+7{YBo_5n_IFa`zKk=t)%RH**|D5-Z*W$X(12SXr%%{Xk|xjUMLu@{-oZ}Z%w6ww*cU0*-28%qJtR!PR^_Bl_V{$R(n-iP;FIJAK#GXCR+imcidRa z`xLwS&8;LL!xnUH-y{q_6pSj9d{2>|+<$jKx!>7_K) zN@Nks7v-yD1w9SxH(&j_%W?XVAn_W)yU~)B^#Y--3$PNyDUMQ)zNU_LG7PFnO2*r_}+KM45pEdJ_v!noXH>7nky z`CZ+^6&E+bq>RMXr|}6X-YX*mK28?B@2P*m%bm};IDyGFvU__Am}Rg-sb30S z+~{STtjypk%~;@xMo7R)>z`9vJ2Bic<+pTY)Q7SfExapU5w=d{-PcY(edz3~U%VHv z+#O+za7|RNHr(ClP>#{jknG&vq)8*cP+6te2C=mzTDa(pguZ~X<a{C_L2>fRXQmpoIPYNEopMQ z?*Yr58vV#_4O_*;X(t1BkZ|g9$0aG22u{X zD12oCLAZLrs~tgH1gceN?r{9myF#=&P`La@yCN&~Nf7O_7iNMsbLu;AWRa48imT#2 zcdh=nySs;k7W9A-HgV!h(P8@!E6Q`JdPfQ?Y&OW4Cbao)_okH!2{7MheWq^ioR~i2 zDFv#&+`(r1NW!GNYgyEv%&lJ^%P3w^`C_hAdInkOn;*-`jG~CL!Vvff5QxXnP>PY6 zg;h7~Srh%|l9ROU9sg&e5jei2D&V92xQLV>(qw7V)rsiZ4i*|aS^0v2i2dlH@WEbx zk&}qy1W-{t*t<|rrj}FTtU#=bm?lj^~z4CeDoo3 zWRo4&>N+8rY_GUoi36Cd^I+A?1gP~eiE74T}}*$sQLbWr1sIr(W*Q@s#4#WUlqh-WGL6;tJ??sIoN)+wWZX5 zdt<89CNsJ|wmzJ`0!#jM4xX$d^p_y+ZD(-|-V4#n){~!&htOCD!;LO2R}@MnXg$>) z1f}Tfvxc)WreimtKiL+`JXK|WHswy^&)*A}9+}==UNWCh?9KH7DIw!raF0iq$i=qnVy3pdOF>x# z_Y<16?Whq=2Q}~xOMP*0cb51Em-Xq?R40SfLo|qRhCD& z=-mG1HlK9Rlw~;eH|rU*l>2IRoK5T#)O5tfC{}^?0jcG82Wcsjit;voLEx0gyxZ-q z2G&%jXtF;>$h1d#IrW6DD!F^8{_J{DCE;eGLvG_jJa*;_6v{14))SOeg4`M?4PdB# zdmqX<95PEKSiG28_61JwGVlwod)Em~g#s+Ki7#z^18{P*V-of|Rupp96oi@BsT(Ca zU%ougj66=vGL;JOyfHcY!n=~`aYNCta`nmhwp_V_=+4L^_sV3$^aK6TklSLat0NWT z^F`zrlDLIsZ?ep;&dw-%BM<|3%QppGlv;R_s?lEaZ=jWwcRYbN^9e>OIALUdkc1zW z1phM+ebkf9Vwi;@=3Y78Xjb!5Ww5HK&UcwsIfj8JKW3%H=&4DREB4zD@{1T>I)xLTIC*Ja` z5&Q7<^tu&=N1ST5pCj(`Ai*p!el#~CnJhv5r_{OJ_EC?NkJK0EWMHx;N~W}&TiDa* z4-_jU9fP(L4Nd#abaOOn!F;R1_*FkIni;?Dq(-L+HflngedjMHqX1UPU#7Aunt0Ke zkG~EsI8J9o%8xF;^0KrAL1%gsgp0C%ALtznYy+cuHFi2s;J*CTaz`6?{`!WNt8&XP zwsYg+7R5F!WX;7abIx)g__<88vb@YvEQL&b7)tScJ_diQ=q>95kwbV5-AcqhIcA6A z9U?m>j&FMYHdVA?b&_bBDZn7ra5S*A4uLbHLsi*+>ME_CGMk@~(dWvjkRl>Hy7h#* zIe_`xAEBC(N}fJ1b{Ji|5vu^Yqr||bN*V{AX7psUW6>xU5T*6NLwTWEQew)Ux!^swdwIn9lg&o3^2 z*D$y3LuYzwg(2Xv;_(q5h;ZJSxp_Btjh~QcRjCkr-VY&>vM)lsS&@yx4GCw=Z)s62 z#WZBRW09!{8`%g&?yQ+?{b-Yv70H!j-8nS}(;KsuE)VGO+USRo`}HY4ua|4ylrB9c zK4wZ>e97$?ig*0Vq!DLEFter)$3d4k=(SnvWW)R+bBdn@QBfuh^#Xu4o(v&@`?U08KWr7zpF5NPzz_TNU8UC)L;3j+PJc zR%5Us%0uI*b`o=QFq?wcmxSyRRA7!2EAV&Dw;93*Ud|s?616Au0ah^%_Yf6e8TRLhto>&vX*S(QDVc?+?0I0O+>(Pv!@`Y_4 z6NO#gHO9R5XKu`Gd8v>ff7&t`qDHw0UPocso9*+I;G~ygauH537{SO`=9#>AXc2Da zZ#SATo~t7HNw&10ofWhC_S(=tH$#GqY_qKWK^RS;Gfz;eYX80tt;;G7-aUogulA7gv5Bp! zbl7EjKb^6UkCAp(U~H^8KY*3*4FS$q11PPuU{!IKayNr`G6O+IYfW9NECaabd5Dgi z8~5w+r6x!^MYCCpPyx)9)ufeSq&j@bZ#=iOLfsEd>t?Pjy@82)mXgtywNrHI=hDYG ztX@D9X)^l_fMtAXF+m|F;;xtRwfx+qUHF!o&oBE3+C?(T)nO}P_`ONP3;o?HTM9Xa z2l6$iH~h0qx0kktU$~@-a7DzMEaPzzl{xW+d;-kG9*) zOo@3MaokMI=gh2K-K!m|7 z_1O!WL<#dxWSlPX={7EtXw`AYHrDW^paC;j{W@Kq)d=6A&^Xt|*$6N`6F;R3-(D3~ zChjcffXG>iuo#R1Gu_K1bPDUIm~!%XzrBcgn8gIT@Li%7dE7`l=+~Hz9ap!zFrF9j zrv)-RV@qM*2tPVtR6bz=eeEKwY`;5`?0NbOCdMZ3-_ zZgWS`U*G8cl95SDT6~&ka|^5pKT-;LC2It2QQR>GQiDKpWy0 zTOX}eWV5oU*7fe?52rUg6Xd`DNt2#{u)1n@3Hwb)7dukYv#~VYBmAKh?0ESq@S9X1 zKaGW)KNJ0oewu(YHHS;8<+`J_zop^!W&IUuAN8u5f+4(4*C z{#?ScE4(OKfPeT8dEJk+`s6u^uV0q?i!^kDA>~_IMW+QwgWy3=izXH+JG9HV)3WP z)gIbHSg)(OqMP-TTm)rWovevR;QVw@UAZGVA>dTs4=2Wx=ib~9AwDqTp3TPn{ zhWo@~9 zHYTe~?6r>;R#wesM!MMem$AX}Av*MEVqFy#Bg7`r^<2AG7oGxhWIRi>AqCA8pzfmbMccLrAkG_$70JVe8j%W@CBAx67}IlnO0UbHd>!Ed1zm z$)ML8)Q+4YGN!b7>agcm60_#(Cq+cEJ$p-yz`1?Uc~SgCnyopOnh=Q{uqM&6kL&l+ zmdobZ8EYo(w4V%kT$0a>rDQnwK2KW?V&bj)RTD-}JkTLs{*{VHpHBT!aX+yN5Xq>w zV<&@nkx(NOAX06;=8H7HdG0ZfJuXc&zNp*t^l{rcB7h8oXG4&RjSx2XI}V1EXqU3> zt-9`Kcfgyv;Rl>u!r)hSjGXpQW-UMuKVz@#8UFJoZ<|s~yK156>kM<-wJdTkp)?-^ zh)O)hCL_aO_iL2>&e6-nOFWXB^@Us*Ab^IrUWJYh7i3Me$ntH5rfo`TW5bHbp3isC zVv}hN)9VqBZSK`l%-m_VS4ztoZ`J(yC2)?a_6b#==_b9SV2&oKhx4`3w1>Cb91EZp zy)JFM(F!swjNFi;2+r}(`>3w#QSe7JEKR|3lIHoR>wzG6t zxTo~(%ZW|PEqSNJ10xsqiWjRSC1u2A3}b}{nOgXy12^K9=%ByBY$%jfw6N^j)VK{^Z%_u-WX$>Lbi3%<~RI2aGXg} zKlyuX5WV(0HSI?oG@@DApT~SO1ivC_6T&#D5t_#vX>u?TI#1VOS)dkh0Fs1Ri9i7x zQn2f|(5BNE5S^`nzWmj+@8NZnC_U1EKdN{F zP;0_(;k!&k>D04r)3ostG;UtZ8N0?4v~0({hdC=N#1BJZy?vr|`lsp}8!Mi=5rcxg z$-dbg^LBgn&HFVIy~h{nB#$!PKo;z%&M{>>MWm*$K#4T0hSEJLHlmt9_6P%Sfa%V> z$4t2ED$B!)6`o8D-R7^os?Cl#K2!H0jsLUH6=HT0R!UA!)bq~Jg5Zs2uY>BOfyYLZ z?V@_qj~MGk`oZRl(6iI4U-fp5?OqW>9=wR9H}(>vka!!+Pd`jb7coAKgzmP`i>N0lYiDyoJ=5HSmrKcS%ht$a$D#5z{FSEYt$-c6n)Y@!EU1zw+) z+67&4eO}c}9NFFsPu>!VZoZY+Z9cWLc{F(Flb2PUgW1mN`gX*ln6Iu;|14dF8*@KH zlx(Ap0yCON>khK;V3fad^%Ojv+1xqe+2wF)@wOJ8TY7nrlk)iGje==DBPVs+OmqVR zo(|1+5iqJ)?J2g&++a*;8nRNKV3uSQu}EO8h@bQ1v;QCvolZ`m!BCYpH7&rJ0bMU1 z{!x4vmA#0)Q&jXF$i?iQhz`U@+owGQuZzW(Yjal3WiXU|S>;(7;11gmu~v|S?Sh=* zP3p9=O7uFsd{-|E*Xm>aKQdH)p))im0Ey+trSss=PmApPZl%`S*y|%g$a@_XAzC|n z4AebCDcjkd2t0Qsb8~6ft@o~rNl5W4)Kc(;d#n;saTIn}=VSmq)jDOWB8q@#&9KvaL-v z&A^|bPTD`@M3~%5mOZ=c2MmppB%6v@17+o4dIF016I1nHOd- zz4}KfWBCH;$G2B~LLy)3ysrq9IO|6HXk!KYm%~z<%ie%_D7qeENk^v`+wWOlI4FE#Zv8m^y15ZR&oEo`ugU-tFnmUb;3gU z^?SwwTEetW@O_Yv;)$A}w|RL0KHLPhl&GB=eu3S2lCTEsmr_>{p24!C^S{bYo%mwXj1uo3 z`){mzIH!>&F?r05+ztrAA@A%~tem3-WAA5X0`63|E32=!>ffuWyZ3;`G3oB#BHaTw zG~iqc`q-eFM|Nh9rqlfJBXIwDA>+e)UiWfHqRvn&sRqYR{j?iH*Yc`{L2bhPZ+$c* z6)7KvMj7WEZc_WlvHH*jEw&8a=Xdjh|9cmfwwAW=hG4fj|^;89BTdc zo%JYBxR9MKU%QEw7GQKSQpQF`S|QTXUlL262P+_-*@>@pub!W$q|V>2T?O)#KSDmk zc>vD+0~h{*xswh6BO3rm!f#$+wcI-N{adV_8#?`>g4K8bzQuVze^2ZV^4XW>M}Bv) zy3d;c=K)smU64P+!-~HDRq%gJ&i_Qu33h4x&4Jjo--Ht3#r|~d8^elln&`it8Kv$= zF!@wYNk6c!+P|B1G?GAtK@AF7uprrv?y@E6bL01Wwt;o;H+4K(JTosCK81Xc%F8zm zea5?q1NR%jdi;AQ+rl;5H8A;IIoIR7oi9p>Q7V7ETqZS)Rv|2VghBm=ZTPPpN6)kK z%z?#Q;J;7+BX4Q{MFTSOR{mc=z$tOF{=rrt{?~tT!*Tzgx(+!=CtK;9FXm^xzm4rfX@@Q=CzI6a>J3&{sJ;`fo0sd7jm#F&*O2yj%eR$ z*uNBZXjxjjkmd0>3G%%aVBM+aU`Tsf-u*K@JZTcWKWWxraM^tE`l>OK@-LR(wCNW% zD?&z^zADOj%z%GKGR3D&furvoKEJ&jx*JfdA+|-w=SNgMOxG(l1Mcc8NHgo@LU?hH zP#T?f2{sPV&HL_tCXL5G&bjnPuT+l)ErG_kTvr`j#l-t+-rWA2{=XW_uh3$*eZLgIB6#d#!o8FESM^ zj++iXW56}C#S>(MBvqV_pv~*e_=XdkgT_WVRm9n9wQSckkH_(YuD8!YcmGa1hk}!* zs{gWp#p$10(ysYpdT|!SPS1+FWx4FKR@b~|sPcoHmI6P#M(B!23tL5Z(8u*V zBdRIk*>+kmMwW?{ne3V6edh3ag!i8Wn5(Z6QM3|b^V+G=>zKVwQJr)mVq>}XCM|Y? zqNv`uxWrhxK|sI-W#~@lMGBUgzxU<^^4-m6MEJ-NU%JijV7&E(zNhSU5w8uYi!;IN z&0jhVVLLX4@PY!Dqr^$a=Js$;#HgOzZDibNSypDh?2l^%Xz zj4#+*OooB-}BUuTJXejk3Fblc8y_#THtI3qI@GOA z^@5gqh7(kK`Oj&AaygO(t+ z(I!~2C3e+6=o`XA%_Fy&ug>2%a_vY`E`6dFe5!adM~e*vlqYUasWC#~Y>lt8pewe4 zW18|W$z)HNE|BC?@(igQQ(KZ)8F|b-RgtA}a-?%-R6VaGdnZixbj=fvZ9i(?%$n;M zMHAihLjPH2x+QhyKo1TFSTMRNCYWM|-}U8R@hXXx?f>Z6OeFb#$mkbS;(ucTYRE_` zDE9wIYOUB8uH`jvPU`)$E)aBC4qG2s3q9Q7z zEF1Zdh~_J0BYSHkBZop$tkESIhr&+*1wA%<&vWz;1k-f;b!*OIaaVpEG5Z6h+AN~ty`J!pdL(tpA7Ur-YqJb(Pht$OE{44-oBpD9kJ%Ms{#)k)S^C4 zhZ`~|2Czo0mA6oz_o8kmN_e@!M4;?Bxsq#E!ybpeY|aszo39eL$Ub!v- z|DLgioKd;ytbS~Rf6Dru=Tw6~lg#hnu;u+VqwtnNKSR}ntF5}iyj&`jp57_Ld}WEN zVHm4f5wCL2og;Ra9y#7xWxSKJVqnjpu9dscjRIExy<%) z9AtLJ)7D!A!r_^?x;`L?Dd))WU1QN5O;SVowpFmLMQ-yy)*U>bte7fB1)%ya2n;DXc>yT|+;@ z(XXxiWxg-gVvv_X)(s}CqMiFw<_B&yCZ5UZv8D(Z=Bnr1YQch5WNNDH zdS?=8A#~H*KxmU9jJdQ}o!w^K;9yiLt8VymYv~jD@w|g}c0&d zoJUzR??NwjNsv{<*(4*H_0q**BScTp4S6WRrShFUlb1zU7@^v zT>m8Wmv3q}N*zztEQ^OMu{o*+=L+nc-%#)!gc8Way3>QhgOl`5b7i%@vtM}_i z#)H$5k2KtnKa45BAqNj0?b9Vqf&3w1A;`zq%;3-H|81-$QMY|Vz2B5{OHWNqiuBTQ z-^ITA_Q$d`PuJzu7dzLksow1{^T*yQ*{3fH#qVCc{QJfJ#V&Wx1?@lI!}7`7t4(ue zXiCNFrMKgk3&qyI7FnFfe_nRS5~F3xry<$qE5pWhR+o0>|J@zZ{EjnaMKJ3+)qT4b zmhwl5OT4(VBm2Co`IgsqyDr`dfB8~w@^87V|BOp2*7q;0_NrPCrGK4w_4doJ*NOAR zet7Wj&#&$G!k5dK+>w&Io?Dvl*&n>q-rT6ieyh@*$j82WKjv?q9x`pxsfqvUc5i-? zrB=1Z?fatG?^k_ZY!tt4GUHw4{vT=Yek9NQ^=nH^@b2weho1nG{+_SECR<+m^=}v7 zu3v2CFR3=w5V$O83gF9$YcyH36r_x~F6e)%o3d3VFa{WFp;?p>2D8}Mz; zy$ioze17%1VC}oh&z7#g{&m-v<*OHh{IF%2WAu!wKl{(bB}MKE>&q*jcIWdV@2g)c zLvH-Cx)c61v-nc|GHq$AsH?}nPq}{{QAvP_hsq*=!>^^guT0)6Z?9fm6hk4t%gQ> z{@(n2=F-=qDRUw(z0Q9g^mz&>Q1;$_?v^+G;;+~?>zDV6^Jh4lL9Z|56eB@Jwdb+x&C1B!y`c4wt(U?mN#$QLOB8wBmZ zQ8bT>6M&5eXHdf}!y~01SV;pbauXG3Rj4T?bW^z+G?a!gj!P2QmH}&3bcQKQIZ>tt zQ3h&GfNkZH+%)$j*w$8_o97_5LfQjBt00X4U_$}ikN~<7(s}?o440CnTX@pnbR{V- z*)(gLxtbbqmgCJtV6){u%ckkCvL>C3>pE%hsWp7@v~#!5w|S&)O}RL6zpql?(&u?V zzsGrfoN_WwAEjw|!iKI=L&Ud`gFJW%K@ z6}jp2ZJx=^V8vG)g+@2MH(vT)*KqRQYqjd~8NjBSQMJ^c4cCj$byfY?IJs&~18{_F z=l{k7JFJa+z22Yg0QxAz;n{QFZ*m4Vi{+Lt3R>~b^yco%Dd(pZZel0)j2 + + + + + + + + + + + + + + + + + + + + + + admin + + + + + + + + + + + + + + + + + author + + + + + + + + + + + + + + + + + John, ID=2 + + + + + + + + + + + + + + + + + + + + Jane, ID=1 + + + + + + + + + + + + + + + + + + + + updatePost + + + + + + + + + + + + + + + + + updateOwnPost + + + + + + + + + + + + + + + + + createPost + + + + + + + + + + + + + + + + + AuthorRule + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + + <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 + c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 + c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 + c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 + c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> + + <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 + c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 + c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> + + <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + + <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 + C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 + c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 + s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 + c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> + + <linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> + <stop offset="0" style="stop-color:#49AD33"/> + <stop offset="1" style="stop-color:#C2DA92"/> + </linearGradient> + <path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 + c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> +</g> +</svg> + + + + diff --git a/docs/guide-ja/images/rbac-access-check-3.png b/docs/guide-ja/images/rbac-access-check-3.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdc0d935a370f3165c9d96ad335dad6e3e1b364 GIT binary patch literal 19336 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 + + + + + + + + + + + + + + + + + + + + + + admin + + + + + + + + + + + + + + + + + author + + + + + + + + + + + + + + + + + John, ID=2 + + + + + + + + + + + + + + + + + + + + Jane, ID=1 + + + + + + + + + + + + + + + + + + + + updatePost + + + + + + + + + + + + + + + + + createPost + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + + <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 + c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 + c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 + c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 + c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> + + <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 + c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 + c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> + + <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + + <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 + C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 + c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 + s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 + c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> + + <linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> + <stop offset="0" style="stop-color:#49AD33"/> + <stop offset="1" style="stop-color:#C2DA92"/> + </linearGradient> + <path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 + c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> +</g> +</svg> + + + + diff --git a/docs/guide-ja/images/rbac-hierarchy-1.png b/docs/guide-ja/images/rbac-hierarchy-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7443fc7e71f555901f7f2d77aa7c27924c2be2e1 GIT binary patch literal 16085 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 + + + + + + + + + + + + + + + + + + + + + + admin + + + + + + + + + + + + + + + + + author + + + + + + + + + + + + + + + + + John, ID=2 + + + + + + + + + + + + + + + + + + + + Jane, ID=1 + + + + + + + + + + + + + + + + + + + + updatePost + + + + + + + + + + + + + + + + + updateOwnPost + + + + + + + + + + + + + + + + + createPost + + + + + + + + + + + + + + + + + AuthorRule + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + + <radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438 + c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051 + c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397 + c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359 + c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/> + + <radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617 + c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313 + c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/> + + <radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + + <radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="67px" viewBox="0 0 57 67" enable-background="new 0 0 57 67" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + + <radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.199-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.5" y1="-12286.8594" x2="6492.1294" y2="-12380.3086" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3350.4617)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/> + <path id="Hair_Female_1_Red_1_" fill="#FAE1AA" stroke="#E2B354" stroke-linecap="round" stroke-linejoin="round" d="M28.372,0.5 + C17.537,0.5,8.269,7.748,9.153,26.125c0.563,6.563,5.862,12.042,9.366,13.531c-2.929-10.968-0.304-25.021-0.585-25.526 + c-0.281-0.505,3.536,6.728,3.536,6.728l3.183-8.312c5.541,4.28,0.393,11.309,1.049,11.058c4.26-1.631,5.34-9.228,5.34-9.228 + s2.729,3.657,2.701,5.504c-0.054,3.562,2.194-6.067,2.194-6.067l1.027,2.031c6.727,9.822,3.684,16.208,1.648,22.781 + c15.666-0.703,12.291-10.48,9.66-18.407C43.59,6.092,39.206,0.5,28.372,0.5z"/> + + <linearGradient id="body_1_" gradientUnits="userSpaceOnUse" x1="95.9063" y1="-3134.2153" x2="31.5133" y2="-3134.2153" gradientTransform="matrix(0.9852 0 0 -0.9852 -34.4844 -3031.9851)"> + <stop offset="0" style="stop-color:#49AD33"/> + <stop offset="1" style="stop-color:#C2DA92"/> + </linearGradient> + <path id="body_8_" fill="url(#body_1_)" stroke="#008D33" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-8.244-5.146-8.244-5.146 + c-1.444,6.983-8.555,8.786-13.007,8.786s-11.322-2.643-11.941-9.439c0,0-4.559,1.199-9.367,5.674 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> +</g> +</svg> + + + + diff --git a/docs/guide-ja/images/rbac-hierarchy-2.png b/docs/guide-ja/images/rbac-hierarchy-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e77c5647c1d40c4e739962cd81a7b1f78a89a484 GIT binary patch literal 18786 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 E0KMRz#Q*>R literal 0 HcmV?d00001 diff --git a/docs/guide-ja/images/request-lifecycle.graphml b/docs/guide-ja/images/request-lifecycle.graphml new file mode 100644 index 0000000..aed5293 --- /dev/null +++ b/docs/guide-ja/images/request-lifecycle.graphml @@ -0,0 +1,834 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + user + + + + + + + + + + + + + + + + + + + + model + + + + + + + + + + + + + + + + + database + + + + + + + + + + + + + + + + + + + + + + + + + + + + view + + + + + + + + + + + + + + + + + + + + controller + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + create action + + + + + + + + + + + + + + + + + perform filters + + + + + + + + + + + + + + + + + + + + action + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + load model + + + + + + + + + + + + + + + + + render view + + + + + + + + + + + + + + + + + + + + + response component + + + + + + + + + + + + + + + + + request component + + + + + + + + + + + + + + + + + + + + application + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + resolve route + + + + + + + + + + + + + + + + + create controller + + + + + + + + + + + + + + + + + + + + + + entry script + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + load app config + + + + + + + + + + + + + + + + + run application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + 9 + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + 8 + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="57px" height="66px" viewBox="0 0 57 66" enable-background="new 0 0 57 66" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3799" y1="-2276.8809" x2="27.6209" y2="-2306.6792" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109 + V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77 + c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path id="body_13_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51 + c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146 + c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021 + C1.378,56.689,0.5,62.768,0.5,62.768z"/> + <path fill="#2068A3" stroke="#2068A3" d="M28.106,33.487c-8.112,0-12.688,4.312-12.688,10.437c0,7.422,12.688,10.438,12.688,10.438 + s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.487,28.106,33.487z M26.288,53.051c0,0-7.135-2.093-8.805-7.201 + c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387 + C40.445,49.917,26.288,53.051,26.288,53.051z"/> + + <radialGradient id="SVGID_2_" cx="14.2417" cy="9.1006" r="53.247" gradientTransform="matrix(1 0 0 -1 0.04 65.1543)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#74AEEE"/> + <stop offset="1" style="stop-color:#2068A3"/> + </radialGradient> + <path fill="url(#SVGID_2_)" stroke="#2068A3" stroke-miterlimit="10" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67 + c-2.854,5.51-14.022,7.807-14.022,7.807s-10.472-2.484-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25 + c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492 + C56.055,62.768,54.211,55.906,49.529,51.225z"/> + <path fill="#5491CF" stroke="#2068A3" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397c-0.514,1.027-1.669,4.084-1.669,5.148 + c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.335-2.36c-3.601-1.419-4.071-3.063-5.89-4.854 + C12.523,47.135,12.878,45,13.404,44.173z"/> + <path fill="#5491CF" stroke="#2068A3" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617c0.516,1.025,3.617,3.693,3.617,6.617 + c0,5.186-10.27,8.576-16.698,9.145c1.429,4.938,11.372,1.293,13.804-0.313c3.563-2.354,4.563-5.133,7.854-3.705 + C47.754,49.045,48.006,46.574,45.777,43.924z"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813 + c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/> + <path fill="none" stroke="#2068A3" stroke-linecap="round" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3 + c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/> + + <radialGradient id="face_x5F_white_1_" cx="27.623" cy="-2278.646" r="23.425" fx="23.0534" fy="-2281.1357" gradientTransform="matrix(1 0 0 -1 0.2803 -2252.9199)" gradientUnits="userSpaceOnUse"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357 + c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012 + C36.627,4.945,43.59,13.158,43.676,23.357z"/> + + <linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="5761.7578" y1="11330.6484" x2="5785.3872" y2="11424.0977" gradientTransform="matrix(0.275 0 0 0.2733 -1558.9874 -3088.4209)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M27.958,6.333c-6.035,0.047-10.747,4.493-12.787,10.386 + c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247 + c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.083,13.952,36.271,6.268,27.958,6.333z"/> + <path id="Hair_Young_Brown_1_" fill="#CC9869" stroke="#99724F" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25 + c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807 + s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678 + L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/> + <path fill="#4B4B4B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.105,2 + C22.464,2,20.2,4.246,18.13,5.533C29.753,2.865,41.152,10.375,44.46,20.5C44.459,16.875,44.459,2,28.105,2z"/> + <path fill="#9B9B9B" stroke="#4B4B4B" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M11.151,17.751 + C12.878,8.25,18.686,6.309,25.273,7.127C31.295,7.875,36.93,10.491,44.459,20.5C37.777,7.125,20.278-3.375,9.903,3.921 + C5.569,6.97,4.903,13.375,11.151,17.751z"/> +</g> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> +<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 + c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> +<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 + c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 + c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 + L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 + l1.46,1.834L31.04,45.982z"/> +</svg> + + + + From 62c095f837705ce59e62387187390c3a2799cd67 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 9 Nov 2014 04:06:14 +0900 Subject: [PATCH 132/144] docs/guide-ja/* synced to docs/guide/* [ci skip] --- docs/guide-ja/README.md | 2 +- docs/guide-ja/start-installation.md | 3 ++- docs/guide-ja/start-looking-ahead.md | 8 ++++---- docs/guide-ja/structure-applications.md | 2 ++ docs/guide-ja/structure-controllers.md | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index 4a1e9d7..7817d26 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -50,7 +50,7 @@ All Rights Reserved. * [概要](runtime-overview.md) * [ブートストラップ](runtime-bootstrapping.md) -* [ルーティング](runtime-routing.md) +* [ルーティングと URL 生成](runtime-routing.md) * [リクエスト](runtime-requests.md) * [レスポンス](runtime-responses.md) * [セッションとクッキー](runtime-sessions-cookies.md) diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 244b8a2..13484e7 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -157,7 +157,8 @@ DocumentRoot "path/to/basic/web" ### 推奨される Nginx の構成 [Nginx](http://wiki.nginx.org/) を使うためには、PHP を [FPM SAPI](http://jp1.php.net/install.fpm) としてインストールしていなければなりません。 -下記の設定を使い、`path/to/basic/web` の部分を `basic/web` の実際のパスに置き換え、`mysite.local` を実際のサーバのホスト名に置き換えてください。 +下記の設定を使うことができます (`path/to/basic/web` の部分を `basic/web` の実際のパスに置き換え、 +`mysite.local` を実際のサーバのホスト名に置き換えてください)。 ``` server { diff --git a/docs/guide-ja/start-looking-ahead.md b/docs/guide-ja/start-looking-ahead.md index a9ff388..79dde58 100644 --- a/docs/guide-ja/start-looking-ahead.md +++ b/docs/guide-ja/start-looking-ahead.md @@ -10,20 +10,20 @@ Gii をコード生成に使うと、ウェブ開発のプロセスの大部分 この節では、Yii フレームワークを使うときの生産性を更に高めるために利用できるリソースについてまとめます。 * ドキュメンテーション - - 公式ガイド: + - [公式ガイド](http://www.yiiframework.com/doc-2.0/guide-README.html): Definitive(最も確実な) という名前が示すように、このガイドは Yii がどのように動作すべきものかを正確に記述し、 Yii を使用するについての全般的な手引きを提供するものです。 これは唯一最重要な Yii のチュートリアルであり、Yii のコードを少しでも書く前に読むべきものです。 - - クラスリファレンス: + - [クラスリファレンス](http://www.yiiframework.com/doc-2.0/index.html): これは Yii によって提供される全てのクラスの使用法を記述しています。 主として、コードを書いている時に、特定のクラス、メソッド、プロパティについて理解したい場合に読まれるべきものです。 クラスリファレンスの使用は、フレームワーク全体の文脈的な理解が出来てからにするのが最善です。 - - Wiki の記事: + - [Wiki の記事]((http://www.yiiframework.com/wiki/?tag=yii2)): Wiki の記事は、Yii のユーザが自身の経験に基づいて書いたものです。 ほとんどの記事は、料理本のレシピのように書かれており、特定の問題を Yii を使って解決する方法を示しています。 これらの記事の品質は公式ガイドほどには良くないかもしれませんが、 より広範なトピックをカバーしていることと、たいていは即座に使えるソリューションを提供してくれることにおいて有用なものです。 - - 本 + - [書籍](http://www.yiiframework.com/doc/) * [エクステンション](http://www.yiiframework.com/extensions/): Yii は、ユーザによって作られた数千におよぶエクステンションのライブラリを誇りとしています。 エクステンションはあなたのアプリケーションに簡単に組み込むことが出来、そうすることでアプリケーションの開発作業をより一層速くて簡単なものにします。 diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index b962032..90e6177 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -579,6 +579,8 @@ Yii リリースに含まれているコアコマンドを有効にすべきか ## アプリケーションのライフサイクル +![アプリケーションのライフサイクル](images/application-lifecycle.png) + [エントリスクリプト](structure-entry-scripts.md) が実行されて、リクエストが処理されるとき、 アプリケーションは次のようなライフサイクルを経ます: diff --git a/docs/guide-ja/structure-controllers.md b/docs/guide-ja/structure-controllers.md index f19863b..1b97057 100644 --- a/docs/guide-ja/structure-controllers.md +++ b/docs/guide-ja/structure-controllers.md @@ -87,7 +87,7 @@ ModuleID/ControllerID/ActionID ``` ですから、ユーザが `http://hostname/index.php?r=site/index` という URL でリクエストをした場合は、`site` コントローラの中の `index` アクションが実行されます。 -どのようにしてルートがアクションとして解決されるかについて、更なる詳細は [ルーティング](runtime-routing.md) の節を参照してください。 +どのようにしてルートがアクションとして解決されるかについて、更なる詳細は [ルーティングと URL 生成](runtime-routing.md) の節を参照してください。 ## コントローラを作成する From f827e92a1ac09ce2a46be168ae1383d49aade048 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 9 Nov 2014 05:39:50 +0900 Subject: [PATCH 133/144] docs/guide-ja/images translated [ci skip] --- docs/guide-ja/images/application-lifecycle.graphml | 58 ++++++++------------ docs/guide-ja/images/application-lifecycle.png | Bin 32044 -> 38735 bytes docs/guide-ja/images/application-structure.graphml | 52 +++++++++--------- docs/guide-ja/images/application-structure.png | Bin 24774 -> 22499 bytes docs/guide-ja/images/request-lifecycle.graphml | 60 +++++++++++---------- docs/guide-ja/images/request-lifecycle.png | Bin 38617 -> 41736 bytes 6 files changed, 78 insertions(+), 92 deletions(-) diff --git a/docs/guide-ja/images/application-lifecycle.graphml b/docs/guide-ja/images/application-lifecycle.graphml index 850863a..9d48261 100644 --- a/docs/guide-ja/images/application-lifecycle.graphml +++ b/docs/guide-ja/images/application-lifecycle.graphml @@ -1,19 +1,19 @@ - + - + - + @@ -23,7 +23,7 @@ - Entry script (index.php or yii) + エントリスクリプト (index.php またはr yii) @@ -49,7 +49,7 @@ - Load application config + アプリケーションのコンフィギュレーションをロード @@ -62,7 +62,6 @@ - @@ -70,7 +69,7 @@ - Create application instance + アプリケーションのインスタンスを作成 @@ -96,7 +95,7 @@ - preInit() + preInit() @@ -113,7 +112,7 @@ - Register error handler + エラーハンドラを登録 @@ -130,7 +129,7 @@ - Configure application properties + アプリケーションのプロパティを構成 @@ -147,7 +146,7 @@ - init() + init() @@ -164,7 +163,7 @@ - bootstrap() + bootstrap() @@ -179,7 +178,6 @@ - @@ -187,7 +185,7 @@ - Run application + アプリケーションを走らせる @@ -226,7 +224,6 @@ - @@ -234,7 +231,7 @@ - Handle request + リクエストを処理 @@ -260,7 +257,7 @@ - Resolve request into route and parameters + リクエストをルートとパラメータに解決 @@ -277,7 +274,7 @@ - Create module, controller and action + モジュール、コントローラ、アクションを作成 @@ -294,7 +291,7 @@ - Run action + アクションを走らせる @@ -330,7 +327,7 @@ - Send response to end user + エンドユーザにレスポンスを送信 @@ -349,7 +346,7 @@ - Complete request processing + リクエストの処理を完了 @@ -373,13 +370,13 @@ - - Configuration array + コンフィギュレーション +配列 @@ -392,7 +389,6 @@ - @@ -403,7 +399,6 @@ - @@ -414,7 +409,6 @@ - @@ -425,7 +419,6 @@ - @@ -436,7 +429,6 @@ - @@ -447,7 +439,6 @@ - @@ -458,7 +449,6 @@ - @@ -469,7 +459,6 @@ - @@ -480,7 +469,6 @@ - @@ -491,7 +479,6 @@ - @@ -502,13 +489,12 @@ - - Exit status + 終了ステータス @@ -521,7 +507,7 @@ - + diff --git a/docs/guide-ja/images/application-lifecycle.png b/docs/guide-ja/images/application-lifecycle.png index 6a505ccefb89072e4bee7691114dd6cbe2e34bc2..ca6b7127ab959e736ea5ba24e2902e677f86c610 100644 GIT binary patch literal 38735 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 CN_f8j literal 32044 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 M#?fO9(&T8+BG-Yon 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 diff --git a/docs/guide-ja/images/application-structure.graphml b/docs/guide-ja/images/application-structure.graphml index f6fce48..94454cc 100644 --- a/docs/guide-ja/images/application-structure.graphml +++ b/docs/guide-ja/images/application-structure.graphml @@ -1,6 +1,6 @@ - + @@ -20,8 +20,8 @@ - application -component + アプリケーション +コンポーネント @@ -38,7 +38,7 @@ component - entry script + エントリスクリプト @@ -55,7 +55,7 @@ component - application + アプリケーション @@ -72,7 +72,7 @@ component - controller + コントローラ @@ -89,7 +89,7 @@ component - filter + フィルタ @@ -106,7 +106,7 @@ component - module + モジュール @@ -123,7 +123,7 @@ component - view + ビュー @@ -140,7 +140,7 @@ component - model + モデル @@ -157,7 +157,7 @@ component - widget + ウィジェット @@ -174,7 +174,7 @@ component - asset bundle + アセットバンドル @@ -191,7 +191,7 @@ component - 1:1 + 1:1 @@ -209,7 +209,7 @@ component - 0..* + 0..* @@ -227,7 +227,7 @@ component - 0..* + 0..* @@ -245,7 +245,7 @@ component - 1..* + 1..* @@ -263,7 +263,7 @@ component - 0..* + 0..* @@ -283,7 +283,7 @@ component - 0..* + 0..* @@ -301,7 +301,7 @@ component - 0..* + 0..* @@ -319,7 +319,7 @@ component - 0..* + 0..* @@ -337,7 +337,7 @@ component - 0..* + 0..* @@ -355,7 +355,7 @@ component - 0..* + 0..* @@ -373,7 +373,7 @@ component - 0..* + 0..* @@ -386,13 +386,12 @@ component - - 0..* + 0..* @@ -405,13 +404,12 @@ component - - 0..* + 0..* diff --git a/docs/guide-ja/images/application-structure.png b/docs/guide-ja/images/application-structure.png index d3a55498889d296ca707527f5c9ab5fae217c1c5..47fb411d017d5387296b440cb39d49d73af8c45f 100644 GIT binary patch literal 22499 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 literal 24774 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

WTZ1E~fy3MKk*Z_$vB~k~vQcv2R?7fOep@ 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 z - + @@ -28,11 +28,11 @@ - user + ユーザ - + @@ -48,7 +48,7 @@ - model + モデル @@ -65,7 +65,7 @@ - database + データベース @@ -93,7 +93,7 @@ - view + ビュー @@ -113,7 +113,7 @@ - controller + コントローラ @@ -139,7 +139,7 @@ - create action + アクションを作成 @@ -156,7 +156,7 @@ - perform filters + フィルタを実行 @@ -176,7 +176,7 @@ - action + アクション @@ -202,7 +202,7 @@ - load model + モデルをロード @@ -219,7 +219,7 @@ - render view + ビューをレンダリング @@ -240,7 +240,8 @@ - response component + レスポンス +コンポーネント @@ -257,7 +258,8 @@ - request component + リクエスト +コンポーネント @@ -277,7 +279,7 @@ - application + アプリケーション @@ -303,7 +305,7 @@ - resolve route + ルートを解決 @@ -320,7 +322,7 @@ - create controller + コントローラを作成 @@ -339,14 +341,14 @@ - + - entry script + エントリスクリプト - + @@ -365,10 +367,10 @@ - + - load app config + アプリのコンフィグをロード @@ -382,10 +384,10 @@ - + - run application + アプリケーションを走らせる @@ -466,14 +468,14 @@ - + - 1 + 1 - + @@ -538,10 +540,10 @@ - + - 2 + 2 diff --git a/docs/guide-ja/images/request-lifecycle.png b/docs/guide-ja/images/request-lifecycle.png index f9ed032cec2432925eea80ece48ad35194c3074e..2542024d8c2804283edeb0ac1fd715eeb6290731 100644 GIT binary patch literal 41736 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%0AWg{Sg+X{D&4va`dF1Xrb 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�?E9#H1_bo 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 X?E)*)L#|uB2U+3i>gTe~DWM4fWOCxu From dab2b03f0939a0c531ed1019d6a0a5c1cfec8806 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 9 Nov 2014 03:02:18 +0300 Subject: [PATCH 134/144] Fixes #5863: Selecting all individual `yii\grid\CheckboxColumn` checkboxes in grid view wasn't resulting in "all" checkbox selected --- framework/CHANGELOG.md | 1 + framework/assets/yii.gridView.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 080af13..8638ee3 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -20,6 +20,7 @@ Yii Framework 2 Change Log - Bug #5768: When setting `data-confirm` attribute to a submit button, clicking on the button would not trigger form submission (qiangxue) - Bug #5780: `QueryBuilder::batchInsert()` may cause "undefined index" error (qiangxue) - Bug #5833: The `message` command fails with a FK constraint error when trying to update messages (qiangxue) +- Bug #5863: Selecting all individual `yii\grid\CheckboxColumn` checkboxes in grid view wasn't resulting in "all" checkbox selected (samdark) - Bug #5893: `yii\helpers\ArrayHelper::toArray()` now applies `$properties` parameter for converting descending objects in recursive calls (otsec) - Bug #5925: `ArrayHelper::htmlEncode()` does not work properly when the value being encoded is a nested array (tebazil) - Bug: Gii console command help information does not contain global options (qiangxue) diff --git a/framework/assets/yii.gridView.js b/framework/assets/yii.gridView.js index 2bdd596..6f7e6e8 100644 --- a/framework/assets/yii.gridView.js +++ b/framework/assets/yii.gridView.js @@ -122,8 +122,9 @@ if (!options.multiple) { return; } - var inputs = "#" + id + " input[name='" + options.checkAll + "']"; - $(document).off('click.yiiGridView', inputs).on('click.yiiGridView', inputs, function () { + var checkAll = "#" + id + " input[name='" + options.checkAll + "']"; + var inputs = "#" + id + " input[name='" + options.name + "']"; + $(document).off('click.yiiGridView', checkAll).on('click.yiiGridView', checkAll, function () { $grid.find("input[name='" + options.name + "']:enabled").prop('checked', this.checked); }); $(document).off('click.yiiGridView', inputs + ":enabled").on('click.yiiGridView', inputs + ":enabled", function () { From 5a025cf9ce83243d671bec4e8ac9bde5bf91a02e Mon Sep 17 00:00:00 2001 From: keltstr Date: Thu, 6 Nov 2014 01:39:35 +0300 Subject: [PATCH 135/144] Create tutorial-advanced-app.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перевод (Актуальная английская версия от 2014/11/05). Изображение переводить не нужно, но нужно его скопировать в images/advanced-app-configs.png --- docs/guide-ru/tutorial-advanced-app.md | 293 +++++++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 docs/guide-ru/tutorial-advanced-app.md diff --git a/docs/guide-ru/tutorial-advanced-app.md b/docs/guide-ru/tutorial-advanced-app.md new file mode 100644 index 0000000..c69609f --- /dev/null +++ b/docs/guide-ru/tutorial-advanced-app.md @@ -0,0 +1,293 @@ + +Шаблон сложного(Advanced) приложения +============================= + + +> Обратите внимание: Данная глава находится в разработке. + + +Этот шаблон предназначен для крупных проектов разрабатываемых в командах где приложение администратора(backend) отделено от приложения пользователя(frontend), прилжения располагаются на нескольких разных серверах. Этот шаблон приложения имеет немного больше возможностей и содержит необходимую для этого БД, позволяет регистрироваться и восстанавливать пароль без дополнительных настроект. + + +Установка +------------ + + +###Установка при помощи Composer'a + + +Если у Вас нет [Composer'a[Кампоузер]](http://getcomposer.org/), следуйте инструкциям в разделе [Установка Yii](start-installation.md#installing-via-composer) для его установки. + + +Если Composer установлен, Вы можете установить приложение использую следующие команды: + + composer global require "fxp/composer-asset-plugin:1.0.0-beta3" + composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application + + +Первая команда установит плагин [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/), который позволит управлять Composer'у зависимостями из других пакетных менеджеров (bower и npm). Нужно всего один раз выполнить эту команду и эти возможности будут доступны всегда. +Вторая команда установит `сложное приложение` в директорию `yii-application`. Вы можете выбрать другое имя директория если пожелаете. + + + +Начало работы +--------------- + + +После установки приложения, Вам нужно выполнить следующие действия, чтобы инициализировать установленное приложение. Вам нужно сделать это только один раз для всех последующих приложений. + + +1. Выполните команду `init` и выберите окружение `dev`. + + ``` + php /path/to/yii-application/init + ``` + + можно также вручную запустить пакетный файл (/path/to/yii-application/init.bat <для Windows> или /path/to/yii-application/init <для Linux> + в командном окне указать `0` и тем самым выбрать окружение 'dev' и подтвердить запись изменений `yes`. + + + Также можно выполнить эту команду "втихую" без интерактивного режима. + + ``` + php /path/to/yii-application/init --env=Production overwrite=All + ``` + + +2. Создайте новую базу данных и внесите соответствующие изменения в файл `common/config/main-local.php` в разделе конфигурации `components.db`. + +3. Примените миграции при помощи консольной команды `yii migrate` (в консоле(ОС) выполняем `/path/to/yii-application/yii migrate` и на вопрос `Apply the above migration? (yes|no) [no]:` пишем `yes`) + +4. Настройте на вебсервере URL и корневые директории для двух сайтов: + + + +- для приложения frontend директория `/path/to/yii-application/frontend/web/` и используйте URL например такой `http://yourdomain/frontend/` +- для приложения backend директория `/path/to/yii-application/frontend/web/` и используйте URL например такой `http://yourdomain/backend/` +(примечание: я просто поместил директорию `yii-application` в веб директорию моего вебсервера и сайт стал доступен по URL http://127.0.0.1/yii-application/frontend/web/ ) + + +Структура директорий +------------------- + + +Корневая директория содерит следующие поддиректории: + + + + + + +- `backend` - веб-приложение backend(административное). +- `common` - общие файлы для всех приложений. +- `console` - приложение для консоли. +- `environments` - настройки окружения. +- `frontend` - веб-приложение frontend(пользовательское). + + +Корневая директория содержит следующий список файлов. + + + + + + + + + + + + +- `.gitignore` содержит список директорий игнорируемых системой контроля версий git. Если Вам необходимо, чтобы git не добавлял в репозиторий какие-то файлы или папки, то добавьте инструкцию в этот файл. +- `composer.json` - Конфигурация Composer'a - подробно описана ниже в главе `Настройка Composer'a`. +- `init` - скрипт инициализации (подробно в главе `Настройка Composer'a` ниже) для Linux. +- `init.bat` - скрипт инициализации - такой же командный файл для Windows. +- `LICENSE.md` - информация о лицензии. Разместите лицензию вашего проекта в нем. Особенно когда код доступен всем ( opensourcing). +- `README.md` - основная информация об установки шаблона. Можете разместить в нем информацию о вашем проекте и его настройке. +- `requirements.php` - проверка соответствия требованиям Yii. +- `yii` - консольное приложение начальной загрузки (bootstrap) для Linux. +- `yii.bat` - такое же приложение для Windows. + + +Предустановленные псевдонимы путей +----------------------- + + + + + + + + + + + + + +- `@yii` - директория фрэймворка. +- `@app` - корневая директория исполняемого приложения. +- `@common` - директория common. +- `@frontend` - директория веб-приложения frontend. +- `@backend` - директория веб-приложения backend. +- `@console` - директория console. +- `@runtime` - директория runtime исполняемого приложения. +- `@vendor` - директория vendor, содержащая пакеты загруженые Composer'ом. +- `@bower` - директория vendor, содержащая пакеты [bower packages](http://bower.io/). +- `@npm` - директория vendor, содержащая пакеты [npm packages](https://www.npmjs.org/). +- `@web` - основной URL исполняемого веб-приложения. +- `@webroot` - корневая веб-директория исполняемого веб-приложения. + + + +Псевдонимы характерные для структуры директорий сложного(advanced) приложения (`@common`, `@frontend`, `@backend` и `@console`) заданы в `common/config/bootstrap.php`. + + +Приложения +------------ + + + + +В сложном(advanced) шаблоне размещается три приложения: frontend, backend and console. Frontend это та часть приложения которое обеспечивает взаимодействие системы с конечным пользователем проекта. Backend это административная панель, аналитика и прочий подобный функционал. Console обычно используется для выполнения заданий по рассписанию(cron) и низкоуровневого управления сервером. + + +Также есть директория `common`, которая содержит файлы используемые более чем одним приложением. Например, модель `User`. Веб-приложения Frontend и backend оба содержать директория `web`. Это корневая папка сайтов которую вы должны настроить в вебсервере. + +У каждого приложения есть собственное пространство имен (namespace) и псевдоним соответствующий его названию. Это же справедливо и для общей директории `common`. + + +Конфигурация и окружение +------------------------------ + + +Существует множество проблем при обычном подходе к настройке конфигурации: + + + + + +Каждый участник команды разработки имеет свою собственную конфигурацию. Изменение конфигурации в общем репозитории повлияет на настройки других участников команды. +Пароль от эксплуатационной БД и API ключи не должны оказаться в хранилище. +Существует много серверных режимов(environments): development(разработка), testing(тестирование), production(эксплуатация). Каждый режим должен иметь свою собственную конфигурацию. +Настройка всех параметров конфигурации для каждого случая использования очень однотипна и отнимает много времени для ее поддержки. + + + +Для решения этих проблем Yii вводит простую концепцию окружений. Каждое окружение(режим) представлено набором файлов в директории `environments`. Команда `init` используется для переключения между ними(режимами). Она просто копирует все файлы из директории `environments` в корневую директорию, где находятся все приложения. + + +Обычно окружение содержит файлы первоначальной загрузки приложения такие как `index.php` и файлы конфигурации, имена которых дополнены с суфиксами `-local.php`. Они добавлены в файл `.gitignore` и никогда не попадут в хранилище кода. + + +Чтобы избежать дублирования конфигураций они перекрывают друг друга. Например, приложение frontend считывает конфигурацию из файлов в следующем порядке: + +- `common/config/main.php` +- `common/config/main-local.php` +- `frontend/config/main.php` +- `frontend/config/main-local.php` + + +Парамтры считываются в следующем порядке: + +- `common/config/params.php` +- `common/config/params-local.php` +- `frontend/config/params.php` +- `frontend/config/params-local.php` + + +Значения из последующего конфигурационного файла перекрывают аналогичные значения из предыдущих конфигурационных файлов. + + +Полная схема: + +![Конфигурации сложного(advanced) приложения](images/advanced-app-configs.png) + + +Настройка Composer'a +-------------------- + + +После того как шаблон приложения установлен, будет хорошей идеей настроить дефолтный `composer.json` который находится в корневой директории проекта: + +```json +{ + "name": "yiisoft/yii2-app-advanced", + "description": "Yii 2 Advanced Application Template", + "keywords": ["yii", "framework", "advanced", "application template"], + "homepage": "http://www.yiiframework.com/", + "type": "project", + "license": "BSD-3-Clause", + "support": { + "issues": "https://github.com/yiisoft/yii2/issues?state=open", + "forum": "http://www.yiiframework.com/forum/", + "wiki": "http://www.yiiframework.com/wiki/", + "irc": "irc://irc.freenode.net/yii", + "source": "https://github.com/yiisoft/yii2" + }, + "minimum-stability": "dev", + "require": { + "php": ">=5.4.0", + "yiisoft/yii2": "*", + "yiisoft/yii2-swiftmailer": "*", + "yiisoft/yii2-bootstrap": "*", + "yiisoft/yii2-debug": "*", + "yiisoft/yii2-gii": "*" + }, + "scripts": { + "post-create-project-cmd": [ + "yii\\composer\\Installer::setPermission" + ] + }, + "extra": { + "writable": [ + "backend/runtime", + "backend/web/assets", + + "console/runtime", + "console/migrations", + + "frontend/runtime", + "frontend/web/assets" + ] + } +} +``` + + +Во-первых мы обновляем основную информацию. Меняем значения параметро `name`, `description`, `keywords`, `homepage` и `support` на соответствующие вашему проекту. + + + +А сейчас интересная часть. Вы можете добавить больше пакетов необходимых для вашего приложения в раздел `require`. +Все эти пакеты загрузятся с [packagist.org](https://packagist.org/), так что не стесняйтесь полазить по этому сайту в поисках полезного кода. + + +После того как ваш `composer.json` настроен, Вы можете выполнить в консоле команду `composer update --prefer-dist`, подождать пока требуемые пакеты загрузятся и установятся, и просто начать их использовать. Автозагрузка классов из этих пакетов будет осуществляться автоматически. + + +Создание ссылок из backend'а в frontend +--------------------------------------- + + +Часто приходиться создавать ссылки из приложения backend в приложение frontend. Так как frontend приложение может содержать свои собственные правила для URL менеджера, то вам придется продублировать их в конфигурации backend приложения в отдельной секции с отличающимся от основного блока правил(urlManager) названием (например: 'urlManagerFrontend'): + +```php +return [ + 'components' => [ + 'urlManager' => [ + // это ваши обычные правила URL менеджера в конфигурации backend приложения + ], + 'urlManagerFrontend' => [ + // а это ваши правила URL менеджера взятые из конфигурации frontend приложения + ], + + ], +]; +``` + + +После того, как это будет сделано, вы сможете получить URL, указывающий на Frontend приложение следующим способом: +```php +echo Yii::$app->urlManagerFrontend->createUrl(...); +``` From 13b0296059ef2a5ece5ec868096aca9a09726693 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 9 Nov 2014 03:29:10 +0300 Subject: [PATCH 136/144] Fixed advanced app tutorial references to future sections --- docs/guide/tutorial-advanced-app.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/tutorial-advanced-app.md b/docs/guide/tutorial-advanced-app.md index 67e06e3..b2b1f60 100644 --- a/docs/guide/tutorial-advanced-app.md +++ b/docs/guide/tutorial-advanced-app.md @@ -65,8 +65,8 @@ Root directory contains a set of files. - `.gitignore` contains a list of directories ignored by git version system. If you need something never get to your source code repository, add it there. -- `composer.json` - Composer config described in detail below. -- `init` - initialization script described in "Composer config described in detail below". +- `composer.json` - Composer config described in "Configuring Composer" below. +- `init` - initialization script described in "Configuration and environments" below. - `init.bat` - same for Windows. - `LICENSE.md` - license info. Put your project license there. Especially when opensourcing. - `README.md` - basic info about installing template. Consider replacing it with information about your project and its From d4bb20996d04894285573c7e960bed476ee80ef2 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 9 Nov 2014 13:10:09 +0300 Subject: [PATCH 137/144] Fixes #5935: Russian translation for tutorial-advanced-app Thanks to @keltstr for a draft version --- docs/guide-ru/tutorial-advanced-app.md | 259 +++++++++++++-------------------- 1 file changed, 103 insertions(+), 156 deletions(-) diff --git a/docs/guide-ru/tutorial-advanced-app.md b/docs/guide-ru/tutorial-advanced-app.md index c69609f..e5f22b2 100644 --- a/docs/guide-ru/tutorial-advanced-app.md +++ b/docs/guide-ru/tutorial-advanced-app.md @@ -1,192 +1,145 @@ - -Шаблон сложного(Advanced) приложения -============================= +Шаблон приложения advanced +========================== - -> Обратите внимание: Данная глава находится в разработке. +> Примечание: Данная глава находится в разработке. - -Этот шаблон предназначен для крупных проектов разрабатываемых в командах где приложение администратора(backend) отделено от приложения пользователя(frontend), прилжения располагаются на нескольких разных серверах. Этот шаблон приложения имеет немного больше возможностей и содержит необходимую для этого БД, позволяет регистрироваться и восстанавливать пароль без дополнительных настроект. +This application template also goes a bit further regarding features and provides essential database, signup and password restore out of the box.--> +Этот шаблон предназначен для крупных проектов разрабатываемых в командах где администраторская часть (backend) отделена +от приложения пользователя (frontend), прилжения располагаются на нескольких серверах и т.д. Этот шаблон приложения включает +значительное количество возможностей, таких как начальная схема базы данных, регистрация пользователя и воостановление его +пароля. - Установка ------------- +--------- - -###Установка при помощи Composer'a - -Если у Вас нет [Composer'a[Кампоузер]](http://getcomposer.org/), следуйте инструкциям в разделе [Установка Yii](start-installation.md#installing-via-composer) для его установки. +### Установка при помощи Composer - -Если Composer установлен, Вы можете установить приложение использую следующие команды: +Если у вас ещё не установлен [Composer](http://getcomposer.org/), следуйте инструкциям в разделе +[установка Yii](start-installation.md#installing-via-composer). + +Если Composer установлен, вы можете установить приложение используя следующие команды: composer global require "fxp/composer-asset-plugin:1.0.0-beta3" composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application - -Первая команда установит плагин [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/), который позволит управлять Composer'у зависимостями из других пакетных менеджеров (bower и npm). Нужно всего один раз выполнить эту команду и эти возможности будут доступны всегда. -Вторая команда установит `сложное приложение` в директорию `yii-application`. Вы можете выбрать другое имя директория если пожелаете. +Первая команда установит плагин [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/), +который позволит работать с пакетами bower и npm через Composer. Эту команду необходимо выполнить едножды. Вторая команда +установит приожение advanced в директорию `yii-application`. Вы можете выбрать другое имя директория если пожелаете. - Начало работы ---------------- +------------- - -После установки приложения, Вам нужно выполнить следующие действия, чтобы инициализировать установленное приложение. Вам нужно сделать это только один раз для всех последующих приложений. +После установки приложения, вам необходимо один раз выполнить приведённые ниже действия для того, чтобы инициализировать +установленное приложение. - 1. Выполните команду `init` и выберите окружение `dev`. ``` php /path/to/yii-application/init ``` - - можно также вручную запустить пакетный файл (/path/to/yii-application/init.bat <для Windows> или /path/to/yii-application/init <для Linux> - в командном окне указать `0` и тем самым выбрать окружение 'dev' и подтвердить запись изменений `yes`. - - - Также можно выполнить эту команду "втихую" без интерактивного режима. + + Для производственных сервером удобно выполнять данную команду в неинтерактивном режиме. ``` php /path/to/yii-application/init --env=Production overwrite=All ``` - -2. Создайте новую базу данных и внесите соответствующие изменения в файл `common/config/main-local.php` в разделе конфигурации `components.db`. - -3. Примените миграции при помощи консольной команды `yii migrate` (в консоле(ОС) выполняем `/path/to/yii-application/yii migrate` и на вопрос `Apply the above migration? (yes|no) [no]:` пишем `yes`) - -4. Настройте на вебсервере URL и корневые директории для двух сайтов: +2. Создайте новую базу данных и внесите соответствующие изменения в секцию `components.db` файла `common/config/main-local.php`. +3. Примените миграции при помощи консольной команды `yii migrate`. +4. Настройте на вебсервере URL и корневые директории: - - -- для приложения frontend директория `/path/to/yii-application/frontend/web/` и используйте URL например такой `http://yourdomain/frontend/` -- для приложения backend директория `/path/to/yii-application/frontend/web/` и используйте URL например такой `http://yourdomain/backend/` -(примечание: я просто поместил директорию `yii-application` в веб директорию моего вебсервера и сайт стал доступен по URL http://127.0.0.1/yii-application/frontend/web/ ) +- для приложения frontend директория `/path/to/yii-application/frontend/web/` и URL `http://yourdomain/frontend/` +- для приложения backend директория `/path/to/yii-application/frontend/web/` и URL `http://yourdomain/backend/` - Структура директорий ------------------- - -Корневая директория содерит следующие поддиректории: +Корневая директория содержит следующие поддиректории: - - - - - -- `backend` - веб-приложение backend(административное). +- `backend` - веб приложение администраторской части. - `common` - общие файлы для всех приложений. - `console` - приложение для консоли. -- `environments` - настройки окружения. -- `frontend` - веб-приложение frontend(пользовательское). - - -Корневая директория содержит следующий список файлов. - - - - - - - - - - - - -- `.gitignore` содержит список директорий игнорируемых системой контроля версий git. Если Вам необходимо, чтобы git не добавлял в репозиторий какие-то файлы или папки, то добавьте инструкцию в этот файл. -- `composer.json` - Конфигурация Composer'a - подробно описана ниже в главе `Настройка Composer'a`. -- `init` - скрипт инициализации (подробно в главе `Настройка Composer'a` ниже) для Linux. -- `init.bat` - скрипт инициализации - такой же командный файл для Windows. -- `LICENSE.md` - информация о лицензии. Разместите лицензию вашего проекта в нем. Особенно когда код доступен всем ( opensourcing). -- `README.md` - основная информация об установки шаблона. Можете разместить в нем информацию о вашем проекте и его настройке. +- `environments` - настройки для различных окружений. +- `frontend` - веб приложение пользователя. + +Корневая директория содержит следующие файлы: + +- `.gitignore` содержит список директорий игнорируемых системой контроля версий git. Если вам необходимо предотвратить + их попадание в репозиторий, перечислите их в данном файле. +- `composer.json` - Конфигурация Composer, подробно описанная в разделе «Настройка Composer» ниже. +- `init` - скрипт инициализации. Подробно описан ниже в разделе «Конфигурации и окружения». +- `init.bat` - он же для Windows. +- `LICENSE.md` - информация о лицензии. Разместите в нём лицензию вашего проекта. Особенно в случае OpenSource. +- `README.md` - основная информация об установки шаблона. Можете разместить в нём информацию о вашем проекте и его установке. - `requirements.php` - проверка соответствия требованиям Yii. -- `yii` - консольное приложение начальной загрузки (bootstrap) для Linux. -- `yii.bat` - такое же приложение для Windows. - - -Предустановленные псевдонимы путей ------------------------ - - - - - - - - - - - - - +- `yii` - входной скрипт консольного приложения. +- `yii.bat` - он же для Windows. + +Встроенные псевдонимы путей +--------------------------- + - `@yii` - директория фрэймворка. -- `@app` - корневая директория исполняемого приложения. +- `@app` - корневая директория выполняемого в данный момент приложения. - `@common` - директория common. - `@frontend` - директория веб-приложения frontend. - `@backend` - директория веб-приложения backend. - `@console` - директория console. - `@runtime` - директория runtime исполняемого приложения. - `@vendor` - директория vendor, содержащая пакеты загруженые Composer'ом. -- `@bower` - директория vendor, содержащая пакеты [bower packages](http://bower.io/). -- `@npm` - директория vendor, содержащая пакеты [npm packages](https://www.npmjs.org/). -- `@web` - основной URL исполняемого веб-приложения. +- `@bower` - директория vendor, содержащая [пакеты bower](http://bower.io/). +- `@npm` - директория vendor, содержащая [пакеты npm](https://www.npmjs.org/). +- `@web` - базовый URL исполняемого веб-приложения. - `@webroot` - корневая веб-директория исполняемого веб-приложения. - - -Псевдонимы характерные для структуры директорий сложного(advanced) приложения (`@common`, `@frontend`, `@backend` и `@console`) заданы в `common/config/bootstrap.php`. +Псевдонимы, характерные для структуры директорий приложения advanced (`@common`, `@frontend`, `@backend` и `@console`) +задаются в `common/config/bootstrap.php`. - Приложения ------------- +---------- - - - -В сложном(advanced) шаблоне размещается три приложения: frontend, backend and console. Frontend это та часть приложения которое обеспечивает взаимодействие системы с конечным пользователем проекта. Backend это административная панель, аналитика и прочий подобный функционал. Console обычно используется для выполнения заданий по рассписанию(cron) и низкоуровневого управления сервером. +В шаблоне advanced три приложения: frontend, backend и console. Frontend это та часть приложения, которае обеспечивает +взаимодействие системы с конечным пользователем проекта. Backend это административная панель, аналитика и прочая подобная +функциональность. Console обычно используется для выполнения заданий по расписанию через cron, низкоуровневого +управления сервером, при развёртывании приложения, работы с миграциями и ресурсами. - -Также есть директория `common`, которая содержит файлы используемые более чем одним приложением. Например, модель `User`. Веб-приложения Frontend и backend оба содержать директория `web`. Это корневая папка сайтов которую вы должны настроить в вебсервере. - -У каждого приложения есть собственное пространство имен (namespace) и псевдоним соответствующий его названию. Это же справедливо и для общей директории `common`. +Также есть директория `common`, которая содержит файлы используемые более чем одним приложением. Например, модель `User`. +Оба веб приложения frontend и backend содержат директорию `web`. Это корневая директория, которую вы должны настроить +в вебсервере. - -Конфигурация и окружение ------------------------------- +У каждого приложения есть собственное пространство имён и соответствующий его названию псевдоним. Это же справедливо и для +общей директории `common`. - -Существует множество проблем при обычном подходе к настройке конфигурации: +Конфигурации и окружения +------------------------ - - - - -Каждый участник команды разработки имеет свою собственную конфигурацию. Изменение конфигурации в общем репозитории повлияет на настройки других участников команды. -Пароль от эксплуатационной БД и API ключи не должны оказаться в хранилище. -Существует много серверных режимов(environments): development(разработка), testing(тестирование), production(эксплуатация). Каждый режим должен иметь свою собственную конфигурацию. -Настройка всех параметров конфигурации для каждого случая использования очень однотипна и отнимает много времени для ее поддержки. +Существует множество проблем при типичном подходе к настройке конфигурации: +- Каждый член команды имеет свою собственную конфигурацию. Изменение конфигурации в общем репозитории повлияет на всех +остальных. +- Пароль от эксплуатационной БД и API ключи не должны оказаться в репозитории. +- Существует много окружений: development (разработка), testing (тестирование), production (эксплуатация). Каждое окружение + должно иметь свою собственную конфигурацию. +- Настройка всех параметров конфигурации для каждого случая однотипна и отнимает слишком много времени. - -Для решения этих проблем Yii вводит простую концепцию окружений. Каждое окружение(режим) представлено набором файлов в директории `environments`. Команда `init` используется для переключения между ними(режимами). Она просто копирует все файлы из директории `environments` в корневую директорию, где находятся все приложения. - -Обычно окружение содержит файлы первоначальной загрузки приложения такие как `index.php` и файлы конфигурации, имена которых дополнены с суфиксами `-local.php`. Они добавлены в файл `.gitignore` и никогда не попадут в хранилище кода. +Для решения этих проблем Yii вводит простую концепцию окружений. Каждое окружение представлено набором файлов в +директории `environments`. Для переключения между окружениями используется команда `init`. Она довольно проста. Всё, +что она на самом деле делает - это копирование всех файлов из директории окружения в корневую директорию, где находятся +все приложения. - -Чтобы избежать дублирования конфигураций они перекрывают друг друга. Например, приложение frontend считывает конфигурацию из файлов в следующем порядке: +Обычно окружение содержит входные скрипты приложения, такие как `index.php`, и файлы конфигурации, имена которых +дополнены суфиксами `-local.php`. Эти файлы добавлены в `.gitignore` и никогда не попадут в репозиторий. + +Чтобы избежать дублирования, конфигурации перекрывают друг друга. Например, приложение frontend считывает конфигурацию +в следующем порядке: - `common/config/main.php` - `common/config/main-local.php` - `frontend/config/main.php` - `frontend/config/main-local.php` - Парамтры считываются в следующем порядке: - `common/config/params.php` @@ -194,20 +147,17 @@ - `frontend/config/params.php` - `frontend/config/params-local.php` - -Значения из последующего конфигурационного файла перекрывают аналогичные значения из предыдущих конфигурационных файлов. +Значения из следующего конфигурационного файла перекрывают аналогичные значения из предыдущих конфигурационных файлов. - Полная схема: - -![Конфигурации сложного(advanced) приложения](images/advanced-app-configs.png) - -Настройка Composer'a --------------------- +![Конфигурации приложения advanced](images/advanced-app-configs.png) + +Настройка Composer +------------------ - -После того как шаблон приложения установлен, будет хорошей идеей настроить дефолтный `composer.json` который находится в корневой директории проекта: +После того как шаблон приложения установлен, хорошо бы изменить `composer.json` который находится в корневой директории +проекта: ```json { @@ -253,41 +203,38 @@ } ``` - -Во-первых мы обновляем основную информацию. Меняем значения параметро `name`, `description`, `keywords`, `homepage` и `support` на соответствующие вашему проекту. +Во-первых, мы обновляем основную информацию. Меняем значения `name`, `description`, `keywords`, `homepage` и `support` +на соответствующие вашему проекту. - - -А сейчас интересная часть. Вы можете добавить больше пакетов необходимых для вашего приложения в раздел `require`. -Все эти пакеты загрузятся с [packagist.org](https://packagist.org/), так что не стесняйтесь полазить по этому сайту в поисках полезного кода. +А сейчас интересная часть. вы можете добавить больше пакетов, необходимых для вашего приложения, в раздел `require`. +Все они с [packagist.org](https://packagist.org/). Стоит его изучить так как там множество пакетов с полезным кодом. - -После того как ваш `composer.json` настроен, Вы можете выполнить в консоле команду `composer update --prefer-dist`, подождать пока требуемые пакеты загрузятся и установятся, и просто начать их использовать. Автозагрузка классов из этих пакетов будет осуществляться автоматически. +После того как ваш `composer.json` настроен, вы можете выполнить в консоли команду `composer update --prefer-dist`, +подождать пока требуемые пакеты загрузятся и установятся, и начать их использовать. Автозагрузка классов этих пакетов +будет осуществляться автоматически. - -Создание ссылок из backend'а в frontend ---------------------------------------- +Создание ссылок на frontend из backend +-------------------------------------- - -Часто приходиться создавать ссылки из приложения backend в приложение frontend. Так как frontend приложение может содержать свои собственные правила для URL менеджера, то вам придется продублировать их в конфигурации backend приложения в отдельной секции с отличающимся от основного блока правил(urlManager) названием (например: 'urlManagerFrontend'): +Часто приходится создавать ссылки из приложения backend на приложение frontend. Так как frontend может использовать +собственную конфигурация менеджера URL, вам придётся продублировать её в конфигурации backend под новым именем: ```php return [ 'components' => [ 'urlManager' => [ - // это ваши обычные правила URL менеджера в конфигурации backend приложения + // конфигурация основного менеджера URL в конфигурации backend ], 'urlManagerFrontend' => [ - // а это ваши правила URL менеджера взятые из конфигурации frontend приложения + // конфигурация менеджера URL из frontend ], ], ]; ``` - -После того, как это будет сделано, вы сможете получить URL, указывающий на Frontend приложение следующим способом: +После того, как это будет сделано, вы сможете получить URL, указывающий на frontend, следующим способом: + ```php echo Yii::$app->urlManagerFrontend->createUrl(...); ``` From a51543c443dabc48d5d8bc94a4e827a7a7d37b14 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 9 Nov 2014 16:54:09 +0300 Subject: [PATCH 138/144] Updated Russian traslation of "Installing Yii" --- docs/guide-ru/start-installation.md | 75 ++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/docs/guide-ru/start-installation.md b/docs/guide-ru/start-installation.md index cb3b543..4a2563d 100644 --- a/docs/guide-ru/start-installation.md +++ b/docs/guide-ru/start-installation.md @@ -5,47 +5,67 @@ Первый способ предпочтительнее так как позволяет установить новые [расширения](structure-extensions.md) или обновить Yii одной командой. +> Примечание: В отличие от Yii 1, после стандартной установки Yii 2 мы получаем как фреймворк, так и шаблон приложения. + Установка при помощи Composer ----------------------- Если Composer еще не установлен это можно сделать по инструкции на -[getcomposer.org](https://getcomposer.org/download/), или одним из нижеперечисленных способов: - -* на Linux или Mac, используйте следующую команду: +[getcomposer.org](https://getcomposer.org/download/), или одним из нижеперечисленных способов. На Linux или Mac +используйте следующую команду: ``` curl -s http://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer ``` -* на Windows, скачайте и запустите [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe). + +На Windows, скачайте и запустите [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe). В случае возникновения проблем или если вам необходима дополнительная информация, обращайтесь -к [документации Composer](https://getcomposer.org/doc/) . +к [документации Composer](https://getcomposer.org/doc/). + +Если у вас уже установлен Composer, обновите его при помощи `composer self-update`. После установки Composer устанавливать Yii можно запустив следующую команду в папке доступной через веб: -``` -composer create-project --prefer-dist yiisoft/yii2-app-basic basic -``` + composer global require "fxp/composer-asset-plugin:1.0.0-beta3" + composer create-project --prefer-dist yiisoft/yii2-app-basic basic + +Первая команда устанавливает [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/), +который позводяет управлять зависимостями пакетов bower и npm через Composer. Эту команду достаточно выполнить один раз. +Вторая команда устанавливает Yii в директорию `basic`. Если хотите, можете выбрать другое имя директории. Composer установит Yii (шаблонное приложение basic) в папку `basic`. -> **Подсказка**: Если хотите установить последнюю нестабильную версию Yii, вы можете добавить ключ `stability`: -``` -composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic -``` -Стоит отметить, что нестабилную версию Yii нельзя использовать на рабочем сервере. +> Примечание: В процессе установки Composer может запросить логин и пароль от Github потому как у API Github имеется +> ограничение на количество запросов. Это нормально потому как Composer в процессе работы запрашивает у Github большое +> количество информации для каждого пакета. Вход на Github повышает ограничение по запросам API и Composer может +> продолжить свою работу. Подробнее об этом можно прочитать в +> [документации Composer](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens). + +> Подсказка: Если вы хотите установить последнюю нестабильную ревизию Yii, можете использовать следующую команду, +> в которой присутствует [опция stability](https://getcomposer.org/doc/04-schema.md#minimum-stability): +> +> composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic +> +> Старайтесь не использовать нестабильную версию Yii на рабочих серверах потому как она может внезапно поломать код. Установка из архива ------------------------------- -Установка Yii из архива состоит из двух шагов: +Установка Yii из архива состоит из трёх шагов: -1. Скачайте архив по адресу [yiiframework.com](http://www.yiiframework.com/download/yii2-basic); +1. Скачайте архив с [yiiframework.com](http://www.yiiframework.com/download/); 2. Распакуйте скачанный архив в папку, доступную из Web. +3. В файле `config/web.php` добавьте сектетный ключ в значение `cookieValidationKey` (при установке через Composer + это происходит автоматически): + ```php + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => 'enter your secret key here', + ``` Другие опции установки -------------------------- @@ -64,18 +84,20 @@ composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic bas Проверка установки ---------------------- -Если вы установили приложение в директорию `basic` в корневой директории вашего веб сервера и имя сервера `hostname`, -запустить приложение можно открыв следующий URL через браузер: +После установки приложение будет доступно по следующему URL: ``` -http://hostname/basic/web/index.php +http://localhost/basic/web/index.php ``` +Здесь подразумевается, что вы установили приложение в директорию `basic` в корневой директории вашего веб сервера +сервер работает локально (`localhost`). Вам может потребоваться предварительно его настроить. + ![Успешно установленный Yii](images/start-app-installed.png) Вы должны увидеть страницу приветствия «Congratulations!». Если нет — проверьте требования Yii одним из способов: -* Браузером перейдите по адресу `http://hostname/basic/requirements.php` +* Браузером перейдите по адресу `http://localhost/basic/requirements.php` * Или выполните команду в консоли: ``` @@ -96,12 +118,14 @@ http://hostname/basic/web/index.php его на рабочем сервере. Приложение, установленное по инструкциям, приведённым выше, будет работать сразу как с [Apache](http://httpd.apache.org/), -так и с [Nginx](http://nginx.org/) под Windows и Linux. +так и с [Nginx](http://nginx.org/) под Windows и Linux с установленным PHP 5.4 и выше. Yii 2.0 также совместим с +[HHVM](http://hhvm.com/). Тем не менее, в некоторых случаях поведение при работе с HHVM отличается от обычного PHP. +Будьте внимательны. -На рабочем сервере вам наверняка захочется изменить URL приложения с `http://hostname/basic/web/index.php` -на `http://hostname/index.php`. Для этого необходимо изменить корневую директорию в настройках веб сервера так, чтобы та -указывала на `basic/web`. Дополнительно можно спрятать `index.php` следуя описанию в разделе «[Разбор и генерация URL](runtime-url-handling.md)». -Далее будет показано как настроить Apache и Nginx. +На рабочем сервере вам наверняка захочется изменить URL приложения с `http://www.example.com/basic/web/index.php` +на `http://www.example.com/index.php`. Для этого необходимо изменить корневую директорию в настройках веб сервера так, +чтобы та указывала на `basic/web`. Дополнительно можно спрятать `index.php` следуя описанию в разделе +«[Разбор и генерация URL](runtime-url-handling.md)». Далее будет показано как настроить Apache и Nginx. > Информация: Устанавливая `basic/web` корневой директорией веб сервера вы защищаете от нежелательного доступа код и данные, находящиеся на одном уровне с `basic/web`. Это делает приложение более защищенным. @@ -136,7 +160,8 @@ DocumentRoot "path/to/basic/web" ### Рекомендуемые настройки Nginx PHP должен быть установлен как [FPM SAPI](http://php.net/manual/ru/install.fpm.php) для [Nginx](http://wiki.nginx.org/). -Используйте следующие параметры Nginx и не забудьте заменить `path/to/basic/web` на корректный путь к `basic/web`. +Используйте следующие параметры Nginx и не забудьте заменить `path/to/basic/web` на корректный путь к `basic/web` и +`mysite.local` на ваше имя хоста. ``` server { From 21aa0f07c9f718a8f28b4925ae9eea1771d5dbce Mon Sep 17 00:00:00 2001 From: Timur Melnikov Date: Tue, 28 Oct 2014 17:04:51 +0200 Subject: [PATCH 139/144] Ukrainian translation for caching-fragment.md and concept-aliases.md --- docs/guide-uk/caching-fragment.md | 147 ++++++++++++++++++++++++++++++++++++++ docs/guide-uk/concept-aliases.md | 118 ++++++++++++++++++++++++++++++ 2 files changed, 265 insertions(+) create mode 100644 docs/guide-uk/caching-fragment.md create mode 100644 docs/guide-uk/concept-aliases.md diff --git a/docs/guide-uk/caching-fragment.md b/docs/guide-uk/caching-fragment.md new file mode 100644 index 0000000..5ff7cf9 --- /dev/null +++ b/docs/guide-uk/caching-fragment.md @@ -0,0 +1,147 @@ +Кешування фрагментів +================ + +Кешування фрагментів відноситься до кешуванню фрагментів сторінки. Наприклад, якщо сторінка відображає в таблиці сумарні річні продажі, ми можемо зберегти цю таблицю в кеші з метою економії часу, необхідного для створення таблиці при кожному запиті. Кешування фрагментів засноване на [кешуванні даних](caching-data.md). + +Для кешування фрагментів використовуйте наступний код в [виді](structure-views.md): + +```php +if ($this->beginCache($id)) { + + // ... тут створюємо вміст ... + + $this->endCache(); +} +``` + +Таким чином укладіть те, що ви хочете закешовану між викликом [[yii\base\View::beginCache()|beginCache()]] та +[[yii\base\View::endCache()|endCache()]]. Якщо вміст буде знайдено в кеші, [[yii\base\View::beginCache()|beginCache()]] +відобразить закешований вміст і поверне false, минаючи генерацію вмісту. +В іншому випадку, буде виконаний код генерації контента і коли буде викликаний [[yii\base\View::endCache()|endCache()]], то сгенерированное вміст буде записано і збережено в кеші. + +Также как и [кэширование данных](caching-data.md), для кэширования фрагментов требуется уникальный идентификатор для определения кэшируемого фрагмента. + + +## Параметры кэширования + +Вызывая метод [[yii\base\View::beginCache()|beginCache()]], мы можем передать в качестве второго аргумента массив, содержащий параметры кэширования для управления кэшированием фрагмента. Заглядывая за кулисы, можно увидеть, что этот массив будет использоваться для настройки виджета [[yii\widgets\FragmentCache]], который реализует фактическое кэширование фрагментов. + +### Срок хранения + +Наверное, наиболее часто используемым параметром является [[yii\widgets\FragmentCache::duration|duration]]. +Он определяет какое количество секунд содержимое будет оставаться действительным (корректным). Следующий код помещает фрагмент в кэш не более, чем на час:: + +```php +if ($this->beginCache($id, ['duration' => 3600])) { + + // ... здесь создаём содержимое ... + + $this->endCache(); +} +``` + +Если мы не установим длительность (срок хранения), она будет равна значению по умолчанию (60 секунд). Это значит, что кэшированное содержимое станет недействительным через 60 секунд. + + +### Зависимости + +Также как и [кэширование данных](caching-data.md#cache-dependencies), кэшируемое содержимое фрагмента тоже может иметь зависимости. Например, отображение содержимого сообщения зависит от того, изменено или нет это сообщение. + +Для определения зависимости мы устанавливаем параметр [[yii\widgets\FragmentCache::dependency|dependency]], который может быть либо объектом [[yii\caching\Dependency]], либо массивом настроек, который может быть использован для создания объекта [[yii\caching\Dependency]]. Следующий код определяет содержимое фрагмента, зависящее от изменения значения столбца `updated_at`: + +```php +$dependency = [ + 'class' => 'yii\caching\DbDependency', + 'sql' => 'SELECT MAX(updated_at) FROM post', +]; + +if ($this->beginCache($id, ['dependency' => $dependency])) { + + // ... здесь создаём содержимое ... + + $this->endCache(); +} +``` + + +### Вариации + +Кэшируемое содержимое может быть изменено в соответствии с некоторыми параметрами. Например, для веб-приложений, поддерживающих несколько языков, одна и та же часть кода может создавать содержимое на нескольких языках. Поэтому у вас может возникнуть желание кэшировать содержимое в зависимости от текущего языка приложения. + +Чтобы задать вариации кэша, установите параметр [[yii\widgets\FragmentCache::variations|variations]], который должен быть массивом, содержащим скалярные значения, каждое из которых представляет определенный коэффициент вариации. Например, +чтобы кэшировать содержимое в зависимости от языка приложения, вы можете использовать следующий код: + +```php +if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) { + + // ... здесь создаём содержимое ... + + $this->endCache(); +} +``` + + +### Переключение кэширования + +Иногда может потребоваться включать кеширование фрагментов только для определённых условий. Например, страницу с формой мы хотим кэшировать только тогда, когда обращение к ней произошло впервые (посредством GET запроса). Любое последующее отображение формы (посредством POST запроса) не должно быть кэшировано, потому что может содержать данные, введённые пользователем. Для этого мы задаём параметр [[yii\widgets\FragmentCache::enabled|enabled]]: + +```php +if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) { + + // ... здесь создаём содержимое ... + + $this->endCache(); +} +``` + + +## Вложенное кэширование + +Кэширование фрагментов может быть вложенным. Это значит, что кэшируемый фрагмент окружён более крупным фрагментом (содержится в нём), который также кэшируется. Например, комментарии кэшируются во внутреннем фрагменте кэша, и они же кэшируются вместе с содержимым сообщения во внешнем фрагменте кэша. Следующий код демонстрирует как два фрагмента кэша могут быть вложенными: + +```php +if ($this->beginCache($id1)) { + + // ...логика создания контента... + + if ($this->beginCache($id2, $options2)) { + + // ...логика создания контента... + + $this->endCache(); + } + + // ...логика создания контента... + + $this->endCache(); +} +``` + +Параметры кэширования могут быть различными для вложенных кэшей. Например, внутренний и внешний кэши в вышеприведённом примере могут иметь разные сроки хранения. Даже когда данные внешнего кэша уже не являются актуальными, внутренний кеш может содержать актуальный фрагмент. Тем не менее, обратное не верно. Если внешний кэш актуален, данные будут отдаваться из него даже если внутренний кэш содержит устаревшие данные. Следует проявлять осторожность при выставлении срока хранения и задания зависимостей для вложенных кэшей. В противном случае вы можете получить устаревшие данные. + + +## Динамическое содержимое + +Когда используется кэширование фрагментов, вы можете столкнуться с ситуацией когда большой фрагмент содержимого статичен за исключением одного или нескольких мест. Например, заголовок страницы может отображаться в главном меню вместе с +именем текущего пользователя. Еще одна проблема в том, что содержимое, которое было закэшировано, может содержать PHP код, который должен выполняться для каждого запроса (например код для регистрации в asset bundle). Обе проблемы могут быть решены с помощью, так называемой функции *динамического содержимого*. + +Динамическое содержимое значит, что часть вывода не будет закэширована даже если она заключена в кэширование фрагментов. Чтобы сделать содержимое динамическим постоянно, оно должно быть создано, используя специальный PHP код. + +Вы можете вызвать [[yii\base\View::renderDynamic()]] в пределах кэширования фрагмента для вставки динамического содержимого +в нужное место, как в примере ниже: + +```php +if ($this->beginCache($id1)) { + + // ...логика создания контента... + + echo $this->renderDynamic('return Yii::$app->user->identity->name;'); + + // ...логика создания контента... + + $this->endCache(); +} +``` + +Метод [[yii\base\View::renderDynamic()|renderDynamic()]] принимает некоторую часть PHP кода как параметр. +Возвращаемое значение этого кода будет вставлено в динамическое содержимое. Этот PHP код будет выполняться для каждого запроса, независимо от того находится ли он внутри кэширования фрагмента или нет. diff --git a/docs/guide-uk/concept-aliases.md b/docs/guide-uk/concept-aliases.md new file mode 100644 index 0000000..8c22516 --- /dev/null +++ b/docs/guide-uk/concept-aliases.md @@ -0,0 +1,118 @@ +Псевдоніми +========= + +Псевдоніми використовуються для позначення шляхів до файлів або URL адрес і допомагають уникнути використання абсолютних шляхів +або URL в коді. Для того, щоб не переплутати псевдонім із звичайним шляхом до файлу або URL, він повинен починатися з `@`. В Yii +є безліч заздалегідь визначених псевдонімів. Наприклад, `@yii` вказує на директорію, в яку був встановлений +Yii framework, а `@web` можна використовувати для отримання базового URL поточного додатку. + + +Створення псевдонімів +---------------------------------------------- + +Для створення псевдоніма шляху до файлу або URL використовується метод [[Yii::setAlias()]]: + +```php +// псевдонім шляху до файлу +Yii::setAlias('@foo', '/path/to/foo'); + +// псевдонім URL +Yii::setAlias('@bar', 'http://www.example.com'); +``` + +> Примітка: псевдонім шляху до файлу або URL *не* обов'язково вказує на існуючий файл або ресурс. + +Використовуючи вже заданий псевдонім, ви можете отримати на основі нього новий без виклику [[Yii :: setAlias ​​()]]. Зробити це можна, додавши в його кінець `/`, за яким слід один або більше сегментів шляху. Псевдоніми, визначені за допомогою +[[Yii::setAlias()]], є *кореневими псевдонімами*, в той час як отримані з них називаються похідними псевдонімами. На приклад, `@foo` є кореневим псевдонімом, а `@foo/bar/file.php` — похідним. + +Ви можете задати новий псевдонім, використовуючи раніше створений псевдонім (не важливо, кореневої він чи похідний): + +```php +Yii::setAlias('@foobar', '@foo/bar'); +``` + +Кореневі псевдоніми, як правило, створюються на етапі [попереднього завантаження (bootstrapping)](runtime-bootstrapping.md). +Наприклад, ви можете викликати [[Yii::setAlias()]] у [вхідному скрипті](structure-entry-scripts.md). Для зручності, в +[додатку (Application)](structure-applications.md) передбачено властивість `aliases`, яке можна задати через +[конфігурацію додатку](concept-configurations.md): + +```php +return [ + // ... + 'aliases' => [ + '@foo' => '/path/to/foo', + '@bar' => 'http://www.example.com', + ], +]; +``` + + +Перетворення псевдонімів +---------------------------------------------------- + +Метод [[Yii :: getAlias ​​()]] перетворює кореневої псевдонім в шлях до файлу або URL, який цей псевдонім представляє. Цей же метод може працювати і з похідними псевдонімами: + +```php +echo Yii::getAlias('@foo'); // виведе: /path/to/foo +echo Yii::getAlias('@bar'); // виведе: http://www.example.com +echo Yii::getAlias('@foo/bar/file.php'); // виведе: /path/to/foo/bar/file.php +``` + +Шлях або URL, представлений похідним псевдонімом, визначається шляхом заміни в ньому частині, що відповідає кореневого псевдоніму, на відповідний йому шлях або URL. + +> Примітка: Метод [[Yii :: getAlias ​​()]] не перевіряє фактичного існування одержуваного шляху або URL. + +Кореневої псевдонім може містити знаки '/'. При цьому метод [[Yii::getAlias()]] коректно визначить, яка частина псевдоніма є кореневої і вірно сформує шлях або URL: + +```php +Yii::setAlias('@foo', '/path/to/foo'); +Yii::setAlias('@foo/bar', '/path2/bar'); +Yii::getAlias('@foo/test/file.php'); // виведе: /path/to/foo/test/file.php +Yii::getAlias('@foo/bar/file.php'); // виведе: /path2/bar/file.php +``` + +Якби `@foo/bar` не був оголошений кореневим псевдонімом, остання строка вивела б `/path/to/foo/bar/file.php`. + +Використання псевдонімів. +------------------------------------------------ + +Псевдоніми розпізнаються в багатьох частинах Yii без необхідності попередньо викликати [[Yii::getAlias()]] для отримання шляху або URL. Наприклад, [[yii\caching\FileCache::cachePath]] приймає як звичайний шлях до файлу, так і псевдонім шляху завдяки префіксу `@`, який дозволяє їх розрізняти. + +```php +use yii\caching\FileCache; + +$cache = new FileCache([ + 'cachePath' => '@runtime/cache', +]); +``` + +Для того, щоб дізнатися чи підтримує метод або властивість псевдоніми, зверніться до документації API. + + +Заздалегідь визначені псевдоніми +---------------------------------------------------------- + +В Yii заздалегідь визначені псевдоніми для часто використовуваних шляхів до файлів і URL: + +- `@yii`: директорія, в якій знаходиться файл `BaseYii.php` (директорія фреймворка). +- `@app`: [[yii\base\Application::basePath|базовий шлях]] поточного додатку. +- `@runtime`: [[yii\base\Application::runtimePath|директорія runtime]] поточного додатку. +- `@vendor`: [[yii\base\Application::vendorPath|директорія vendor Composer]. +- `@webroot`: вебрут поточного веб додатка (там де `index.php`). +- `@web`: базовий URL поточного додатку. + +Псевдонім `@yii` задається в момент підключення файлу `Yii.php` у [вхідному скрипті](structure-entry-scripts.md). +Решта псевдоніми задаються в конструкторі додатки в момент застосування [конфигурації](concept-configurations.md). + + +Псевдоніми розширень +------------------------------------------------ + +Для кожного [розширення](structure-extensions.md), встановлюваного через Composer, автоматично задається псевдонім. +Його ім'я відповідає кореневого простору імен розширення відповідно до його `composer.json`. Псевдонім представляє +шлях до кореневої директорії пакета. Наприклад, якщо ви встановите розширення `yiisoft/yii2-jui`, то вам автоматично стане доступний псевдонім `@yii/jui`. Він створюється на етапі [первинного завантаження (bootstrapping)](runtime-bootstrapping.md) +приблизно так: + +```php +Yii::setAlias('@yii/jui', 'VendorPath/yiisoft/yii2-jui'); +``` From a5c776c19d9165b4d800d0c3bc6db173c6d90b46 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 9 Nov 2014 17:19:47 +0300 Subject: [PATCH 140/144] Fixed typo --- docs/guide-ru/rest-resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/rest-resources.md b/docs/guide-ru/rest-resources.md index c6a2e80..9920c92 100644 --- a/docs/guide-ru/rest-resources.md +++ b/docs/guide-ru/rest-resources.md @@ -36,7 +36,7 @@ http://localhost/users // вернёт только поля id и email, если они объявлены в методе fields() http://localhost/users?fields=id,email -// вернёт все поля обявленные в fields() и поле profile если оно указано в extraFields() +// вернёт все поля объявленные в fields() и поле profile если оно указано в extraFields() http://localhost/users?expand=profile // вернёт только id, email и profile, если они объявлены в fields() и extraFields() From c55186ccee64195f0f3601791147d7fbcd2737f1 Mon Sep 17 00:00:00 2001 From: Timur Melnikov Date: Fri, 24 Oct 2014 11:12:20 +0300 Subject: [PATCH 141/144] [skip ci] Fixed typos in Ukrainian concept-autoloading.md --- docs/guide-uk/concept-autoloading.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide-uk/concept-autoloading.md b/docs/guide-uk/concept-autoloading.md index 501a6bc..21d126f 100644 --- a/docs/guide-uk/concept-autoloading.md +++ b/docs/guide-uk/concept-autoloading.md @@ -4,12 +4,12 @@ [автозавантаження класів](http://www.php.net/manual/ru/language.oop5.autoload.php). Фреймворк надає свій швидкий сумісний з [PSR-4](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md) автозавантажувач, який встановлюється в момент підключення `Yii.php`. -> Примітка: Для простоти оповіді, в цьому розділі ми будемо говорити тільки про автозавантаження класів. Тим не менш, все описане застосовно до інтерфейсів і трейтам. +> Примітка: Для простоти оповіді, в цьому розділі ми будемо говорити тільки про автозавантаження класів. Тим не менш, все описане може бути застосовно до інтерфейсів і трейтів. Як використовувати автозавантажувач Yii -------------------------------------------------------------- -При використанні автозавантажувач класів Yii слід дотримуватися два простих правила створення і іменування класів: +При використанні автозавантажувача класів Yii слід дотримуватися два простих правила створення і іменування класів: * Кожен клас повинен належати простору імен (тобто `foo\bar\MyClass`). * Кожен клас повинен знаходитися в окремому файлі, шлях до якого визначаться наступним правилом: @@ -65,13 +65,13 @@ require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); ``` -Ви можете використовувати автозавантажувач Composer без автозавантажувач Yii. Однак, швидкість автозавантаження в цьому випадку може зменшиться. Також вам буде необхідно слідувати правилам автозавантажувача Composer. +Ви можете використовувати автозавантажувач Composer без автозавантажувачa Yii. Однак, швидкість автозавантаження в цьому випадку може зменшиться. Також вам буде необхідно слідувати правилам автозавантажувача Composer. > Інформація: Якщо ви не хочете використовувати автозавантажувач Yii, створіть свою версію файлу `Yii.php` і підключіть його в [вхідному скрипті](structure-entry-scripts.md). -Автозагрузка класів розширень +Автозавантаження класів розширень ------------------------------------------------------------------- Автозавантажувач Yii може автоматично завантажувати класи [розширень](structure-extensions.md) в тому випадку, якщо дотримується єдине правило. Розширення повинно правильно описати розділ 'autoload' у файлі 'composer.json'. Більш докладно про це можна дізнатися з [офіційній документації Composer](https://getcomposer.org/doc/04-schema.md#autoload). From b4856ceddefd60c6e7a1fc64910a1f59dbf141be Mon Sep 17 00:00:00 2001 From: keltstr Date: Mon, 3 Nov 2014 21:31:24 +0300 Subject: [PATCH 142/144] Update Russian translation of structure-applications.md --- docs/guide-ru/structure-applications.md | 97 ++++++++++++++++----------------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/docs/guide-ru/structure-applications.md b/docs/guide-ru/structure-applications.md index 96833c0..7e7c1dc 100644 --- a/docs/guide-ru/structure-applications.md +++ b/docs/guide-ru/structure-applications.md @@ -2,11 +2,10 @@ ========== Приложения это объекты, которые управляют всей структурой и жизненным циклом прикладной системы Yii. -Каждая Yii прикладная система включает в себя один объект приложения, который создается в [входном скрипте](structure-entry-scripts.md) -и глобально доступен через `\Yii::$app`. +Каждая Yii прикладная система включает в себя один объект приложения, который создается во [входном скрипте](structure-entry-scripts.md) и глобально доступен через `\Yii::$app`. > Информация: В зависимости от контекста, когда мы говорим "приложение", это может означать как объект приложения так и - прикладную систему приложения в целом. + приложение как прикладную систему в целом. Существует два вида приложений: [[yii\web\Application|веб приложения]] и [[yii\console\Application|консольные приложения]]. Как можно догадаться по названию, первый тип в основном занимается обработкой веб запросов, в то время как последний - консольных команд. @@ -14,7 +13,7 @@ ## Конфигурации приложения -Когда [входной скрипт](structure-entry-scripts.md создает приложение, он загрузит [конфигурацию](concept-configurations.md) +Когда [входной скрипт](structure-entry-scripts.md) создает приложение, он загрузит [конфигурацию](concept-configurations.md) и применит ее к приложению, например: ```php @@ -29,8 +28,7 @@ $config = require(__DIR__ . '/../config/web.php'); ``` Также как и обычные [конфигурации](concept-configurations.md), конфигурации приложения указывают как следует инициализировать -свойства объектов приложения. Из-за того, что конфигурации приложений часто являются сложными, они разбиваются на несколько -[конфигурационных файлов](concept-configurations.md#configuration-files), например, `web.php` файл в приведенном выше примере. +свойства объектов приложения. Из-за того, что конфигурация приложения часто является очень сложной, она разбивается на несколько [конфигурационных файлов](concept-configurations.md#configuration-files), например, `web.php` - файл в приведенном выше примере. ## Свойства приложений @@ -55,29 +53,25 @@ $config = require(__DIR__ . '/../config/web.php'); #### [[yii\base\Application::basePath|basePath]] -Свойство [[yii\base\Application::basePath|basePath]] указывает на корневую папку приложения. Это папка, которая содержит -весь код прикладной системы приложения. В данной папке обычно могут находится подпапки `models`, `views`, `controllers`, которые -содержат код, отвечающий шаблону проектирования MVC. +Свойство [[yii\base\Application::basePath|basePath]] указывает на корневую директорию приложения. Эта директория содержит +весь защищенный исходный код приложения. В данной директории обычно могут находится поддиректории `models`, `views`, `controllers`, содержащие код, соответствующий шаблону проектирования MVC. -Вы можете настроить свойство [[yii\base\Application::basePath|basePath]] указав напрямую путь к каталогу через -[псевдонимы пути](concept-aliases.md). В обоих случаях, указанная папка должна существовать, иначе будет брошено исключение. -Путь будет нормализован с помощью вызова функции `realpath()`. +Вы можете задать свойство [[yii\base\Application::basePath|basePath]] используя путь к директории или используя +[псевдоним пути](concept-aliases.md). В обоих случаях, указанная директория должна существовать, иначе будет выброшено исключение. Путь будет нормализован функцией `realpath()`. -Свойство [[yii\base\Application::basePath|basePath]] часто используется для получения других важных путей, например, путь к -runtime папке, которая используется в процессе работы приложения. Именно по этой причине, псевдоним пути `@app` является -предопределенным и указывает на данную папку. Другие пути могут быть получены с помощью использования псевдонима пути, например, -`@app/runtime`. +Свойство [[yii\base\Application::basePath|basePath]] часто используется для указания других важных путей (например, путь к +директории runtime, используемой приложением). По этой причине, псевдоним пути `@app` предустановлен и содержит данный путь. Производные пути могут быть получены с использованием этого псевдонима пути (например, `@app/runtime` указывает на времененную исполняемую(runtime) дирректорию). ### Важные свойства -Свойства, указанные в этом подразделе, часто должны быть настроены т. к. они могут отличаться от приложения к приложению. +Свойства, указанные в этом подразделе, часто нуждаются в преднастройке т.к. они разнятся от приложения к приложению. #### [[yii\base\Application::aliases|aliases]] Это свойство позволяет настроить вам множество [псевдонимов](concept-aliases.md) в рамках массива. -Ключами массива являются имена псевдонимов, а ключами - соответствующие значение пути. Например, +Ключами массива являются имена псевдонимов, а значениями массива - соответствующие значения пути. Например, ```php [ @@ -88,7 +82,7 @@ runtime папке, которая используется в процессе ] ``` -Это свойство доступно таким образом, чтобы вы могли указывать псевдонимы в рамках конфигураций приложения, +Это свойство доступно таким образом, чтобы вы могли указывать псевдонимы в рамках конфигурации приложения, а не вызовов метода [[Yii::setAlias()]]. @@ -105,7 +99,8 @@ ID в качестве элемента данного свойства. - ID, указанный в [компонентах](#components); - ID модуля, указанный в [модулях](#modules); - название класса; -- массив конфигурации. +- массив конфигурации; +- анонимная функция, которая создает и возвращает компонент. Например, @@ -116,19 +111,31 @@ ID в качестве элемента данного свойства. 'demo', // название класса - 'app\components\TrafficMonitor', + 'app\components\Profiler', // массив конфигурации [ 'class' => 'app\components\Profiler', 'level' => 3, - ] + ], + + // анонимная функция + function () { + return new app\components\Profiler(); + } ], ] ``` +> Info: Если идентификатор(ID) модуля такой же, как идентификатор компонента приложения, то в процессе [начальной загрузки](runtime-bootstrapping.md) будет использован компонент приложения. Если Вы вместо этого хотите использовать модуль, то можете указать его при помощью анонимной функции похожей на эту: +>```php +[ + function () { + return Yii::$app->getModule('user'); + }, +] +``` -В процессе начальной загрузки, каждый компонент будет создан. Если класс компонента имеет интерфейс [[yii\base\BootstrapInterface]], то -также будет вызван метод [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]]. +В процессе [начальной загрузки](runtime-bootstrapping.md), каждый компонент будет создан. Если класс компонента имеет интерфейс [[yii\base\BootstrapInterface]], то также будет вызван метод [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]]. Еще одним практическим примером является конфигурация [базового шаблона приложения](start-installation.md), в котором модули `debug` и `gii` указаны как `bootstrap` компоненты, когда приложение находится в отладочном режиме. @@ -144,19 +151,17 @@ if (YII_ENV_DEV) { } ``` -> Примечание: Указывание слишком большого количества компонентов в `bootstrap` приведет к снижению производительности приложения, +> Примечание: Указывание слишком большого количества компонентов в [`bootstrap`](runtime-bootstrapping.md) приведет к снижению производительности приложения, потому что для каждого запроса одно и то же количество компонентов должно быть загружено. Таким образом вы должны использовать начальную загрузку разумно. #### [[yii\web\Application::catchAll|catchAll]] -Данное свойство поддерживается только [[yii\web\Application|веб приложениями]].Оно указывает [действие контроллера](structure-controllers.md), -которое должно обрабатывать все входящие запросы от пользователя. В основном это используется, когда приложения находится в -режиме обслуживания и должно обрабатывать все запросы через одно действие. +Данное свойство поддерживается только [[yii\web\Application|веб приложениями]].Оно указывает [действие контроллера](structure-controllers.md), которое должно обрабатывать все входящие запросы от пользователя. В основном это используется, когда приложения находится в режиме обслуживания и должно обрабатывать все запросы через одно действие. -Конфигурация это массив, первый элемент которого, указывает маршрут действия. Остальные элементы в формате ключ-значение -указывают дополнительные параметры, которые должны быть переданы действию. Например, +Конфигурация это массив, первый элемент которого, определяет маршрут действия. Остальные элементы в формате пара ключ-значение задают дополнительные параметры, которые должны быть переданы действию (методу контроллера actionXXX). +Например, ```php [ @@ -171,8 +176,8 @@ if (YII_ENV_DEV) { #### [[yii\base\Application::components|components]] -Данное свойство является наиболее важным. Оно позволяет вам указать список компонентов, которые называются [компоненты приложения](#structure-application-components.md), -которые вы можете использовать в других местах. Например, +Данное свойство является наиболее важным. Оно позволяет вам зарегистрировать список именованных компонентов, называемых [компоненты приложения](#structure-application-components.md), которые Вы можете использовать в других местах. +Например, ```php [ @@ -188,22 +193,16 @@ if (YII_ENV_DEV) { ] ``` -Каждый компонент приложения указан массивом в формате ключ-значение. Ключ представляет собой ID компонента приложения, в то время -как значение представляет собой название класса или [конфигурацию](concept-configurations.md). +Каждый компонент приложения указан массивом в формате ключ-значение. Ключ представляет собой ID компонента приложения, в то время как значение представляет собой название класса или [конфигурацию](concept-configurations.md). -Вы можете зарегистрировать любой компонент в приложении, позже этот компонент будет глобально доступен -через выражение `\Yii::$app->ComponentID`. +Вы можете зарегистрировать любой компонент в приложении, позже этот компонент будет глобально доступен через выражение `\Yii::$app->ComponentID`. -Более детальная информация приведена в разделе [Компоненты приложения](structure-application-components.md). +Более подробная информация приведена в разделе [Компоненты приложения](structure-application-components.md). #### [[yii\base\Application::controllerMap|controllerMap]] -Данное свойство позволяет вам устанавливать соответствия между ID контроллера и его классом. По-умолчанию, Yii устанавливает -соответствие между ID контроллера и его классом согласно данному [соглашению](#controllerNamespace) (таким образом, -ID `post` будет соответствовать `app\controllers\PostController` ). С помощью настройки этого свойства вы можете изменить -соглашение для нужных контроллеров. В приведенном ниже примере, `account` будет соответствовать `app\controllers\UserController`, -в то время как `article` будет соответствовать `app\controllers\PostController`. +Данное свойство позволяет вам задавать соответствия(mapping) между ID контроллера и произвольным классом контроллера. По-умолчанию, Yii задает соответствие между ID контроллера и его классом согласно данному [соглашению](#controllerNamespace) (таким образом, ID `post` будет соответствовать `app\controllers\PostController` ). Задавая эти свойства вы можете переопределить соответствия для необходимых контроллеров. В приведенном ниже примере, `account` будет соответствовать контроллеру `app\controllers\UserController`, в то время как `article` будет соответствовать контроллеру `app\controllers\PostController`. ```php [ @@ -219,8 +218,8 @@ ID `post` будет соответствовать `app\controllers\PostControl ] ``` -Ключами данного свойства являются ID контроллеров, а значениями являются название -класса контроллера или [конфигурация](concept-configurations.md). +Ключами данного свойства являются ID контроллеров, а значениями являются соответствующие названия +классов(полное название класса с пространством имен) контроллера или [конфигурация](concept-configurations.md). #### [[yii\base\Application::controllerNamespace|controllerNamespace]] @@ -229,14 +228,12 @@ ID `post` будет соответствовать `app\controllers\PostControl По-умолчанию значение равно `app\controllers`. Если ID контроллера `post`, то согласно соглашению, соответствующий класс контроллера (без пространства имен) будет равен `PostController`, а полное название класса будет равно `app\controllers\PostController`. -Класс контроллера может также находиться в подпапке папки, которая соответствует этому пространству имен. -Например, дан ID контроллера `admin/post`, соответствующие полное имя класса контроллера будет `app\controllers\admin\PostController`. +Класс контроллера может также находиться в поддиректории директории, соответствующей этому пространству имен. +Например, ID контроллера `admin/post`, будет соответветствовать полное имя класса контроллера `app\controllers\admin\PostController`. -Очень важно, чтобы полное имя класса контроллера могло быть использовано [автозагрузкой](concept-autoloading.md) и соответствующее -пространство имен вашего контроллера соответствовало данному свойству. Иначе, вы получите ошибку "Страница не найдена", когда -попытаетесь получить доступ к приложению. +Очень важно, чтобы полное имя класса контроллера могло быть использовано [автозагрузкой](concept-autoloading.md) и соответствующее пространство имен вашего контроллера соответствовало данному свойству. Иначе, Вы получите ошибку "Страница не найдена", при доступе к приложению. -В случае, если вы хотите изменить соглашение как описано выше, вы можете использовать свойство [controllerMap](#controllerMap). +В случае, если вы хотите переопределить соответствия как описано выше, вы можете настроить свойство [controllerMap](#controllerMap). #### [[yii\base\Application::language|language]] From 67ad693cb18c89bc86d8f24e223ab9bc1833aaa1 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 9 Nov 2014 17:34:40 +0300 Subject: [PATCH 143/144] Additional fixed for Russian translation of structure-applications.md --- docs/guide-ru/structure-applications.md | 69 ++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/docs/guide-ru/structure-applications.md b/docs/guide-ru/structure-applications.md index 7e7c1dc..6b87b5d 100644 --- a/docs/guide-ru/structure-applications.md +++ b/docs/guide-ru/structure-applications.md @@ -2,7 +2,8 @@ ========== Приложения это объекты, которые управляют всей структурой и жизненным циклом прикладной системы Yii. -Каждая Yii прикладная система включает в себя один объект приложения, который создается во [входном скрипте](structure-entry-scripts.md) и глобально доступен через `\Yii::$app`. +Каждая прикладная система Yii включает в себя один объект приложения, который создается во [входном скрипте](structure-entry-scripts.md) +и глобально доступен через `\Yii::$app`. > Информация: В зависимости от контекста, когда мы говорим "приложение", это может означать как объект приложения так и приложение как прикладную систему в целом. @@ -13,8 +14,8 @@ ## Конфигурации приложения -Когда [входной скрипт](structure-entry-scripts.md) создает приложение, он загрузит [конфигурацию](concept-configurations.md) -и применит ее к приложению, например: +Когда [входной скрипт](structure-entry-scripts.md) создаёт приложение, он загрузит [конфигурацию](concept-configurations.md) +и применит её к приложению, например: ```php require(__DIR__ . '/../vendor/autoload.php'); @@ -28,7 +29,8 @@ $config = require(__DIR__ . '/../config/web.php'); ``` Также как и обычные [конфигурации](concept-configurations.md), конфигурации приложения указывают как следует инициализировать -свойства объектов приложения. Из-за того, что конфигурация приложения часто является очень сложной, она разбивается на несколько [конфигурационных файлов](concept-configurations.md#configuration-files), например, `web.php` - файл в приведенном выше примере. +свойства объектов приложения. Из-за того, что конфигурация приложения часто является очень сложной, она разбивается на несколько +[конфигурационных файлов](concept-configurations.md#configuration-files), например, `web.php` - файл в приведённом выше примере. ## Свойства приложений @@ -54,13 +56,17 @@ $config = require(__DIR__ . '/../config/web.php'); #### [[yii\base\Application::basePath|basePath]] Свойство [[yii\base\Application::basePath|basePath]] указывает на корневую директорию приложения. Эта директория содержит -весь защищенный исходный код приложения. В данной директории обычно могут находится поддиректории `models`, `views`, `controllers`, содержащие код, соответствующий шаблону проектирования MVC. +весь защищенный исходный код приложения. В данной директории обычно могут находится поддиректории `models`, `views`, +`controllers`, содержащие код, соответствующий шаблону проектирования MVC. Вы можете задать свойство [[yii\base\Application::basePath|basePath]] используя путь к директории или используя -[псевдоним пути](concept-aliases.md). В обоих случаях, указанная директория должна существовать, иначе будет выброшено исключение. Путь будет нормализован функцией `realpath()`. +[псевдоним пути](concept-aliases.md). В обоих случаях, указанная директория должна существовать, иначе будет выброшено +исключение. Путь будет нормализован функцией `realpath()`. Свойство [[yii\base\Application::basePath|basePath]] часто используется для указания других важных путей (например, путь к -директории runtime, используемой приложением). По этой причине, псевдоним пути `@app` предустановлен и содержит данный путь. Производные пути могут быть получены с использованием этого псевдонима пути (например, `@app/runtime` указывает на времененную исполняемую(runtime) дирректорию). +директории runtime, используемой приложением). По этой причине, псевдоним пути `@app` предустановлен и содержит данный путь. +Производные пути могут быть получены с использованием этого псевдонима пути (например, `@app/runtime` указывает на +времененную дирректорию runtime). ### Важные свойства @@ -100,7 +106,7 @@ ID в качестве элемента данного свойства. - ID модуля, указанный в [модулях](#modules); - название класса; - массив конфигурации; -- анонимная функция, которая создает и возвращает компонент. +- анонимная функция, которая создаёт и возвращает компонент. Например, @@ -126,7 +132,9 @@ ID в качестве элемента данного свойства. ], ] ``` -> Info: Если идентификатор(ID) модуля такой же, как идентификатор компонента приложения, то в процессе [начальной загрузки](runtime-bootstrapping.md) будет использован компонент приложения. Если Вы вместо этого хотите использовать модуль, то можете указать его при помощью анонимной функции похожей на эту: +> Info: Если ID модуля такой же, как идентификатор компонента приложения, то в процессе [начальной загрузки](runtime-bootstrapping.md) +> будет использован компонент приложения. Если Вы вместо этого хотите использовать модуль, то можете указать его при +> помощи анонимной функции похожей на эту: >```php [ function () { @@ -135,7 +143,8 @@ ID в качестве элемента данного свойства. ] ``` -В процессе [начальной загрузки](runtime-bootstrapping.md), каждый компонент будет создан. Если класс компонента имеет интерфейс [[yii\base\BootstrapInterface]], то также будет вызван метод [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]]. +В процессе [начальной загрузки](runtime-bootstrapping.md), каждый компонент будет создан. Если класс компонента имеет +интерфейс [[yii\base\BootstrapInterface]], то также будет вызван метод [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]]. Еще одним практическим примером является конфигурация [базового шаблона приложения](start-installation.md), в котором модули `debug` и `gii` указаны как `bootstrap` компоненты, когда приложение находится в отладочном режиме. @@ -151,16 +160,20 @@ if (YII_ENV_DEV) { } ``` -> Примечание: Указывание слишком большого количества компонентов в [`bootstrap`](runtime-bootstrapping.md) приведет к снижению производительности приложения, - потому что для каждого запроса одно и то же количество компонентов должно быть загружено. Таким образом вы должны использовать - начальную загрузку разумно. +> Примечание: Указывание слишком большого количества компонентов в [`bootstrap`](runtime-bootstrapping.md) приведет +к снижению производительности приложения, потому что для каждого запроса одно и то же количество компонентов должно +быть загружено. Таким образом вы должны использовать начальную загрузку разумно. #### [[yii\web\Application::catchAll|catchAll]] -Данное свойство поддерживается только [[yii\web\Application|веб приложениями]].Оно указывает [действие контроллера](structure-controllers.md), которое должно обрабатывать все входящие запросы от пользователя. В основном это используется, когда приложения находится в режиме обслуживания и должно обрабатывать все запросы через одно действие. +Данное свойство поддерживается только [[yii\web\Application|веб приложениями]]. Оно указывает +[действие контроллера](structure-controllers.md), которое должно обрабатывать все входящие запросы от пользователя. +В основном это используется, когда приложения находится в режиме обслуживания и должно обрабатывать все запросы через +одно действие. -Конфигурация это массив, первый элемент которого, определяет маршрут действия. Остальные элементы в формате пара ключ-значение задают дополнительные параметры, которые должны быть переданы действию (методу контроллера actionXXX). +Конфигурация это массив, первый элемент которого, определяет маршрут действия. Остальные элементы в формате пара +ключ-значение задают дополнительные параметры, которые должны быть переданы действию (методу контроллера actionXXX). Например, ```php @@ -176,7 +189,8 @@ if (YII_ENV_DEV) { #### [[yii\base\Application::components|components]] -Данное свойство является наиболее важным. Оно позволяет вам зарегистрировать список именованных компонентов, называемых [компоненты приложения](#structure-application-components.md), которые Вы можете использовать в других местах. +Данное свойство является наиболее важным. Оно позволяет вам зарегистрировать список именованных компонентов, называемых +[компоненты приложения](#structure-application-components.md), которые Вы можете использовать в других местах. Например, ```php @@ -193,16 +207,23 @@ if (YII_ENV_DEV) { ] ``` -Каждый компонент приложения указан массивом в формате ключ-значение. Ключ представляет собой ID компонента приложения, в то время как значение представляет собой название класса или [конфигурацию](concept-configurations.md). +Каждый компонент приложения указан массивом в формате ключ-значение. Ключ представляет собой ID компонента приложения, +в то время как значение представляет собой название класса или [конфигурацию](concept-configurations.md). -Вы можете зарегистрировать любой компонент в приложении, позже этот компонент будет глобально доступен через выражение `\Yii::$app->ComponentID`. +Вы можете зарегистрировать любой компонент в приложении, позже этот компонент будет глобально доступен через +выражение `\Yii::$app->ComponentID`. Более подробная информация приведена в разделе [Компоненты приложения](structure-application-components.md). #### [[yii\base\Application::controllerMap|controllerMap]] -Данное свойство позволяет вам задавать соответствия(mapping) между ID контроллера и произвольным классом контроллера. По-умолчанию, Yii задает соответствие между ID контроллера и его классом согласно данному [соглашению](#controllerNamespace) (таким образом, ID `post` будет соответствовать `app\controllers\PostController` ). Задавая эти свойства вы можете переопределить соответствия для необходимых контроллеров. В приведенном ниже примере, `account` будет соответствовать контроллеру `app\controllers\UserController`, в то время как `article` будет соответствовать контроллеру `app\controllers\PostController`. +Данное свойство позволяет вам задавать соответствия(mapping) между ID контроллера и произвольным классом контроллера. +По-умолчанию, Yii задает соответствие между ID контроллера и его классом согласно данному [соглашению](#controllerNamespace) +(таким образом, ID `post` будет соответствовать `app\controllers\PostController` ). Задавая эти свойства вы можете +переопределить соответствия для необходимых контроллеров. В приведенном ниже примере, `account` будет соответствовать +контроллеру `app\controllers\UserController`, в то время как `article` будет соответствовать контроллеру +`app\controllers\PostController`. ```php [ @@ -231,7 +252,9 @@ if (YII_ENV_DEV) { Класс контроллера может также находиться в поддиректории директории, соответствующей этому пространству имен. Например, ID контроллера `admin/post`, будет соответветствовать полное имя класса контроллера `app\controllers\admin\PostController`. -Очень важно, чтобы полное имя класса контроллера могло быть использовано [автозагрузкой](concept-autoloading.md) и соответствующее пространство имен вашего контроллера соответствовало данному свойству. Иначе, Вы получите ошибку "Страница не найдена", при доступе к приложению. +Очень важно, чтобы полное имя класса контроллера могло быть использовано [автозагрузкой](concept-autoloading.md) и +соответствующее пространство имен вашего контроллера соответствовало данному свойству. Иначе, Вы получите ошибку +"Страница не найдена", при доступе к приложению. В случае, если вы хотите переопределить соответствия как описано выше, вы можете настроить свойство [controllerMap](#controllerMap). @@ -239,8 +262,8 @@ if (YII_ENV_DEV) { #### [[yii\base\Application::language|language]] Данное свойство указывает язык приложения, на котором содержимое страницы должно быть отображено конечному пользователю. -По-умолчанию значение данного свойства равно `en`, что означает "Английский". Если ваше приложение должно поддерживать несколько -языков, вы должны настроить данное свойство. +По-умолчанию значение данного свойства равно `en`, что означает "Английский". Если ваше приложение должно поддерживать +несколько языков, вы должны настроить данное свойство. Значение данного свойства определяется различными аспектами [интернационализации](tutorial-i18n.md), в том числе переводом сообщений, форматированием дат, форматированием чисел, и т. д. Например, виджет [[yii\jui\DatePicker]] @@ -569,7 +592,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; будет развиваться согласно следующему жизненному циклу: 1. Входной скрипт загружает конфигурацию приложения в качества массива; -2. Входной скрипт создает новый объект приложения: +2. Входной скрипт создаёт новый объект приложения: * Вызывается метод [[yii\base\Application::preInit()|preInit()]], который настраивает некоторые жизненно важные свойства приложения, такие как [[yii\base\Application::basePath|basePath]]; * Регистрируется [[yii\base\Application::errorHandler|обработчик ошибок]]; From 7ee00cd5b11c4c93eb92dbea2d7722563672bce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E6=96=B9=E5=AD=A4=E6=80=9D=E5=AD=90=EF=BC=88Pari?= =?UTF-8?q?s=C2=B7QianSen=EF=BC=89?= Date: Mon, 10 Nov 2014 01:05:38 +0800 Subject: [PATCH 144/144] fix the link --- docs/guide-zh-CN/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/README.md b/docs/guide-zh-CN/README.md index 31ae463..0a9d686 100644 --- a/docs/guide-zh-CN/README.md +++ b/docs/guide-zh-CN/README.md @@ -62,7 +62,7 @@ Yii 2.0 权威指南 * **已定稿** [行为(Behavior)](concept-behaviors.md) * **已定稿** [配置(Configurations)](concept-configurations.md) * **已定稿** [类自动加载(Autoloading)](concept-autoloading.md) -* **已定稿** [别名(Alias)](concept-alias.md) +* **已定稿** [别名(Alias)](concept-aliases.md) * **已定稿** [服务定位器(Service Locator)](concept-service-locator.md) * **已定稿** [依赖注入容器(DI Container)](concept-di-container.md)