Commit fe71bc38 by Alexander Makarov

Edited Russian guide sections about caching and autoloading

parent 229b7581
Кэширование
=======
==========
Кэширование — это простой и эффективный способ повысить производительность веб-приложения. Сохраняя относительно
статичные данные в кэше и извлекая их из кэша, когда потребуется, мы экономим время, затрачиваемое на генерацию
данных с нуля каждый раз.
Кэширование может использоваться на различных уровнях веб-приложения. На стороне сервера, на более низшем уровне мы
используем кэширование для хранения основных данных, таких как список последних статьей запрашиваемых из базы данных;
и на более высоком уровне, кэш может использоваться для хранения фрагментов или целых веб-страниц, например как результат
рендеринга последних статьей. На стороне клиента может использоваться HTTP-кэширование, чтобы сохранить содержимое
недавно посещенных страниц в кэше браузера.
Кэширование может использоваться на различных уровнях и в различных местах веб-приложения. На стороне сервера, на более
низком уровне мы используем кэширование для хранения основных данных, таких как список последних полученных из базы
данных статьей. На более высоком уровне кэш может использоваться для хранения фрагментов или целых веб-страниц. Таких,
например, как результат рендеринга последних статьей. На стороне клиента для сохранения содержимого недавно посещенных
страниц в кэше браузера может использоваться HTTP-кэширование.
Yii поддерживает все эти механизмы кэширования:
......
Кэширование страниц
============
=================
Кэширование страниц — это кэширование всего содержимого страницы на стороне сервера. Позже когда эта страница
Кэширование страниц — это кэширование всего содержимого страницы на стороне сервера. Позже, когда эта страница
будет снова запрошена, сервер вернет её из кэша вместо того что бы генерировать её заново.
Кэширование страниц осуществляется при помощи [[yii\filters\PageCache]] и [фильтра действия](structure-filters.md).
Это может быть использовано в классе контроллера как показано ниже:
Кэширование страниц осуществляется при помощи [фильтра действия](structure-filters.md) [[yii\filters\PageCache]] и
может быть использовано в классе контроллера следующим образом:
```php
public function behaviors()
......@@ -27,14 +27,14 @@ public function behaviors()
}
```
Приведенный выше код устанавливает, что кэширования страницы должно использоваться только для `index` действия; контент
этой страницы должен быть закэширован не более чем на 60 секунд и должен будет измениться на текущий язык приложения;
и эта кэшированная страница должна быть признана просроченной, если общее количество постов было изменено.
Приведённый код задействует кэширование только для действия `index`. Содержимое страницы кешируется максимум на 60 секунд
и варьируется в зависимости от текущего языка приложения. Кэшированная страница должна быть признана просроченной, если
общее количество постов изменилось.
Как вы можете видеть, кэширование страниц очень похоже на [кэширования фрагмента](caching-fragment.md). Оба этих варианта
поддерживают параметры: `duration` (продолжительность), `dependencies` (зависимости), `variations` (вариации), и `enabled`
(включения). Их главное отличие заключается в том что кэширования страницы реализована как
[фильтр действия](structure-filters.md) а кэширования фрагмента как [виджет](structure-widgets.md).
Кэширование страниц очень похоже на [кэширования фрагментов](caching-fragment.md). В обоих случаях поддерживаются параметры
`duration` (продолжительность), `dependencies` (зависимости), `variations` (вариации), и `enabled` (включен). Главное
отличие заключается в том, что кэширование страницы реализовано в виде [фильтра действия](structure-filters.md),
а кэширование фрагмента в виде [виджета](structure-widgets.md).
Вы можете использовать [кэширования фрагмента](caching-fragment.md), a также
[динамический контент](caching-fragment.md#dynamic-content) вместе с кэшированием страницы.
Вы можете использовать вместе [кэширование фрагмента](caching-fragment.md),
[динамическое содержимое](caching-fragment.md#dynamic-content) и кэширование страницы.
Псевдонимы
=======
=========
Псевдонимы используются для представления путей к файлам или для представления URL адресов с целью того, чтобы не приходилось полностью прописывать пути к файлам или полные URL адреса.
Псевдоним должен начинаться со знака '@', чтобы не перепутать его с адресом файла или с URL адресом.
Например псевдоним '@yii' указывает на папку, в которую был установлен Yii framework, а псевдоним '@web' представляет собой базовый, основной URL адрес (base URL) текущего приложения.
Псевдонимы используются для обозначения путей к файлам или URL адресов и помогают избежать использования абсолютных путей
или URL в коде. Для того, чтобы не перепутать псевдоним с обыным путём к файлу или URL, должен начинаться с `@`. В Yii
имеется множество заранее определённых псевдонимов. Например, `@yii` указывает на директорию, в которую был установлен
Yii framework, а `@web` можно использовать для получения базового URL текущего приложения.
Создание псевдонимов <a name="defining-aliases"></a>
----------------
----------------------------------------------
Для создания псевдонима пути к файлу или псевдонима какого либо URL адреса используется метод [[Yii::setAlias()]].
Пример:
Для создания псевдонима пути к файлу или URL используется метод [[Yii::setAlias()]]:
```php
// псевдоним пути к файлу
Yii::setAlias('@foo', '/path/to/foo');
// псевдоним URL адреса
// псевдоним URL
Yii::setAlias('@bar', 'http://www.example.com');
```
> Примечание: псевдоним пути к файлу или псевдоним URL адреса могут указывать на НЕСУЩЕСТВУЮЩИЙ файл или интернет ресурс.
> Примечание: псевдоним пути к файлу или URL *не* обязательно указывает на существующий файл или ресурс.
Если вы создали псевдоним пути, то из него можно вывести производный путь(не вызывая [[Yii::setAlias()]]) с помощью добавления знака '/' с последующим указанием необходимого пути. Псевдонимы, созданные с помощью [[Yii::setAlias()]] называются *корневыми псевдонимами (root aliases)*, тогда как производные псевдонимы называются *производными псевдонимами (derived aliases)*.
Например, `@foo` - это корневой псевдоним, тогда как `@foo/bar/file.php` - это производный псевдоним.
Используя уже заданный псевдоним вы можете получить на основе него новый без вызова [[Yii::setAlias()]]. Сделать это
можно добавив в его конец `/`, за которым следует один или более сегментов пути. Псевдонимы, определённые при помощи
[[Yii::setAlias()]] являются *корневыми псевдонимами*, в то время как полученные из них называются *производными
псевдонимами*. К примеру, `@foo` является корневым псевдонимом, а `@foo/bar/file.php` — производным.
Вы можете создать новый псевдоним используя ранее созданный псевдоним (независимо от того корневой он или производный):
Вы можете задать новый псевдоним используя ранее созданный псевдоним (не важно, корневой он или производный):
```php
Yii::setAlias('@foobar', '@foo/bar');
```
Корневые псевдонимы как правило создаются на этапе [предварительной загрузки (bootstrapping)](runtime-bootstrapping.md) stage.
Например вы можете вызвать [[Yii::setAlias()]] внутри [входного скрипта (entry script)](structure-entry-scripts.md).
Для удобства использования, в [приложении (Application)](structure-applications.md) предусмотрено свойство 'aliases' , в которое возможна запись, т.е. вы можете [изменить настройки](concept-configurations.md) вашего приложения как в нижеследующем примере:
Корневые псевдонимы, как правило, создаются на этапе [предварительной загрузки (bootstrapping)](runtime-bootstrapping.md).
Например, вы можете вызвать [[Yii::setAlias()]] в [входном скрипте](structure-entry-scripts.md). Для удобства, в
[приложении (Application)](structure-applications.md) предусмотрено свойство `aliases`, которое можно задать через
[конфигурацию приложения](concept-configurations.md):
```php
return [
......@@ -46,12 +49,11 @@ return [
```
Раскрытие Псевдонимов <a name="resolving-aliases"></a>
-----------------
Преобразование псевдонимов <a name="resolving-aliases"></a>
----------------------------------------------------
Метод [[Yii::getAlias()]] раскрывает корневой псевдоним в путь к файлу или в URL, который изначально был скрыт за псевдонимом.
Этот же метод используется для раскрытия производных псевдонимов в полный путь.
Пример:
Метод [[Yii::getAlias()]] преобразует корневой псевдоним в путь к файлу или URL который этот псевдоним представляет.
Этот же метод может работать и с производными псевдонимами:
```php
echo Yii::getAlias('@foo'); // выведет: /path/to/foo
......@@ -59,13 +61,13 @@ echo Yii::getAlias('@bar'); // выведет: http://www.example.
echo Yii::getAlias('@foo/bar/file.php'); // выведет: /path/to/foo/bar/file.php
```
При раскрытии производных псевдонимов происходит раскрытие корневого псевдонима, с которого начинался псевдоним.
Путь или URL, представленный производным псевдонимом определяется путём замены в нём части, соответствующей корневому
псевдониму, на соответствующий ему путь или URL.
> Примечание: Метод [[Yii::getAlias()]] не проверяет фактическое существование формируемого пути к файлу или URL адреса.
> Примечание: Метод [[Yii::getAlias()]] не проверяет фактического существования получаемого пути или URL.
Корневой псевдоним может включать в себя знаки '/'. Метод [[Yii::getAlias()]]
корректно определит какая часть ссылки является корневой.
Пример:
Корневой псевдоним может содержать знаки '/'. При этом метод [[Yii::getAlias()]] корректно определит, какая часть
псевдонима является корневой и верно сформирует путь или URL:
```php
Yii::setAlias('@foo', '/path/to/foo');
......@@ -74,13 +76,15 @@ Yii::getAlias('@foo/test/file.php'); // выведет: /path/to/foo/test/file.
Yii::getAlias('@foo/bar/file.php'); // выведет: /path2/bar/file.php
```
Если не указать `@foo/bar` в качестве корневого псевдонима, последнее выражение выведет `/path/to/foo/bar/file.php`.
Если бы `@foo/bar` не является корневым псевдонимом, последняя строка вывела бы `/path/to/foo/bar/file.php`.
Использование псевдонимов <a name="using-aliases"></a>
-------------
------------------------------------------------
Псевдонимы распознаются во многих частях Yii без необходимости вызова [[Yii::getAlias()]] для раскрытия псевдонимов. Например, [[yii\caching\FileCache::cachePath]] принимает в качестве аргумента как обычный путь к файлу, так и псевдоним, благодаря тому, что псевдонимы начинаются со знака '@'.
Псевдонимы распознаются во многих частях Yii без необходимости предварительно вызывать [[Yii::getAlias()]] для
получения пути или URL. Например, [[yii\caching\FileCache::cachePath]] принимает как обычный путь к файлу, так и
псевдоним пути благодаря префиксу `@`, который позволяет их различать.
```php
use yii\caching\FileCache;
......@@ -90,32 +94,33 @@ $cache = new FileCache([
]);
```
Для того чтобы узнать, поддерживает ли необходимый вам метод или свойство класса псевдонимы в качестве аргументов обратитесь к документации API.
Для того чтобы узнать, поддерживает ли метод или свойство псевдонимы, обратитесь к документации API.
Системные псевдонимы <a name="predefined-aliases"></a>
------------------
Заранее определённые псевдонимы <a name="predefined-aliases"></a>
----------------------------------------------------------
Системные псевдонимы Yii включают в себя часто используемые пути к файлам и URL адреса.
Список системных псевдонимов Yii:
В Yii заранее определны псевдонимы для часто используемых путей к файлам и URL:
- `@yii`: папка, в которой находится файл `BaseYii.php` (директория фреймворка).
- `@app`: [[yii\base\Application::basePath|base path]] текущего приложения.
- `@runtime`: [[yii\base\Application::runtimePath|runtime path]] текущего приложения.
- `@vendor`: [[yii\base\Application::vendorPath|Composer vendor directory].
- `@webroot`: папка Web root текущего Web приложения.
- `@web`: базовый URL (base 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` во [входной скрипт (entry script)](structure-entry-scripts.md),
остальные псевдонимы создаются в конструкторе приложения в момент применения [конфигурации](concept-configurations.md).
Псевдоним `@yii` задаётся в момент подключения файла `Yii.php` в [входном скрипте](structure-entry-scripts.md).
Остальные псевдонимы задаются в конструкторе приложения в момент применения [конфигурации](concept-configurations.md).
Псевдонимы расширений <a name="extension-aliases"></a>
-----------------
------------------------------------------------
Для каждого [расширения](structure-extensions.md), устанавливаемого через Composer автоматически создается псевдоним.
Имя псевдонима расширения соответствует корневому пространству имен, которое указано в файле `composer.json` расширения. Данный псевдоним указывает на корневую папку расширения.
Например, если вы установите расширение `yiisoft/yii2-jui`, то для вас автоматически станет доступен псевдоним `@yii/jui`, создание которого будет происходить на этапе [первоначальной загрузки (bootstrapping)](runtime-bootstrapping.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');
......
Автозагрузка классов
=================
Для подключения и загрузки классов в Yii используется [автозагрузка классов](http://www.php.net/manual/ru/language.oop5.autoload.php). Автозагрузчик классов в Yii совместим со стандартом автозагрузки [PSR-4](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md) и работает быстро.
Автозагрузчик устанавливается когда вы включаете файл `Yii.php` в свой скрипт.
> Примечание: Для простоты повествования мы будем говорить только об автозагрузке классов. Стоит отметить, что нижеприведенный способ может быть применен не только для автозагрузки классов, но и для автозагрузки интерфейсов(interface) и трейтов(traits).
Поиск и подключение файлов классов в Yii реализовано при помощи
[автозагрузки классов](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 <a name="using-yii-autoloader"></a>
------------------------
--------------------------------------------------------------
Для того чтобы воспользоваться автозагрузчиком классов Yii вам нужно соблюсти два правила при создании и именовании классов:
При использовании автозагрузчика классов Yii следует соблюдать два простых правила создания и именования классов:
* Каждый класс должен принадлежать определенному пространству имён (прим. `foo\bar\MyClass`).
* Каждый класс должен находиться в отдельном файле, путь к которому будет определяться по следующему правилу:
* Каждый класс должен принадлежать пространству имён (то есть `foo\bar\MyClass`).
* Каждый класс должен находиться в отдельном файле, путь к которому определятся следующим правилом:
```php
// $className - это полное имя класса, начинающееся с обратного слэша, т.е. \
// $className — это абсолютное имя класса, начинающееся с "\"
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
```
Например, если полное имя класса `foo\bar\MyClass`, то [псевдоним пути(alias)](concept-aliases.md) данного файла будет
`@foo/bar/MyClass.php`. Для того, чтобы данный псевдоним превратился в путь файла в файловой системе нужно чтобы либо `@foo` либо `@foo/bar` был [корневым псевдонимом(root alias)](concept-aliases.md#defining-aliases).
Например, если абсолютное имя класса `foo\bar\MyClass`, то [псевдоним пути](concept-aliases.md) данного файла будет
`@foo/bar/MyClass.php`. Для того, чтобы данный псевдоним можно было преобразовать в путь к файлу, необходимо чтобы
либо `@foo` либо `@foo/bar` являлся [корневым псевдонимом](concept-aliases.md#defining-aliases).
При использовании [простого шаблона приложения (Basic Application Template)](start-basic.md), вы можете хранить свои классы в пространствах имен ниже `app`, тогда вам не понадобится указывать новый псевдоним пути для автозагрузки вашего класса. Это работает потому что
`@app` является [системным псевдонимом](concept-aliases.md#predefined-aliases), а такое имя класса как `app\components\MyClass`
преобразуется в путь
`папкавашегоприложения/components/MyClass.php`.
При использовании [шаблона приложения basic](start-basic.md) вы можете хранить свои классы в пространстве имён `app`.
В этом случае они будут загружаться автоматически без создания нового псевдонима. Это работает потому как `@app`
является [заранее определённым псевдонимом](concept-aliases.md#predefined-aliases) и такое имя класса как
`app\components\MyClass` в соответствии с описанным выше алготимом преобразуется в путь
`директорияПриложения/components/MyClass.php`.
В [шаблоне продвинутого приложения (Advanced Application Template)](tutorial-advanced-app.md), каждый уровень приложения обладает собственным корневым псевдонимом. Например, для front-end части корневым псевдонимом является `@frontend`, а для back-end части `@backend`. Это позволяет включать классы front-end части в пространство имен(namespace) ниже 'frontend', а для back-end части ниже 'backend'. При таком подходе ваши классы будут автоматически загружены автозагрузчиком Yii.
В [шаблоне приложения advanced](tutorial-advanced-app.md) каждый уровень приложения обладает собственным корневым
псевдонимом. Например, для frontend корневым псевдонимом является `@frontend`, а для backend — `@backend`. Это позволяет
разместить классы frontend в пространство имён `frontend`, а классы backend в пространство имён `backend`. При этом
классы будут загружены автоматически.
Карта классов <a name="class-map"></a>
---------
---------------------------------
Автозагрузчик Yii обладает возможностью, которая называется *карта классов*.Эта возможность позволяет указывать где необходимо искать классы в зависимости от имени файла.
Прежде чем загрузить файл автозагрузчик проверяет есть ли правила для файла в карте классов. Если файл находится в карте классов, то данный файл будет загружен напрямую без дальнейших проверок.
Это позволяет существенно ускорить автозагрузку. Все базовые классы Yii загружаются именно этим способом.
Автозагрузчик Yii поддерживает *карту классов*. Эта возможность позволяет указать путь к файлу для каждого имени класса.
При загрузке класса автозагрузчик проверяет наличие класса в карте. Если он там есть, соответствующий файл будет загружен
напрямую без каких-либо дополнительных проверок. Это делает автозагрузку очень быстрой. Все классы самого фреймворка
загружаются именно этим способом.
Пример добавления класса в карту классов `Yii::$classMap`:
Вы можете добавить класс в карту `Yii::$classMap` следующим образом:
```php
Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
```
[Псевдонимы](concept-aliases.md) могут быть использованы для указания пути к файлу класса. Карту классов необходимо указать в разделе [загрузки фреймворка](runtime-bootstrapping.md) т.к. карта должна быть создана до того, как будут использованы ваши классы.
Для указания путей к файлам классов можно использовать [псевдонимы](concept-aliases.md). Карту классов необходимо
сформировать в процессе [первоначальной загрузки](runtime-bootstrapping.md) так как она должна быть готова до
использования классов.
Использование других автозагрузчиков <a name="using-other-autoloaders"></a>
-----------------------
------------------------------------------------------------------
По причине того что Yii использует Composer в качестве менеджера зависимостей, рекомендуется дополнительно установить автозагрузчик Composer. Если вы использует какие то дополнительные библиотеки, в которых есть свои автозагрузчики, то автозагрузчики этих библиотек также нужно будет установить.
Так как Yii использует Composer в качестве менеджера зависимостей, рекомендуется дополнительно установить его автозагрузчик.
Если вы используете какие-либо сторонние библиотеки, в которых есть свои автозагрузчики, эти автозагрузчики также необходимо
установить.
В случаях использования дополнительных автозагрузчиков вместе с автозагрузчиком Yii, файл `Yii.php` должен быть подключен *после* установки всех дополнительных автозагрузчиков. В таком случае автозагрузчик Yii будет первым используемым автозагрузчиком из установленных при автозагрузке. Например нижеследующий код взят напрямую из [входного скрипта(entry script)](structure-entry-scripts.md) для [Basic Application Template](start-basic.md). Первая строчка устанавливает автозагрузчик Composer, а вторая устанавливает автозагрузчик Yii.
При использовании дополнительных автозагрузчиков файл `Yii.php` должен быть подключен *после* их установки. Это позволит
автозагрузчику Yii первым пробовать загрузить класс. К примеру, приведённый ниже код взят из
[входного скрипта](structure-entry-scripts.md) [шаблона приложения basic](start-basic.md). Первая строка устанавливает
автозагрузчик Composer, а вторая — автозагрузчик Yii:
```php
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
```
Вы можете использовать автозагрузчик Composer бес использования автозагрузчика Yii. Но в таком случае скорость автозагрузки может уменьшится, также вам нужно будет соблюсти правила автозагрузки для Composer.
Вы можете использовать автозагрузчик Composer без автозагрузчика Yii. Однако, скорость автозагрузки в этом случае
может уменьшится. Также вам будет необходимо сдедовать правилам автозагрузчика Composer.
> Информация: Если вы не хотите использовать автозагрузчик Yii, то вам нужно будет создать свою версию файла `Yii.php`
и подключить его к [входному скрипту(entry script)](structure-entry-scripts.md).
> Информация: Если вы не хотите использовать автозагрузчик Yii, создайте свою версию файла `Yii.php`
и подключите его в [входном скрипте](structure-entry-scripts.md).
Автозагрузка классов расширений <a name="autoloading-extension-classes"></a>
-----------------------------
Автозагрузчик Yii позволяет автоматически загружать классы [расширений](structure-extensions.md). Единственное правило в таком случае - расширение должно правильно указывать раздел 'autoload' в своем файле 'composer.json'. Более подробную информацию о том как правильно указать раздел 'autoload' вы можете узнать в [официальной документации Composer](https://getcomposer.org/doc/04-schema.md#autoload).
-------------------------------------------------------------------
Если вы не используете автозагрузчик Yii, то классы расширений могут быть автоматически загружены с помощью автозагрузчика Composer.
Автозагрузчик Yii может автоматически загружать классы [расширений](structure-extensions.md) в том случае, если соблюдается
единственное правило. Расширение должно правильно описать раздел 'autoload' в файле 'composer.json'. Более подробно об
этом можно узнать из [официальной документации Composer](https://getcomposer.org/doc/04-schema.md#autoload).
Если вы не используете автозагрузчик Yii, то классы расширений могут быть автоматически загружены с помощью
автозагрузчика Composer.
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