Commit f47f6b82 by Nobuo Kihara

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

parents c81e20b8 afe32293
...@@ -19,7 +19,7 @@ Yii を他のフレームワークと比べるとどうか? ...@@ -19,7 +19,7 @@ Yii を他のフレームワークと比べるとどうか?
あなたが既に他のフレームワークに親しんでいる場合は、Yii を比較するとどうなるのかを知りたいと思うでしょう: あなたが既に他のフレームワークに親しんでいる場合は、Yii を比較するとどうなるのかを知りたいと思うでしょう:
- ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) デザインパターンを実装し、このパターンに基いたコードの組織化を促進しています。 - ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) デザインパターンを実装し、このパターンに基いたコードの組織化を促進しています。
- Yii は、コードはシンプルかつエレガントに書かれるべきである、という哲学を採用しています。 - Yii は、コードはシンプルかつエレガントに書かれるべきである、という哲学を採用しています。
Yii は、何らかのデザインパターンを厳密に守ることを主たる目的として大袈裟な設計をすることは、決してしようとしません。 Yii は、何らかのデザインパターンを厳密に守ることを主たる目的として大袈裟な設計をすることは、決してしようとしません。
- Yii は、検証済みで直ちに使える多数の機能を提供するフル装備のフレームワークです: - Yii は、検証済みで直ちに使える多数の機能を提供するフル装備のフレームワークです:
......
...@@ -215,7 +215,7 @@ if (YII_ENV_DEV) { ...@@ -215,7 +215,7 @@ if (YII_ENV_DEV) {
#### [[yii\base\Application::controllerMap|controllerMap]] <a name="controllerMap"></a> #### [[yii\base\Application::controllerMap|controllerMap]] <a name="controllerMap"></a>
このプロパティは、コントローラ ID を任意のコントローラクラスに割り付けることを可能にするものです。 このプロパティは、コントローラ ID を任意のコントローラクラスに割り付けることを可能にするものです。
既定では、Yii は [規約](#controllerNamespace) に基いてコントローラ ID をコントローラクラスに割り付けます 既定では、Yii は [規約](#controllerNamespace) に基いてコントローラ ID をコントローラクラスに割り付けます
(例えば、`post` という ID は `app\controllers\PostController` に割り付けられます)。 (例えば、`post` という ID は `app\controllers\PostController` に割り付けられます)。
このプロパティを構成することによって、特定のコントローラに対する規約を破ることが出来ます。 このプロパティを構成することによって、特定のコントローラに対する規約を破ることが出来ます。
下記の例では、`account` は `app\controllers\UserController` に割り付けられ、 下記の例では、`account` は `app\controllers\UserController` に割り付けられ、
...@@ -511,7 +511,7 @@ Yii リリースに含まれているコアコマンドを有効にすべきか ...@@ -511,7 +511,7 @@ Yii リリースに含まれているコアコマンドを有効にすべきか
このイベントがトリガされるときには、アプリケーションのインスタンスは既に構成されて初期化されています。 このイベントがトリガされるときには、アプリケーションのインスタンスは既に構成されて初期化されています。
ですから、イベントメカニズムを使って、リクエスト処理のプロセスに干渉するカスタムコードを挿入するのには、ちょうど良い場所です。 ですから、イベントメカニズムを使って、リクエスト処理のプロセスに干渉するカスタムコードを挿入するのには、ちょうど良い場所です。
例えば、このイベントハンドラの中で、何らかのパラメータに基いて [[yii\base\Application::language]] プロパティを動的にセットすることが出来ます。 例えば、このイベントハンドラの中で、何らかのパラメータに基いて [[yii\base\Application::language]] プロパティを動的にセットすることが出来ます。
### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] <a name="afterRequest"></a> ### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] <a name="afterRequest"></a>
......
...@@ -450,4 +450,4 @@ class SiteController extends Controller ...@@ -450,4 +450,4 @@ class SiteController extends Controller
* リクエストデータを使って [モデル](structure-models.md) や他のサービスコンポーネントのメソッドを呼ぶことが出来る; * リクエストデータを使って [モデル](structure-models.md) や他のサービスコンポーネントのメソッドを呼ぶことが出来る;
* [ビュー](structure-views.md) を使ってレスポンスを構成することが出来る; * [ビュー](structure-views.md) を使ってレスポンスを構成することが出来る;
* リクエストデータを処理するべきではない - それは [モデル](structure-models.md) において処理されるべきである; * リクエストデータを処理するべきではない - それは [モデル](structure-models.md) において処理されるべきである;
* HTML を埋め込むなどの表示に関わるコードは避けるべきである - それは [views](structure-views.md) で行う方が良い。 * HTML を埋め込むなどの表示に関わるコードは避けるべきである - それは [ビュー](structure-views.md) で行う方が良い。
...@@ -29,7 +29,7 @@ if ($this->beginCache($id)) { ...@@ -29,7 +29,7 @@ if ($this->beginCache($id)) {
### Срок хранения <a name="duration"></a> ### Срок хранения <a name="duration"></a>
Наверное, наиболее часто используемым параметром является [[yii\widgets\FragmentCache::duration|duration]]. Наверное, наиболее часто используемым параметром является [[yii\widgets\FragmentCache::duration|duration]].
Он определяет какое количество секунд содержимое будет оставаться действительным (корректным). Следующий код помещает фрагмент в кэш не более, чем на час:: Он определяет какое количество секунд содержимое будет оставаться действительным (корректным). Следующий код помещает фрагмент в кэш не более, чем на час:
```php ```php
if ($this->beginCache($id, ['duration' => 3600])) { if ($this->beginCache($id, ['duration' => 3600])) {
...@@ -83,7 +83,7 @@ if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) { ...@@ -83,7 +83,7 @@ if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) {
### Переключение кэширования <a name="toggling-caching"></a> ### Переключение кэширования <a name="toggling-caching"></a>
Иногда может потребоваться включать кеширование фрагментов только для определённых условий. Например, страницу с формой мы хотим кэшировать только тогда, когда обращение к ней произошло впервые (посредством GET запроса). Любое последующее отображение формы (посредством POST запроса) не должно быть кэшировано, потому что может содержать данные, введённые пользователем. Для этого мы задаём параметр [[yii\widgets\FragmentCache::enabled|enabled]]: Иногда может потребоваться включать кэширование фрагментов только для определённых условий. Например, страницу с формой мы хотим кэшировать только тогда, когда обращение к ней произошло впервые (посредством GET запроса). Любое последующее отображение формы (посредством POST запроса) не должно быть кэшировано, потому что может содержать данные, введённые пользователем. Для этого мы задаём параметр [[yii\widgets\FragmentCache::enabled|enabled]]:
```php ```php
if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) { if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) {
...@@ -117,7 +117,7 @@ if ($this->beginCache($id1)) { ...@@ -117,7 +117,7 @@ if ($this->beginCache($id1)) {
} }
``` ```
Параметры кэширования могут быть различными для вложенных кэшей. Например, внутренний и внешний кэши в вышеприведённом примере могут иметь разные сроки хранения. Даже когда данные внешнего кэша уже не являются актуальными, внутренний кеш может содержать актуальный фрагмент. Тем не менее, обратное не верно. Если внешний кэш актуален, данные будут отдаваться из него даже если внутренний кэш содержит устаревшие данные. Следует проявлять осторожность при выставлении срока хранения и задания зависимостей для вложенных кэшей. В противном случае вы можете получить устаревшие данные. Параметры кэширования могут быть различными для вложенных кэшей. Например, внутренний и внешний кэши в вышеприведённом примере могут иметь разные сроки хранения. Даже когда данные внешнего кэша уже не являются актуальными, внутренний кэш может содержать актуальный фрагмент. Тем не менее, обратное не верно. Если внешний кэш актуален, данные будут отдаваться из него даже если внутренний кэш содержит устаревшие данные. Следует проявлять осторожность при выставлении срока хранения и задания зависимостей для вложенных кэшей. В противном случае вы можете получить устаревшие данные.
## Динамическое содержимое <a name="dynamic-content"></a> ## Динамическое содержимое <a name="dynamic-content"></a>
......
...@@ -104,7 +104,7 @@ Cache-Control: public, max-age=3600 ...@@ -104,7 +104,7 @@ Cache-Control: public, max-age=3600
## Ограничитель кэша сессий <a name="session-cache-limiter"></a> ## Ограничитель кэша сессий <a name="session-cache-limiter"></a>
Когда на странице используются сессии, 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)
для объяснения этих значений. для объяснения этих значений.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
================= =================
Кэширование страниц — это кэширование всего содержимого страницы на стороне сервера. Позже, когда эта страница Кэширование страниц — это кэширование всего содержимого страницы на стороне сервера. Позже, когда эта страница
будет снова запрошена, сервер вернет её из кэша вместо того что бы генерировать её заново. будет снова запрошена, сервер вернет её из кэша вместо того чтобы генерировать её заново.
Кэширование страниц осуществляется при помощи [фильтра действия](structure-filters.md) [[yii\filters\PageCache]] и Кэширование страниц осуществляется при помощи [фильтра действия](structure-filters.md) [[yii\filters\PageCache]] и
может быть использовано в классе контроллера следующим образом: может быть использовано в классе контроллера следующим образом:
...@@ -27,7 +27,7 @@ public function behaviors() ...@@ -27,7 +27,7 @@ public function behaviors()
} }
``` ```
Приведённый код задействует кэширование только для действия `index`. Содержимое страницы кешируется максимум на 60 секунд Приведённый код задействует кэширование только для действия `index`. Содержимое страницы кэшируется максимум на 60 секунд
и варьируется в зависимости от текущего языка приложения. Кэшированная страница должна быть признана просроченной, если и варьируется в зависимости от текущего языка приложения. Кэшированная страница должна быть признана просроченной, если
общее количество постов изменилось. общее количество постов изменилось.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
======== ========
Настройки широко используются в Yii при создании новых объектов или при инициализации уже существующих объектов. Настройки широко используются в Yii при создании новых объектов или при инициализации уже существующих объектов.
Обычно настройки включают в себя названия классов создаваемых объектов и список первоначальных значений Обычно настройки включают в себя названия классов создаваемых объектов и список первоначальных значений,
которые должны быть присвоены [свойствам](concept-properties.md) объекта. Также в настройках можно указать список которые должны быть присвоены [свойствам](concept-properties.md) объекта. Также в настройках можно указать список
[обработчиков событий](concept-events.md) объекта, и/или список [поведений](concept-behaviors.md) объекта. [обработчиков событий](concept-events.md) объекта, и/или список [поведений](concept-behaviors.md) объекта.
......
...@@ -98,7 +98,7 @@ $container = new \yii\di\Container; ...@@ -98,7 +98,7 @@ $container = new \yii\di\Container;
// регистрация имени класса, как есть. это может быть пропущено. // регистрация имени класса, как есть. это может быть пропущено.
$container->set('yii\db\Connection'); $container->set('yii\db\Connection');
// регистраци интерфейса // регистрация интерфейса
// Когда класс зависит от интерфейса, соответствующий класс // Когда класс зависит от интерфейса, соответствующий класс
// будет использован в качестве зависимости объекта // будет использован в качестве зависимости объекта
$container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer'); $container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer');
...@@ -172,7 +172,7 @@ $engine = $container->get('app\components\SearchEngine', [$apiKey], ['type' => 1 ...@@ -172,7 +172,7 @@ $engine = $container->get('app\components\SearchEngine', [$apiKey], ['type' => 1
``` ```
За кулисами, контейнер внедрения зависимостей делает гораздо больше работы, чем просто создание нового объекта. За кулисами, контейнер внедрения зависимостей делает гораздо больше работы, чем просто создание нового объекта.
Прежде всего, контейнер, осмотрит конструктор класса, что бы узнать имя зависимого класса или интерфейса, а затем автоматически разрешит эти зависимости рекурсивно. Прежде всего, контейнер, осмотрит конструктор класса, чтобы узнать имя зависимого класса или интерфейса, а затем автоматически разрешит эти зависимости рекурсивно.
Следующий код демонстрирует более сложный пример. Класс `UserLister` зависит от объекта, реализующего интерфейс `UserFinderInterface`; класс `UserFinder` реализует этот интерфейс и зависит от Следующий код демонстрирует более сложный пример. Класс `UserLister` зависит от объекта, реализующего интерфейс `UserFinderInterface`; класс `UserFinder` реализует этот интерфейс и зависит от
объекта `Connection`. Все эти зависимости были объявлены через тип подсказки параметров конструктора класса. объекта `Connection`. Все эти зависимости были объявлены через тип подсказки параметров конструктора класса.
...@@ -240,7 +240,7 @@ $lister = new UserLister($finder); ...@@ -240,7 +240,7 @@ $lister = new UserLister($finder);
Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md) Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md)
вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]], вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]],
метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], что бы создать новый объект. метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], чтобы создать новый объект.
Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект. Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект.
Поскольку Yii использует [[Yii::createObject()]] в большей части кода своего ядра для создания новых объектов, это означает, Поскольку Yii использует [[Yii::createObject()]] в большей части кода своего ядра для создания новых объектов, это означает,
что вы можете настроить глобальные объекты, имея дело с [[Yii::$container]]. что вы можете настроить глобальные объекты, имея дело с [[Yii::$container]].
...@@ -307,7 +307,7 @@ class HotelController extends Controller ...@@ -307,7 +307,7 @@ class HotelController extends Controller
Итог <a name="summary"></a> Итог <a name="summary"></a>
------- -------
Как dependency injection, так и [service locator](concept-service-locator.md) являются популярными паттернами проектирования, которые позволяют Как dependency injection, так и [service locator](concept-service-locator.md) являются популярными паттернами проектирования, которые позволяют
создавать программное обеспечение в слабосвязаной и более тестируемой манере. создавать программное обеспечение в слабосвязанной и более тестируемой манере.
Мы настоятельно рекомендуем к прочтению Мы настоятельно рекомендуем к прочтению
[статью Мартина Фаулера](http://martinfowler.com/articles/injection.html), для более глубокого понимания dependency injection и service locator. [статью Мартина Фаулера](http://martinfowler.com/articles/injection.html), для более глубокого понимания dependency injection и service locator.
......
...@@ -445,7 +445,7 @@ Yii 2.0 осуществляет жадную загрузку связи не ...@@ -445,7 +445,7 @@ Yii 2.0 осуществляет жадную загрузку связи не
$customers = Customer::find()->asArray()->all(); $customers = Customer::find()->asArray()->all();
``` ```
Ещё одно изменение связано с тем, что вы больше не можете определять значения по-умолчанию через public свойства. Ещё одно изменение связано с тем, что вы больше не можете определять значения по умолчанию через public свойства.
Вы должны установить их в методе `init` вашего класса, если это требуется. Вы должны установить их в методе `init` вашего класса, если это требуется.
```php ```php
......
...@@ -10,7 +10,7 @@ Yii – это высокопроизводительный компонентн ...@@ -10,7 +10,7 @@ Yii – это высокопроизводительный компонентн
------------------------------------------ ------------------------------------------
Yii – это универсальный фреймворк и может быть задействован во всех типах веб приложений. Благодаря его компонентной Yii – это универсальный фреймворк и может быть задействован во всех типах веб приложений. Благодаря его компонентной
структуре и отличной поддержке кеширования, фреймворк особенно подходит для разработки таких крупных проектов как структуре и отличной поддержке кэширования, фреймворк особенно подходит для разработки таких крупных проектов как
порталы, форумы, CMS, магазины или RESTful-приложения. порталы, форумы, CMS, магазины или RESTful-приложения.
...@@ -23,7 +23,7 @@ Yii – это универсальный фреймворк и может бы ...@@ -23,7 +23,7 @@ Yii – это универсальный фреймворк и может бы
- Yii придерживается философии простого и элегантного кода не пытаясь усложнять дизайн только ради следования каким-либо - Yii придерживается философии простого и элегантного кода не пытаясь усложнять дизайн только ради следования каким-либо
шаблонам проектирования. шаблонам проектирования.
- Yii является full-stack фреймворком и включает в себя проверенные и хорошо зарекомендовавшие себя возможности, такие как - Yii является full-stack фреймворком и включает в себя проверенные и хорошо зарекомендовавшие себя возможности, такие как
ActiveRecord для реляционных и NoSQL баз данных, поддержку REST API, многоуровневое кеширование и другие. ActiveRecord для реляционных и NoSQL баз данных, поддержку REST API, многоуровневое кэширование и другие.
- Yii отлично расширяем. Вы можете настроить или заменить практически любую часть основного кода. Используя архитектуру расширений легко делиться кодом или использовать код сообщества. - Yii отлично расширяем. Вы можете настроить или заменить практически любую часть основного кода. Используя архитектуру расширений легко делиться кодом или использовать код сообщества.
- Одна из главных целей Yii – производительность. - Одна из главных целей Yii – производительность.
......
...@@ -5,7 +5,7 @@ Yii включает полноценный набор средств для у ...@@ -5,7 +5,7 @@ Yii включает полноценный набор средств для у
В частности это следующие возможности: В частности это следующие возможности:
* Быстрое создание прототипов с поддержкой распространенных API к [Active Record](db-active-record.md); * Быстрое создание прототипов с поддержкой распространенных API к [Active Record](db-active-record.md);
* Настройка формата ответа (JSON и XML реализованы по-умолчанию); * Настройка формата ответа (JSON и XML реализованы по умолчанию);
* Получение сериализованных объектов с нужной вам выборкой полей; * Получение сериализованных объектов с нужной вам выборкой полей;
* Надлежащее форматирование данных и ошибок при их валидации; * Надлежащее форматирование данных и ошибок при их валидации;
* Поддержка [HATEOAS](http://en.wikipedia.org/wiki/HATEOAS); * Поддержка [HATEOAS](http://en.wikipedia.org/wiki/HATEOAS);
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
Вы можете использовать два столбца в таблице user для хранения количества разрешённых запросов и времени последней проверки. Вы можете использовать два столбца в таблице user для хранения количества разрешённых запросов и времени последней проверки.
В методах `loadAllowance()` и `saveAllowance()` можно реализовать чтение и сохранение значений этих столбцов в соответствии В методах `loadAllowance()` и `saveAllowance()` можно реализовать чтение и сохранение значений этих столбцов в соответствии
с данными текущего аутентифицированного пользователя. Для улучшения производительности можно попробовать хранить эту с данными текущего аутентифицированного пользователя. Для улучшения производительности можно попробовать хранить эту
информацию в кеше или NoSQL хранилище. информацию в кэше или NoSQL хранилище.
Как только соответствующий интерфейс будет реализован в классе identity, Yii начнёт автоматически проверять ограничения Как только соответствующий интерфейс будет реализован в классе identity, Yii начнёт автоматически проверять ограничения
частоты запросов при помощи [[yii\filters\RateLimiter]], фильтра действий для [[yii\rest\Controller]]. При превышении частоты запросов при помощи [[yii\filters\RateLimiter]], фильтра действий для [[yii\rest\Controller]]. При превышении
......
...@@ -26,7 +26,7 @@ RESTful API строятся вокруг доступа к *ресурсам* ...@@ -26,7 +26,7 @@ RESTful API строятся вокруг доступа к *ресурсам*
Вы можете указать какие данные включать в представление ресурса в виде массива путём переопределения методов Вы можете указать какие данные включать в представление ресурса в виде массива путём переопределения методов
[[yii\base\Model::fields()|fields()]] и/или [[yii\base\Model::extraFields()|extraFields()]]. Разница между ними в том, [[yii\base\Model::fields()|fields()]] и/или [[yii\base\Model::extraFields()|extraFields()]]. Разница между ними в том,
что первый определяет набор полей которые всегда будут включены в массив, а второй определяет дополнительные поля, которые что первый определяет набор полей, которые всегда будут включены в массив, а второй определяет дополнительные поля, которые
пользователь может запросить через параметр `expand`: пользователь может запросить через параметр `expand`:
``` ```
......
...@@ -85,7 +85,7 @@ Url::previous(); // получить ранее сохраненный URL ...@@ -85,7 +85,7 @@ Url::previous(); // получить ранее сохраненный URL
>**Совет**: чтобы сгенерировать URL с хэштэгом, например `/index.php?r=site/page&id=100#title`, укажите параметр `#` в хелпере таким образом: >**Совет**: чтобы сгенерировать URL с хэштэгом, например `/index.php?r=site/page&id=100#title`, укажите параметр `#` в хелпере таким образом:
`Url::to(['post/read', '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 ```php
......
...@@ -34,7 +34,7 @@ basic/ корневой каталог приложения ...@@ -34,7 +34,7 @@ basic/ корневой каталог приложения
commands/ содержит классы консольных команд commands/ содержит классы консольных команд
controllers/ контроллеры controllers/ контроллеры
models/ модели models/ модели
runtime/ файлы, которые генерирует Yii во время выполнения приложения (логи, кеш и т.п.) runtime/ файлы, которые генерирует Yii во время выполнения приложения (логи, кэш и т.п.)
vendor/ содержит пакеты Composer'а и, собственно, сам фреймворк Yii vendor/ содержит пакеты Composer'а и, собственно, сам фреймворк Yii
views/ виды приложения views/ виды приложения
web/ корневая директория Web приложения. Содержит файлы, доступные через Web web/ корневая директория Web приложения. Содержит файлы, доступные через Web
......
...@@ -50,14 +50,14 @@ ...@@ -50,14 +50,14 @@
## Встроенные компоненты приложения <a name="core-application-components"></a> ## Встроенные компоненты приложения <a name="core-application-components"></a>
В Yii есть несколько *встроенных* компонентов приложения, с фиксированными ID и конфигурациями по-умолчанию. Например, В Yii есть несколько *встроенных* компонентов приложения, с фиксированными ID и конфигурациями по умолчанию. Например,
компонент [[yii\web\Application::request|request]] используется для сбора информации о запросе пользователя и разбора его в компонент [[yii\web\Application::request|request]] используется для сбора информации о запросе пользователя и разбора его в
определенный [маршрут](runtime-routing.md); компонент [[yii\base\Application::db|db]] представляет собой соединение с базой данных, определенный [маршрут](runtime-routing.md); компонент [[yii\base\Application::db|db]] представляет собой соединение с базой данных,
через которое вы можете выполнять запросы. Именно с помощью этих встроенных компонентов Yii приложения могут обработать через которое вы можете выполнять запросы. Именно с помощью этих встроенных компонентов Yii приложения могут обработать
запрос пользователя. запрос пользователя.
Ниже представлен список встроенных компонентов приложения. Вы можете конфигурировать их также как и другие компоненты приложения. Ниже представлен список встроенных компонентов приложения. Вы можете конфигурировать их также как и другие компоненты приложения.
Когда вы конфигурируете встроенный компонент приложения и не указываете класс этого компонента, то значение по-умолчанию будет использовано. Когда вы конфигурируете встроенный компонент приложения и не указываете класс этого компонента, то значение по умолчанию будет использовано.
* [[yii\web\AssetManager|assetManager]]: используется для управления и опубликования ресурсов приложения. * [[yii\web\AssetManager|assetManager]]: используется для управления и опубликования ресурсов приложения.
Более детальная информация представлена в разделе [Ресурсы](output-assets.md); Более детальная информация представлена в разделе [Ресурсы](output-assets.md);
......
...@@ -130,7 +130,7 @@ ID контроллеров также могут содержать префи ...@@ -130,7 +130,7 @@ ID контроллеров также могут содержать префи
* Добавить в начало [[yii\base\Application::controllerNamespace|пространство имен контроллеров]]. * Добавить в начало [[yii\base\Application::controllerNamespace|пространство имен контроллеров]].
Ниже приведены несколько примеров, с учетом того, что [[yii\base\Application::controllerNamespace|пространство имен контроллеров]] Ниже приведены несколько примеров, с учетом того, что [[yii\base\Application::controllerNamespace|пространство имен контроллеров]]
имеет значение по-умолчанию равное `app\controllers`: имеет значение по умолчанию равное `app\controllers`:
* `article` соответствует `app\controllers\ArticleController`; * `article` соответствует `app\controllers\ArticleController`;
* `post-comment` соответствует `app\controllers\PostCommentController`; * `post-comment` соответствует `app\controllers\PostCommentController`;
...@@ -172,14 +172,14 @@ ID контроллеров также могут содержать префи ...@@ -172,14 +172,14 @@ ID контроллеров также могут содержать префи
] ]
``` ```
### Контроллер по-умолчанию <a name="default-controller"></a> ### Контроллер по умолчанию <a name="default-controller"></a>
Каждое приложение имеет контроллер по-умолчанию, указанный через свойство [[yii\base\Application::defaultRoute]]. Каждое приложение имеет контроллер по умолчанию, указанный через свойство [[yii\base\Application::defaultRoute]].
Когда в запросе не указан [маршрут](#ids-routes), тогда будет использован маршрут указанный в данном свойстве. Когда в запросе не указан [маршрут](#ids-routes), тогда будет использован маршрут указанный в данном свойстве.
Для [[yii\web\Application|Веб приложений]], это значение `'site'`, в то время как для [[yii\console\Application|консольных приложений]], Для [[yii\web\Application|Веб приложений]], это значение `'site'`, в то время как для [[yii\console\Application|консольных приложений]],
это `'help'`. Таким образом, если задан URL `http://hostname/index.php`, это означает, что контроллер `site` выполнит обработку запроса. это `'help'`. Таким образом, если задан URL `http://hostname/index.php`, это означает, что контроллер `site` выполнит обработку запроса.
Вы можете изменить контроллер по-умолчанию следующим образом в [настройках приложения](structure-applications.md#application-configurations): Вы можете изменить контроллер по умолчанию следующим образом в [настройках приложения](structure-applications.md#application-configurations):
```php ```php
[ [
...@@ -375,10 +375,10 @@ public function actionView(array $id, $version = null) ...@@ -375,10 +375,10 @@ public function actionView(array $id, $version = null)
о параметрах консольных приложений представлено в секции [Консольные команды](tutorial-console.md). о параметрах консольных приложений представлено в секции [Консольные команды](tutorial-console.md).
### Действие по-умолчанию <a name="default-action"></a> ### Действие по умолчанию <a name="default-action"></a>
Каждый контроллер имеет действие, указанное через свойство [[yii\base\Controller::defaultAction]]. Каждый контроллер имеет действие, указанное через свойство [[yii\base\Controller::defaultAction]].
Когда [маршрут](#ids-routes) содержит только ID контроллера, то подразумевается, что действие контроллера по-умолчанию Когда [маршрут](#ids-routes) содержит только ID контроллера, то подразумевается, что действие контроллера по умолчанию
было запрошено. было запрошено.
По-умолчанию, это действие имеет значение `index`. Если вы хотите изменить это значение, просто переопределите данное По-умолчанию, это действие имеет значение `index`. Если вы хотите изменить это значение, просто переопределите данное
...@@ -409,7 +409,7 @@ class SiteController extends Controller ...@@ -409,7 +409,7 @@ class SiteController extends Controller
1. Метод [[yii\base\Controller::init()]] будет вызван после того как контроллер будет создан и сконфигурирован; 1. Метод [[yii\base\Controller::init()]] будет вызван после того как контроллер будет создан и сконфигурирован;
2. Контроллер создает объект действия, основываясь на запрошенном ID действия: 2. Контроллер создает объект действия, основываясь на запрошенном ID действия:
* Если ID действия не указан, то будет использовано [[yii\base\Controller::defaultAction|ID действия по-умолчанию]]; * Если ID действия не указан, то будет использовано [[yii\base\Controller::defaultAction|ID действия по умолчанию]];
* Если ID действия найдено в [[yii\base\Controller::actions()|карте действий]], то отдельное действие будет создано; * Если ID действия найдено в [[yii\base\Controller::actions()|карте действий]], то отдельное действие будет создано;
* Если ID действия соответствует методу действия, то встроенное действие будет создано; * Если ID действия соответствует методу действия, то встроенное действие будет создано;
* В противном случае, будет выброшено исключение [[yii\base\InvalidRouteException]]. * В противном случае, будет выброшено исключение [[yii\base\InvalidRouteException]].
......
...@@ -239,7 +239,7 @@ ID контроллера: <?= $this->context->id ?> ...@@ -239,7 +239,7 @@ ID контроллера: <?= $this->context->id ?>
### Передача данных между видами <a name="sharing-data-among-views"></a> ### Передача данных между видами <a name="sharing-data-among-views"></a>
[[yii\base\View|Компонент вида]] имеет свойство [[yii\base\View::params|params]] , которое вы можете использовать для обмена данными между видами. [[yii\base\View|Компонент вида]] имеет свойство [[yii\base\View::params|params]], которое вы можете использовать для обмена данными между видами.
Например, в виде `about` вы можете указать текущий сегмент хлебных крошек с помощью следующего кода. Например, в виде `about` вы можете указать текущий сегмент хлебных крошек с помощью следующего кода.
...@@ -298,7 +298,7 @@ use yii\helpers\Html; ...@@ -298,7 +298,7 @@ use yii\helpers\Html;
Большинство шаблонов вызывают методы, аналогично тому, как это сделано в примере выше, чтобы скрипты и тэги, зарегистированные в других местах приложения могли быть правильно отображены в местах вызова (например, в шаблоне). Большинство шаблонов вызывают методы, аналогично тому, как это сделано в примере выше, чтобы скрипты и тэги, зарегистированные в других местах приложения могли быть правильно отображены в местах вызова (например, в шаблоне).
- [[yii\base\View::beginPage()|beginPage()]]: Этот метод нужно вызывать в самом начале шаблона. - [[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::endPage()|endPage()]]: Этот метод нужно вызывать в конце страницы.
Он вызывает событие [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] . Оно указывает на обработку конца страницы. Он вызывает событие [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] . Оно указывает на обработку конца страницы.
- [[yii\web\View::head()|head()]]: Этот метод нужно вызывать в `<head>` секции страницы html. - [[yii\web\View::head()|head()]]: Этот метод нужно вызывать в `<head>` секции страницы html.
...@@ -320,7 +320,7 @@ use yii\helpers\Html; ...@@ -320,7 +320,7 @@ use yii\helpers\Html;
### Использование шаблонов <a name="using-layouts"></a> ### Использование шаблонов <a name="using-layouts"></a>
Как было описано в секции [Рендеринг в контроллерах](#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]]. Вы можете использовать разные шаблоны, конфигурируя [[yii\base\Application::layout]] или [[yii\base\Controller::layout]].
Первый переопределяет шаблон, который используется по умолчанию всеми контроллерами, а второй переопределяет шаблон в отдельном контроллере. Первый переопределяет шаблон, который используется по умолчанию всеми контроллерами, а второй переопределяет шаблон в отдельном контроллере.
...@@ -391,7 +391,7 @@ Yii определяет какой шаблон использовать для ...@@ -391,7 +391,7 @@ Yii определяет какой шаблон использовать для
Например, вы определяете (записываете) блок в виде и отображаете его в шаблоне. Например, вы определяете (записываете) блок в виде и отображаете его в шаблоне.
Для определения блока вызываются методы [[yii\base\View::beginBlock()|beginBlock()]] и [[yii\base\View::endBlock()|endBlock()]]. Для определения блока вызываются методы [[yii\base\View::beginBlock()|beginBlock()]] и [[yii\base\View::endBlock()|endBlock()]].
После определения, блок доступен через `$view->blocks[$blockID]` , где `$blockID` - это уникальный ID, который вы присваиваете блоку После определения, блок доступен через `$view->blocks[$blockID]`, где `$blockID` - это уникальный ID, который вы присваиваете блоку
в начале определения. в начале определения.
В примере ниже показано, как можно использовать блоки, определенные в виде, чтобы динамически изменять фрагменты шаблона. В примере ниже показано, как можно использовать блоки, определенные в виде, чтобы динамически изменять фрагменты шаблона.
......
...@@ -108,7 +108,7 @@ class HelloWidget extends Widget ...@@ -108,7 +108,7 @@ class HelloWidget extends Widget
} }
``` ```
Для того, что бы использовать этот виджет, достаточно добавить в представление следующий код: Для того, чтобы использовать этот виджет, достаточно добавить в представление следующий код:
```php ```php
<?php <?php
...@@ -177,7 +177,7 @@ public function run() ...@@ -177,7 +177,7 @@ public function run()
По умолчанию, файлы представлений виджетов должны находиться в директории `WidgetPath/views`, где `WidgetPath` - По умолчанию, файлы представлений виджетов должны находиться в директории `WidgetPath/views`, где `WidgetPath` -
директория, содержащая файл класса виджета. Таким образом, в приведенном выше примере, для виджета будет директория, содержащая файл класса виджета. Таким образом, в приведенном выше примере, для виджета будет
использован файл представления `@app/components/views/hello.php`, при этом файл с классом виджета расположен в использован файл представления `@app/components/views/hello.php`, при этом файл с классом виджета расположен в
`@app/components`. Для того, что бы изменить директорию, в которой содержатся файлы-представления для виджета, `@app/components`. Для того, чтобы изменить директорию, в которой содержатся файлы-представления для виджета,
следует переопределить метод [[yii\base\Widget::getViewPath()]]. следует переопределить метод [[yii\base\Widget::getViewPath()]].
......
...@@ -238,7 +238,7 @@ function foo($model, $attribute) { ...@@ -238,7 +238,7 @@ function foo($model, $attribute) {
строка, содержащая имена файловых расширений, разделенных пробелом или запятой (пр.: "gif, jpg"). строка, содержащая имена файловых расширений, разделенных пробелом или запятой (пр.: "gif, jpg").
Имя расширения не чувствительно к регистру. По умолчанию - null, что значит, что все имена файловых расширений Имя расширения не чувствительно к регистру. По умолчанию - null, что значит, что все имена файловых расширений
допустимы. допустимы.
- `mimeTypes`: список MIME-типов которые допустимы для загрузки. Это может быть или массив, или строка, - `mimeTypes`: список MIME-типов, которые допустимы для загрузки. Это может быть или массив, или строка,
содержащая MIME-типы файлов, разделенные пробелом или запятой (пример: "image/jpeg, image/png"). содержащая MIME-типы файлов, разделенные пробелом или запятой (пример: "image/jpeg, image/png").
Имена mime-типов не чувствительны к регистру. По умолчанию - null, что значит, что допустимы все MIME-типы. Имена mime-типов не чувствительны к регистру. По умолчанию - null, что значит, что допустимы все MIME-типы.
- `minSize`: минимальный размер файла в байтах, разрешенный для загрузки. По умолчанию - null, что значит, что нет - `minSize`: минимальный размер файла в байтах, разрешенный для загрузки. По умолчанию - null, что значит, что нет
......
...@@ -389,7 +389,6 @@ $width = \Yii::$app->params['thumbnail.size'][0]; ...@@ -389,7 +389,6 @@ $width = \Yii::$app->params['thumbnail.size'][0];
如果 [视图路径](#viewPath) 使用默认值,默认的布局路径别名为`@app/views/layouts`。 如果 [视图路径](#viewPath) 使用默认值,默认的布局路径别名为`@app/views/layouts`。
该属性需要配置成一个目录或 路径 [别名](concept-aliases.md)。 该属性需要配置成一个目录或 路径 [别名](concept-aliases.md)。
You may configure it as a directory or a path [alias](concept-aliases.md).
#### [[yii\base\Application::runtimePath|runtimePath]] <a name="runtimePath"></a> #### [[yii\base\Application::runtimePath|runtimePath]] <a name="runtimePath"></a>
......
...@@ -283,7 +283,7 @@ class HelloWorldAction extends Action ...@@ -283,7 +283,7 @@ class HelloWorldAction extends Action
### 操作结果 <a name="action-results"></a> ### 操作结果 <a name="action-results"></a>
操作方法或独立操作的`run()`方法的返回值非常中药,它表示对应操作结果。 操作方法或独立操作的`run()`方法的返回值非常重要,它表示对应操作结果。
返回值可为 [响应](runtime-responses.md) 对象,作为响应发送给终端用户。 返回值可为 [响应](runtime-responses.md) 对象,作为响应发送给终端用户。
...@@ -378,8 +378,7 @@ class SiteController extends Controller ...@@ -378,8 +378,7 @@ class SiteController extends Controller
## 控制器生命周期 <a name="controller-lifecycle"></a> ## 控制器生命周期 <a name="controller-lifecycle"></a>
处理一个请求时,[应用主体](structure-applications.md) 会根据请求[路由](#routes)创建一个控制器,will create a controller 处理一个请求时,[应用主体](structure-applications.md) 会根据请求[路由](#routes)创建一个控制器,控制器经过以下生命周期来完成请求:
控制器经过以下生命周期来完成请求:
1. 在控制器创建和配置后,[[yii\base\Controller::init()]] 方法会被调用。 1. 在控制器创建和配置后,[[yii\base\Controller::init()]] 方法会被调用。
2. 控制器根据请求操作ID创建一个操作对象: 2. 控制器根据请求操作ID创建一个操作对象:
......
...@@ -113,7 +113,7 @@ echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2014-10-06 ...@@ -113,7 +113,7 @@ echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2014-10-06
### Time zones <a name="time-zones"></a> ### Time zones <a name="time-zones"></a>
When formatting date and time values, Yii will convert them to the [[yii\i18n\Formatter::timeZone|configured time zone]]. 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. 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: 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:
......
...@@ -6,7 +6,7 @@ be used. Therefore, each request should come with some sort of authentication cr ...@@ -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 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 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 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: There are different ways to send an access token:
......
...@@ -71,8 +71,8 @@ public function fields() ...@@ -71,8 +71,8 @@ public function fields()
// field name is "email", the corresponding attribute name is "email_address" // field name is "email", the corresponding attribute name is "email_address"
'email' => 'email_address', 'email' => 'email_address',
// field name is "name", its value is defined by a PHP callback // field name is "name", its value is defined by a PHP callback
'name' => function () { 'name' => function ($model) {
return $this->first_name . ' ' . $this->last_name; return $model->first_name . ' ' . $model->last_name;
}, },
]; ];
} }
......
...@@ -493,7 +493,7 @@ In summary, models ...@@ -493,7 +493,7 @@ In summary, models
You may usually consider the last recommendation above when you are developing large complex systems. 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 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 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: you may take the following strategy:
* Define a set of base model classes that are shared by different [applications](structure-applications.md) or * Define a set of base model classes that are shared by different [applications](structure-applications.md) or
......
...@@ -42,7 +42,7 @@ and rendering this view template. ...@@ -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 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) 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 > 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. be recognized by IDEs. It is also a good way of documenting your views.
......
...@@ -52,8 +52,8 @@ interface Arrayable ...@@ -52,8 +52,8 @@ interface Arrayable
* 'email', * 'email',
* 'firstName' => 'first_name', * 'firstName' => 'first_name',
* 'lastName' => 'last_name', * 'lastName' => 'last_name',
* 'fullName' => function () { * 'fullName' => function ($model) {
* return $this->first_name . ' ' . $this->last_name; * return $model->first_name . ' ' . $model->last_name;
* }, * },
* ]; * ];
* ``` * ```
......
...@@ -841,8 +841,8 @@ class Model extends Component implements IteratorAggregate, ArrayAccess, Arrayab ...@@ -841,8 +841,8 @@ class Model extends Component implements IteratorAggregate, ArrayAccess, Arrayab
* 'email', * 'email',
* 'firstName' => 'first_name', * 'firstName' => 'first_name',
* 'lastName' => 'last_name', * 'lastName' => 'last_name',
* 'fullName' => function () { * 'fullName' => function ($model) {
* return $this->first_name . ' ' . $this->last_name; * return $model->first_name . ' ' . $model->last_name;
* }, * },
* ]; * ];
* ``` * ```
......
...@@ -408,7 +408,7 @@ abstract class BaseMigrateController extends Controller ...@@ -408,7 +408,7 @@ abstract class BaseMigrateController extends Controller
* ~~~ * ~~~
* *
* @param integer $limit the maximum number of new migrations to be displayed. * @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 * @throws \yii\console\Exception if invalid limit value passed
*/ */
public function actionNew($limit = 10) public function actionNew($limit = 10)
...@@ -642,4 +642,4 @@ abstract class BaseMigrateController extends Controller ...@@ -642,4 +642,4 @@ abstract class BaseMigrateController extends Controller
* @param string $version migration version name. * @param string $version migration version name.
*/ */
abstract protected function removeMigrationHistory($version); abstract protected function removeMigrationHistory($version);
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment