Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а так же определение зависимости.
Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а так же определение зависимости.
Именем зависимости может быть имя класса, интерфейса или алиас, так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP calback'ом.
Именем зависимости может быть имя класса, интерфейса или алиас, так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP callback'ом.
Глобальные события <spanid="global-events"></span>
Глобальные события <spanid="global-events"></span>
-------------
-------------
Yii поддерживает так называемые *глобальные события*, которые на самом деле основаны на нестандартном использовании описанного выше механизма событий. Для глобальных событий нужен глобально доступный объект-синглетон, например, экземпляр приложения - [application](structure-applications.md).
Yii поддерживает так называемые *глобальные события*, которые на самом деле основаны на нестандартном использовании описанного выше механизма событий. Для глобальных событий нужен глобально доступный объект-синглтон, например, экземпляр приложения - [application](structure-applications.md).
Чтобы создать глобальное событие, отправитель сообщения вызывает метод `trigger()` синглетона, а не свой собственный метод `trigger()`. Аналогичным образом обработчики события также присоединяются к событиям синглетона. Например:
Чтобы создать глобальное событие, отправитель сообщения вызывает метод `trigger()` синглтона, а не свой собственный метод `trigger()`. Аналогичным образом обработчики события также присоединяются к событиям синглтона. Например:
```php
```php
use Yii;
use Yii;
@ -242,6 +242,6 @@ Yii::$app->on('bar', function ($event) {
Yii::$app->trigger('bar', new Event(['sender' => new Foo]));
Yii::$app->trigger('bar', new Event(['sender' => new Foo]));
```
```
Преимущество глобальных событий в том, что им не нужен объект, к событию которого бы присоединялся обработчик и объект, с помощью котрого бы это событие инициировалось. Вместо этого и для присоединения обработчика, и для инициирования события используется синглетон (например, экземпляр приложения).
Преимущество глобальных событий в том, что им не нужен объект, к событию которого бы присоединялся обработчик и объект, с помощью которого бы это событие инициировалось. Вместо этого и для присоединения обработчика, и для инициирования события используется синглтон (например, экземпляр приложения).
Тем не менее, так как пространство имен глобальных событий едино для всего приложения, их имена нельзя назначать бездумно. Например, полезными могут быть искусственные пространства имен ("frontend.mail.sent", "backend.mail.sent").
Тем не менее, так как пространство имен глобальных событий едино для всего приложения, их имена нельзя назначать бездумно. Например, полезными могут быть искусственные пространства имен ("frontend.mail.sent", "backend.mail.sent").
В связи с тем, что изменение структуры базы данных часто требует изменение исходного кода, yii поддерживает так
В связи с тем, что изменение структуры базы данных часто требует изменение исходного кода, yii поддерживает так
называемую возможность *миграции баз данных*, которая позволяет отслеживать изменения в базах данных при помощи терминов *миграции баз данных*, которые являются системой контроля версий вместе с исходным кодом.
называемую возможность *миграции баз данных*, которая позволяет отслеживать изменения в базах данных при помощи терминов *миграции баз данных*, которые являются системой контроля версий вместе с исходным кодом.
Следующие шаги показывают, как миграции базы данных могут быть использованны командой разработчиков в процессе разработки:
Следующие шаги показывают, как миграции базы данных могут быть использованы командой разработчиков в процессе разработки:
1. Илья создает новую миграцию (например, создается новая таблица или изменяется определение столбца и т.п.).
1. Илья создает новую миграцию (например, создается новая таблица или изменяется определение столбца и т.п.).
2. Илья фиксирует новую миграцию в системе управления версиями (например, в Git, Mercurial).
2. Илья фиксирует новую миграцию в системе управления версиями (например, в Git, Mercurial).
@ -42,7 +42,7 @@ yii migrate/create <name>
yii migrate/create create_news_table
yii migrate/create create_news_table
```
```
> Примечание: Поскольку аргумент `name` будет использован как часть имени класса создавамой миграции, он должен содержать только буквы, цифры и/или символы подчеркивания.
> Примечание: Поскольку аргумент `name` будет использован как часть имени класса создаваемой миграции, он должен содержать только буквы, цифры и/или символы подчеркивания.
Приведенная выше команда создаст новый PHP класс с именем файла `m150101_185401_create_news_table.php` в директории `@app/migrations`. Файл содержит следующий код, который главным образом декларирует класс миграции `m150101_185401_create_news_table` с следующим каркасом кода:
Приведенная выше команда создаст новый PHP класс с именем файла `m150101_185401_create_news_table.php` в директории `@app/migrations`. Файл содержит следующий код, который главным образом декларирует класс миграции `m150101_185401_create_news_table` с следующим каркасом кода:
@ -99,7 +99,7 @@ class m150101_185401_create_news_table extends \yii\db\Migration
}
}
```
```
> Для справки: Не все миграции являются обратимыми. Например, если метод `up()` удаляет строку из таблицы, возможно что у вас уже не будет возможности вернуть эту строку методом `down()`. Иногда Вам может быть просто слишком лень реализовывать метод `down()`, в связи с тем, что это не очень распространенно - откатывать миграции базы данных. В этом случае вы должны в методе `down()` вернуть `false`, чтобы указать, что миграция не является обратимой.
> Для справки: Не все миграции являются обратимыми. Например, если метод `up()` удаляет строку из таблицы, возможно что у вас уже не будет возможности вернуть эту строку методом `down()`. Иногда Вам может быть просто слишком лень реализовывать метод `down()`, в связи с тем, что это не очень распространено - откатывать миграции базы данных. В этом случае вы должны в методе `down()` вернуть `false`, чтобы указать, что миграция не является обратимой.
Базовый класс миграций [[yii\db\Migration]] предоставляет подключение к базе данных через свойство [[yii\db\Migration::db|db]]. Вы можете использовать его для манипулирования схемой базы данных используя методы описанные в [работе со схемой базы данных](db-dao.md#database-schema).
Базовый класс миграций [[yii\db\Migration]] предоставляет подключение к базе данных через свойство [[yii\db\Migration::db|db]]. Вы можете использовать его для манипулирования схемой базы данных используя методы описанные в [работе со схемой базы данных](db-dao.md#database-schema).
@ -224,7 +224,7 @@ yii migrate/to 1392853618 # используя врем
Чтобы отменить (откатить) одну или несколько миграций, которые применялись ранее, нужно запустить следующую команду:
Чтобы отменить (откатить) одну или несколько миграций, которые применялись ранее, нужно запустить следующую команду:
yii migrate/down 3 # отменяет 3 последних применённых миграции
yii migrate/down 3 # отменяет 3 последних применённых миграции
```
```
@ -292,11 +292,11 @@ yii migrate/mark 1392853618 # используя вре
Например, если мы хотим перенести модуль `forum`, чьи файлы миграций расположены в каталоге `migrations` данного модуля, для этого мы можем использовать следующую команду:
Например, если мы хотим перенести модуль `forum`, чьи файлы миграций расположены в каталоге `migrations` данного модуля, для этого мы можем использовать следующую команду:
### Глобальная Настройка Команд <spanid="configuring-command-globally"></span>
Вместо того, чтобы каждый раз вводить одинаковые значения параметров миграции, когда вы запускаете команду миграции, можно настроить её раз и навсегда в конфигурации приложения, как показано ниже:
Вместо того, чтобы каждый раз вводить одинаковые значения параметров миграции, когда вы запускаете команду миграции, можно настроить её раз и навсегда в конфигурации приложения, как показано ниже:
@ -311,7 +311,7 @@ return [
];
];
```
```
С приведённой выше конфигурацией, каждый раз при запуске команды миграции, таблица `backend_migration` будет использованна для записи истории миграций. И Вам больше не нужно указывать её через параметр `migrationTable` в командной строке.
С приведённой выше конфигурацией, каждый раз при запуске команды миграции, таблица `backend_migration` будет использована для записи истории миграций. И Вам больше не нужно указывать её через параметр `migrationTable` в командной строке.
## Миграции в Несколько Баз Данных <spanid="migrating-multiple-databases"></span>
## Миграции в Несколько Баз Данных <spanid="migrating-multiple-databases"></span>
Для форматирования значений даты и времении Yii будет преобразовывать их в соответствии с [[yii\i18n\Formatter::timeZone|настроенной временной зоной]].
Для форматирования значений даты и времени Yii будет преобразовывать их в соответствии с [[yii\i18n\Formatter::timeZone|настроенной временной зоной]].
Поэтому предполагается, что входные значения будут в UTC, если часовой пояс не был указан явно. По этой причине
Поэтому предполагается, что входные значения будут в UTC, если часовой пояс не был указан явно. По этой причине
рекомендуется хранить все значения даты и времени в формате UTC, предпочтительно в виде UNIX timestamp, которая всегда во временной зоне UTC по определению.
рекомендуется хранить все значения даты и времени в формате UTC, предпочтительно в виде UNIX timestamp, которая всегда во временной зоне UTC по определению.
Если входное значение находится в часовом поясе, отличном от UTC, часовой пояс должен быть указан явно, как в следующем примере:
Если входное значение находится в часовом поясе, отличном от UTC, часовой пояс должен быть указан явно, как в следующем примере:
> Информация: При получении данных из сессии через компонент `session`, сессия будет автоматически открыта, если она не была открыта до этого. В этом заключатеся отличие от получения данных из глобальной переменной `$_SESSION`, которое требует обязательного вызова `session_start()`.
> Информация: При получении данных из сессии через компонент `session`, сессия будет автоматически открыта, если она не была открыта до этого. В этом заключается отличие от получения данных из глобальной переменной `$_SESSION`, которое требует обязательного вызова `session_start()`.
При работе с сессионными данными, являющимися массивами, компонент `session` имеет ограничение, запрещающее прямую модификацию отдельных элементов массива. Например,
При работе с сессионными данными, являющимися массивами, компонент `session` имеет ограничение, запрещающее прямую модификацию отдельных элементов массива. Например,
Для улучшения производительности и читаемости кода рекомендуется использовать последний прием. Другими словами, вместо того, чтобы хранить массив как одну переменную сессии, мы сохраняем каждый элемент массива как обычную сессионную переменную с общим префиксом.
Для улучшения производительности и читаемости кода рекомендуется использовать последний прием. Другими словами, вместо того, чтобы хранить массив как одну переменную сессии, мы сохраняем каждый элемент массива как обычную сессионную переменную с общим префиксом.
### Пользовательское хранилице для сессии <spanid="custom-session-storage"></span>
### Пользовательское хранилище для сессии <spanid="custom-session-storage"></span>
По умолчанию класс [[yii\web\Session]] сохраняет данные сессии в виде файлов на сервере. Однако Yii предоставляет ряд классов, которые реализуют различные способы хранения данных сессии:
По умолчанию класс [[yii\web\Session]] сохраняет данные сессии в виде файлов на сервере. Однако Yii предоставляет ряд классов, которые реализуют различные способы хранения данных сессии:
* [[yii\web\DbSession]]: сохраненяет данные сессии в базе данных.
* [[yii\web\DbSession]]: сохраняет данные сессии в базе данных.
* [[yii\web\CacheSession]]: хранение данных сессии в предварительно сконфигурированном компоненте кэша [кэш](caching-data.md#cache-components).
* [[yii\web\CacheSession]]: хранение данных сессии в предварительно сконфигурированном компоненте кэша [кэш](caching-data.md#cache-components).
* [[yii\redis\Session]]: хранение данных сессии в [redis](http://redis.io/).
* [[yii\redis\Session]]: хранение данных сессии в [redis](http://redis.io/).
* [[yii\mongodb\Session]]: хранение сессии в [MongoDB](http://www.mongodb.org/).
* [[yii\mongodb\Session]]: хранение сессии в [MongoDB](http://www.mongodb.org/).
@ -152,7 +152,7 @@ CREATE TABLE session
)
)
```
```
где 'BLOB' соответствует типу данных предопчитаемой вами DBMS. Ниже приведены примеры соответствия типов BLOB в наиболее популярных DBMS:
где 'BLOB' соответствует типу данных предпочитаемой вами DBMS. Ниже приведены примеры соответствия типов BLOB в наиболее популярных DBMS:
- MySQL: LONGBLOB
- MySQL: LONGBLOB
- PostgreSQL: BYTEA
- PostgreSQL: BYTEA
@ -163,7 +163,7 @@ CREATE TABLE session
### Flash-сообщения <spanid="flash-data"></span>
### Flash-сообщения <spanid="flash-data"></span>
Flash-сообщения - это особый тип данных в сессии, которые устанавливаются один раз во время запроса и доступны только на протяжении следующего запроса, затем они автоматически удаляются. Такой способ хранения информации в сессии наиболее часто используется для реализации сообщений, которые будует отображены конечному пользователю один раз, например подтверждение об успешной отправке формы.
Flash-сообщения - это особый тип данных в сессии, которые устанавливаются один раз во время запроса и доступны только на протяжении следующего запроса, затем они автоматически удаляются. Такой способ хранения информации в сессии наиболее часто используется для реализации сообщений, которые будут отображены конечному пользователю один раз, например подтверждение об успешной отправке формы.
Установить и получить flash-сообщения можно через компонент приложения `session`. Например:
Установить и получить flash-сообщения можно через компонент приложения `session`. Например:
@ -194,7 +194,7 @@ $session = Yii::$app->session;
// Запрос #1
// Запрос #1
// добавить новое flash-сообщение с названием "alerts"
// добавить новое flash-сообщение с названием "alerts"
$session->addFlash('alerts', 'Вы успешно удалии пост.');
$session->addFlash('alerts', 'Вы успешно удалили пост.');
$session->addFlash('alerts', 'Вы успешно добавили нового друга.');
$session->addFlash('alerts', 'Вы успешно добавили нового друга.');
$session->addFlash('alerts', 'Благодарим.');
$session->addFlash('alerts', 'Благодарим.');
@ -261,13 +261,13 @@ unset($cookies['language']);
Кроме свойств [[yii\web\Cookie::name|name]] и [[yii\web\Cookie::value|value]], класс [[yii\web\Cookie]] также предоставляет ряд свойств для получения информации о куках: [[yii\web\Cookie::domain|domain]], [[yii\web\Cookie::expire|expire]]. Эти свойства можно сконфигурировать и затем добавить куку в коллекцию для HTTP-ответа.
Кроме свойств [[yii\web\Cookie::name|name]] и [[yii\web\Cookie::value|value]], класс [[yii\web\Cookie]] также предоставляет ряд свойств для получения информации о куках: [[yii\web\Cookie::domain|domain]], [[yii\web\Cookie::expire|expire]]. Эти свойства можно сконфигурировать и затем добавить куку в коллекцию для HTTP-ответа.
> Замечение: Для большей безопасности значение свойства [[yii\web\Cookie::httpOnly]] по умолчанию установлено в true. Это уменьшает риски доступа к защищенной куке на клиентской стороне (если браузер поддерживает такую возможность). Вы можете обратиться к [httpOnly wiki](https://www.owasp.org/index.php/HttpOnly) для дополнительной информации.
> Замечание: Для большей безопасности значение свойства [[yii\web\Cookie::httpOnly]] по умолчанию установлено в true. Это уменьшает риски доступа к защищенной куке на клиентской стороне (если браузер поддерживает такую возможность). Вы можете обратиться к [httpOnly wiki](https://www.owasp.org/index.php/HttpOnly) для дополнительной информации.
Во время записи и чтения кук через компоненты `request` и `response`, как будет показано в двух последующих подразделах, фреймворк предоставляет автоматическую валидацию, которая обеспечивает защиту кук от модификации на стороне клиента. Это достигается за счет подписи каждой куки секретным ключом, позволяющим приложению распознать куку, которая была модифицирована на клиентской стороне. В таком случае кука НЕ БУДЕТ доступна через свойство [[yii\web\Request::cookies|cookie collection]] компонента `request`.
Во время записи и чтения кук через компоненты `request` и `response`, как будет показано в двух последующих подразделах, фреймворк предоставляет автоматическую валидацию, которая обеспечивает защиту кук от модификации на стороне клиента. Это достигается за счет подписи каждой куки секретным ключом, позволяющим приложению распознать куку, которая была модифицирована на клиентской стороне. В таком случае кука НЕ БУДЕТ доступна через свойство [[yii\web\Request::cookies|cookie collection]] компонента `request`.
> Замечение: Валидация кук защищает только от их модификации. Если валидация не была пройдена, получить доступ к кукам все еще можно через глобальную переменную `$_COOKIE`. Это связано с тем, что дополнительные пакеты и библиотеки могут манипулировать куками без вызова валидации, которую обеспечивает Yii.
> Замечание: Валидация кук защищает только от их модификации. Если валидация не была пройдена, получить доступ к кукам все еще можно через глобальную переменную `$_COOKIE`. Это связано с тем, что дополнительные пакеты и библиотеки могут манипулировать куками без вызова валидации, которую обеспечивает Yii.
По-умолчанию валидация кук включена. Её можно отключить, установив свойство [[yii\web\Request::enableCookieValidation]]
По-умолчанию валидация кук включена. Её можно отключить, установив свойство [[yii\web\Request::enableCookieValidation]]
в false, однако мы настоятельно не рекомендуем это делать.
в false, однако мы настоятельно не рекомендуем это делать.
@ -286,5 +286,5 @@ return [
];
];
```
```
> Замечение: Свойство [[yii\web\Request::cookieValidationKey|cookieValidationKey]] является секретным значением и должно быть известно только людям, которым вы доверяете. Не помещайте эту информацию под систему контроля версий.
> Замечание: Свойство [[yii\web\Request::cookieValidationKey|cookieValidationKey]] является секретным значением и должно быть известно только людям, которым вы доверяете. Не помещайте эту информацию под систему контроля версий.
> Примечание: этот раздел находится на стадии разработки.
> Примечание: этот раздел находится на стадии разработки.
Авторизация это процесс проверки того, что пользователь имеет достаточно прав чтобы что-то сделать. Yii обеспечивает два
Авторизация это процесс проверки того, что пользователь имеет достаточно прав чтобы что-то сделать. Yii обеспечивает два
методв авторизации: Фильтры контроля доступа (ACF) и контроль доступа основанный на ролях (RBAC).
метода авторизации: Фильтры контроля доступа (ACF) и контроль доступа основанный на ролях (RBAC).
Фильтры контроля доступа
Фильтры контроля доступа
@ -47,7 +47,7 @@ class SiteController extends Controller
}
}
```
```
Код выше показывет ACF связанный с контроллером `site` через поведение. Это типичный способ использования фильтров действий.
Код выше показывает ACF связанный с контроллером `site` через поведение. Это типичный способ использования фильтров действий.
Параметр `only` указывает, что фильтр ACF нужно применять только к действиям `login`, `logout` и `signup`.
Параметр `only` указывает, что фильтр ACF нужно применять только к действиям `login`, `logout` и `signup`.
Параметр `rules` задаёт [[yii\filters\AccessRule|правила доступа]], которые означают следующее:
Параметр `rules` задаёт [[yii\filters\AccessRule|правила доступа]], которые означают следующее:
@ -58,7 +58,7 @@ class SiteController extends Controller
Когда ACF проводит проверку авторизации, он проверяет правила по одному сверху вниз пока не найдёт совпадение.
Когда ACF проводит проверку авторизации, он проверяет правила по одному сверху вниз пока не найдёт совпадение.
Значение опции `allow` выбранного правила указывает авторизовывать пользователя или нет. Если ни одно из правил
Значение опции `allow` выбранного правила указывает авторизовывать пользователя или нет. Если ни одно из правил
не совпало, то пользователь считается НЕ авторизованным и ACF останавливает дальнейшее выполнение деиствия.
не совпало, то пользователь считается НЕ авторизованным и ACF останавливает дальнейшее выполнение действия.
По умолчанию, ACF, когда у пользователя отсутствует доступ к текущему действию, делает следующее:
По умолчанию, ACF, когда у пользователя отсутствует доступ к текущему действию, делает следующее:
@ -112,7 +112,7 @@ class SiteController extends Controller
* [[yii\filters\AccessRule::denyCallback|denyCallback]]: задаёт PHP колбек, который будет вызван если доступ будет
* [[yii\filters\AccessRule::denyCallback|denyCallback]]: задаёт PHP колбек, который будет вызван если доступ будет
запрещён при вызове этого правила.
запрещён при вызове этого правила.
Ниже покзан пример, показывающий использование опции `matchCallback`, которая позволяет писать произвольную
Ниже показан пример, показывающий использование опции `matchCallback`, которая позволяет писать произвольную
логику проверки доступа:
логику проверки доступа:
```php
```php
@ -139,7 +139,7 @@ class SiteController extends Controller
];
];
}
}
// Колбек сработал! Эта страница может быть отображена толко 31-ого октября
// Колбек сработал! Эта страница может быть отображена только 31-ого октября
public function actionSpecialCallback()
public function actionSpecialCallback()
{
{
return $this->render('happy-halloween');
return $this->render('happy-halloween');
@ -151,7 +151,7 @@ class SiteController extends Controller
Контроль доступа на основе ролей (RBAC)
Контроль доступа на основе ролей (RBAC)
---------------------------------------
---------------------------------------
Управление доступом на основе ролей (RBAC) обеспечивает простой, но мощьный централизованный контроль доступа.
Управление доступом на основе ролей (RBAC) обеспечивает простой, но мощный централизованный контроль доступа.
Пожалуйста обратитесь к [Wikipedia](https://ru.wikipedia.org/wiki/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%BC_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D1%80%D0%BE%D0%BB%D0%B5%D0%B9)
Пожалуйста обратитесь к [Wikipedia](https://ru.wikipedia.org/wiki/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%BC_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D1%80%D0%BE%D0%BB%D0%B5%D0%B9)
для получения более подробного сравнения RBAC с другими, более традиционными, системами контроля доступа.
для получения более подробного сравнения RBAC с другими, более традиционными, системами контроля доступа.
@ -242,7 +242,7 @@ return [
### Создание данных авторизации
### Создание данных авторизации
Для создания данных авторизации нужно выполнить следущие задачи:
Для создания данных авторизации нужно выполнить следующие задачи:
- определение ролей и разрешений;
- определение ролей и разрешений;
- установка отношений между ролями и правами доступа;
- установка отношений между ролями и правами доступа;
@ -306,7 +306,7 @@ class RbacController extends Controller
Автор может создавать пост, администратор может обновлять пост и делать всё, что может делать автор.
Автор может создавать пост, администратор может обновлять пост и делать всё, что может делать автор.
Если ваше приложение позволяет регистрировать пользователей, то вам необходимо сразу назначать роли этим новым пользователям.
Если ваше приложение позволяет регистрировать пользователей, то вам необходимо сразу назначать роли этим новым пользователям.
Например, для того, чтобы все вошедшие пользователи могли стать авторами в расширеном шаблоне проекта, вы должны изменить
Например, для того, чтобы все вошедшие пользователи могли стать авторами в расширенном шаблоне проекта, вы должны изменить
`frontend\models\SignupForm::signup()` как показано ниже:
`frontend\models\SignupForm::signup()` как показано ниже:
```php
```php
@ -340,7 +340,7 @@ public function signup()
### Использование правил
### Использование правил
Как упомянуто выше, правила добавляют дополнительные ограничения на роли и разрешения. Правила это классы, расширяющие
Как упомянуто выше, правила добавляют дополнительные ограничения на роли и разрешения. Правила это классы, расширяющие
[[yii\rbac\Rule]]. Они должны реализовывать метод [[yii\rbac\Rule::execute()|execute()]]. В иерархии, созданой нами ранее,
[[yii\rbac\Rule]]. Они должны реализовывать метод [[yii\rbac\Rule::execute()|execute()]]. В иерархии, созданной нами ранее,
автор не можете редактировать свой пост. Давайте исправим это. Во-первых, мы должны создать правило проверяющее,
автор не можете редактировать свой пост. Давайте исправим это. Во-первых, мы должны создать правило проверяющее,
что пользователь является автором поста:
что пользователь является автором поста:
@ -358,7 +358,7 @@ class AuthorRule extends Rule
/**
/**
* @param string|integer $user the user ID.
* @param string|integer $user the user ID.
* @param Item $item the role or permission that this rule is associated with
* @param Item $item the role or permission that this rule is associated width
* @param array $params parameters passed to ManagerInterface::checkAccess().
* @param array $params parameters passed to ManagerInterface::checkAccess().
* @return boolean a value indicating whether the rule permits the role or permission it is associated with.
* @return boolean a value indicating whether the rule permits the role or permission it is associated with.
*/
*/
@ -513,7 +513,7 @@ return [
];
];
```
```
Теперь, если вы выполните проверку доступа, для обойх ролей `admin` и `author` будет выполнена проверка правила
Теперь, если вы выполните проверку доступа, для обоих ролей `admin` и `author` будет выполнена проверка правила
асоциированного с ними. Если правило вернёт истину, это будет означать что роль применяется к текущему пользователю.
асоциированного с ними. Если правило вернёт истину, это будет означать что роль применяется к текущему пользователю.
На основании правила, реализованного выше, если пользователь входит в группу 1 пользователю будет назначена роль `admin`;
На основании правила, реализованного выше, если пользователь входит в группу 1 пользователю будет назначена роль `admin`;
и если значение `group` равно 2 будет применена роль `author`.
и если значение `group` равно 2 будет применена роль `author`.
В этом разделе вы научились работать с базой данных. Также вы научились получать и отображать данные с постраничной разбивкой с помощью [[yii\data\Pagination]] и [[yii\widgets\LinkPager]].
В этом разделе вы научились работать с базой данных. Также вы научились получать и отображать данные с постраничной разбивкой с помощью [[yii\data\Pagination]] и [[yii\widgets\LinkPager]].
В следующем разделе вы научитесь использовать мощный инструмент генерации кода, называемый [Gii](tool-gii.md), чтобы с его помощью быстро осуществлять некоторые частоиспользуемые функции, такие, как операции Create-Read-Update-Delete (CRUD) для работы с данными в таблице базы данных. На самом деле код, который вы только что написали, в Yii может быть полностью сгенерирован автоматически с использованием Gii.
В следующем разделе вы научитесь использовать мощный инструмент генерации кода, называемый [Gii](tool-gii.md), чтобы с его помощью быстро осуществлять некоторые частоиспользуемые функции, такие, как операции Create-Read-Update-Delete (CRUD) для работы с данными в таблице базы данных. На самом деле код, который вы только что написали, в Yii может быть полностью сгенерирован автоматически с использованием Gii.
[Gii](tool-gii.md) предствален в Yii как [модуль](structure-modules.md). Вы можете активировать Gii,
[Gii](tool-gii.md) представлен в Yii как [модуль](structure-modules.md). Вы можете активировать Gii,
настроив его в свойстве [[yii\base\Application::modules|modules]]. В зависимости от того, каким образом вы создали приложение, вы можете удостовериться в наличии следующего кода в конфигурационном файле `config/web.php`,
настроив его в свойстве [[yii\base\Application::modules|modules]]. В зависимости от того, каким образом вы создали приложение, вы можете удостовериться в наличии следующего кода в конфигурационном файле `config/web.php`,
Ресурс в Yii это файл который может быть задан в Web странице. Это может быть CSS файл, JavaScript файл, изображение или видео файл и т.д. Ресурсы располагаются в Web доступных директориях и обслуживаются непосредственно Web серверами.
Ресурс в Yii это файл который может быть задан в Web странице. Это может быть CSS файл, JavaScript файл, изображение или видео файл и т.д. Ресурсы располагаются в Web доступных директориях и обслуживаются непосредственно Web серверами.
Желательно, управлять ресурсами программно. Например, при использовании виджета [[yii\jui\DatePicker]] в странице, автоматически включаются необходимые CSS и JavaScript файлы, вместо того чтобы просить Вас в ручную найти эти файлы и включить их. И когда Вы обновляете виджет до новой версии, будут автоматически использованны новые версии файлов-ресурсов. В этом руководстве будет описана мощная возможность управления ресурсами представленная в Yii.
Желательно, управлять ресурсами программно. Например, при использовании виджета [[yii\jui\DatePicker]] в странице, автоматически включаются необходимые CSS и JavaScript файлы, вместо того чтобы просить Вас в ручную найти эти файлы и включить их. И когда Вы обновляете виджет до новой версии, будут автоматически использованы новые версии файлов-ресурсов. В этом руководстве будет описана мощная возможность управления ресурсами представленная в Yii.
## Комплекты ресурсов <spanid="asset-bundles"></span>
## Комплекты ресурсов <spanid="asset-bundles"></span>
@ -148,7 +148,7 @@ class FontAwesomeAsset extends AssetBundle
Это происходит потому, что Composer устанавливает Bower или NPM пакет в директорию, соответствующую этим псевдонимам.
Это происходит потому, что Composer устанавливает Bower или NPM пакет в директорию, соответствующую этим псевдонимам.
> Примечание: В некоторых пакетах файлы дистрибутива могут находиться в поддиректории. В этом случае, Вы должны задать поддиреторию как значение [[yii\web\AssetBundle::sourcePath|sourcePath]]. Например, [[yii\web\JqueryAsset]] использует `@bower/jquery/dist` вместо `@bower/jquery`.
> Примечание: В некоторых пакетах файлы дистрибутива могут находиться в поддиректории. В этом случае, Вы должны задать поддиректорию как значение [[yii\web\AssetBundle::sourcePath|sourcePath]]. Например, [[yii\web\JqueryAsset]] использует `@bower/jquery/dist` вместо `@bower/jquery`.
## Использование Комплекта Ресурсов<spanid="using-asset-bundles"></span>
## Использование Комплекта Ресурсов<spanid="using-asset-bundles"></span>
@ -430,7 +430,7 @@ return [
Yii предоставляет консольную команду с именем `asset` для автоматизации подхода, который мы только что описали.
Yii предоставляет консольную команду с именем `asset` для автоматизации подхода, который мы только что описали.
Чтобы использовать эту команду, Вы должны сначала создать файл конфигурации для описания того, как комплекты ресурсов должны быть скомбинированны, и как они должны быть сгруппированы. Затем Вы можете использовать подкомманду `asset/template`, чтобы сгенерировать первый шаблон и затем отредактировать его под свои нужды.
Чтобы использовать эту команду, Вы должны сначала создать файл конфигурации для описания того, как комплекты ресурсов должны быть скомбинированы, и как они должны быть сгруппированы. Затем Вы можете использовать подкомманду `asset/template`, чтобы сгенерировать первый шаблон и затем отредактировать его под свои нужды.
```
```
yii asset/template assets.php
yii asset/template assets.php
@ -474,7 +474,7 @@ return [
Вы должны изменить этот файл и указать в `bundles` параметре, какие комплекты Вы планируете объединить. В параметре `targets` вы должны указать, как комплекты должны быть поделены в группы. Вы можете указать одну или несколько групп, как уже было сказано выше.
Вы должны изменить этот файл и указать в `bundles` параметре, какие комплекты Вы планируете объединить. В параметре `targets` вы должны указать, как комплекты должны быть поделены в группы. Вы можете указать одну или несколько групп, как уже было сказано выше.
> Примечание: Так как псевдонимы путей `@webroot` и `@web` не могут быть использованны в консольном приложении, Вы должны явно задать их в файле конфигурации.
> Примечание: Так как псевдонимы путей `@webroot` и `@web` не могут быть использованы в консольном приложении, Вы должны явно задать их в файле конфигурации.
JavaScript файлы объединены, сжаты и записаны в `js/all-{hash}.js`, где {hash} перенесён из хэша результирующего файла.
JavaScript файлы объединены, сжаты и записаны в `js/all-{hash}.js`, где {hash} перенесён из хэша результирующего файла.