diff --git a/docs/guide-ru/concept-configurations.md b/docs/guide-ru/concept-configurations.md index ccd2d7a7e1..e2fd4bdfb3 100644 --- a/docs/guide-ru/concept-configurations.md +++ b/docs/guide-ru/concept-configurations.md @@ -140,7 +140,7 @@ $config = [ При использовании [виджетов](structure-widgets.md) часто возникает необходимость изменить параметры виджета с помощью конфигурации. Для создания виджета можно использовать два метода: [[yii\base\Widget::widget()]] и -[[yii\base\Widget::beginWidget()]]. Оба метода принимают конфигурацию в виде PHP массива: +[[yii\base\Widget::begin()]]. Оба метода принимают конфигурацию в виде PHP массива: ```php use yii\widgets\Menu; diff --git a/docs/guide-ru/concept-di-container.md b/docs/guide-ru/concept-di-container.md index 31af60fde3..5aa0ce7d2d 100644 --- a/docs/guide-ru/concept-di-container.md +++ b/docs/guide-ru/concept-di-container.md @@ -5,16 +5,15 @@ [Статья Мартина Фаулера](http://martinfowler.com/articles/injection.html) хорошо объясняет, почему контейнер внедрения зависимостей является полезным. Здесь, преимущественно, будет объясняться использование контейнера внедрения зависимостей, предоставляемого в Yii. - - Внедрение зависимостей -------------------- Yii обеспечивает функционал контейнера внедрения зависимостей через класс [[yii\di\Container]]. Он поддерживает следующие виды внедрения зависимостей: -* Внедрение зависимости через конструктор. -* Внедрение зависимости через сеттер и свойство. -* Внедрение зависимости через PHP callback. +* Внедрение зависимости через конструктор; +* Внедрение зависимости через сеттер и свойство; +* Внедрение зависимости через PHP callback; +* Внедрение зависимости через действие контроллера. ### Внедрение зависимости через конструктор @@ -71,10 +70,8 @@ $container->get('Foo', [], [ ]); ``` -> Информация: Метод [[yii\di\Container::get()]] третьим аргументом принимает массив конфигурации, которым инициализируется - создаваемый объект. Если класс реализует интерфейс [[yii\base\Configurable]] (например, [[yii\base\Object]]), - то массив конфигурации передается в последний параметр конструктора класса. Иначе конфигурация применяется уже *после* - создания объекта. +> Информация: Метод [[yii\di\Container::get()]] третьим аргументом принимает массив конфигурации, которым инициализируется создаваемый объект. Если класс реализует интерфейс [[yii\base\Configurable]] (например, [[yii\base\Object]]), то массив конфигурации передается в последний параметр конструктора класса. Иначе конфигурация применяется уже *после* создания объекта. + ### Внедрение зависимости через PHP callback @@ -100,28 +97,39 @@ class FooBuilder { public static function build() { - return function () { - $foo = new Foo(new Bar); - // ... дополнительная инициализация - return $foo; - }; + $foo = new Foo(new Bar); + // ... дополнительная инициализация ... + return $foo; } } -$container->set('Foo', FooBuilder::build()); +$container->set('Foo', ['app\helper\FooBuilder', 'build']); $foo = $container->get('Foo'); ``` -Как вы можете видеть, метод `FooBuilder::build()` возвращает анонимную функцию. Тот, кто будет настраивать класс `Foo`, -теперь не обязан знать, как этот класс устроен. +Теперь тот, кто будет настраивать класс `Foo`, не обязан знать, как этот класс устроен. + + +### Внедрение зависимости через действие контроллера + +Внедрение зависимости через действие контроллера - это специальный тип внедрения зависимостей, использующий указание типов параметров, принимаемых методом, исполняемый во время выполнения кода действия. Этот тип внедрения зависимостей помогает сделать контроллеры MVC *тонкими* и *легкими*, так как нет необходимости настраивать все возможные зависимости контроллера заранее. + +```php +public function actionSend($email, EmailValidator $validator) +{ + if ($validator->validate($email)) { + // ... отправка email + } +} +``` Регистрация зависимостей ------------------------ -Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а также определение зависимости. -Именем зависимости может быть имя класса, интерфейса или алиас, так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP callback'ом. +Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а также определение зависимости. Именем зависимости может быть имя класса, интерфейса или алиас, +так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP callback'ом. ```php $container = new \yii\di\Container; @@ -269,7 +277,7 @@ $lister = new UserLister($finder); Практическое использование --------------- -Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md) +Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md) вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]], метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], чтобы создать новый объект. Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект. diff --git a/docs/guide-ru/db-dao.md b/docs/guide-ru/db-dao.md index 2b97d70e4b..8065a2a8c1 100644 --- a/docs/guide-ru/db-dao.md +++ b/docs/guide-ru/db-dao.md @@ -59,8 +59,7 @@ return [ > Подсказка: Вы можете настроить несколько компонентов подключения, если в вашем приложении используется несколько баз данных. При настройке подключения, вы должны обязательно указывать Имя Источника Данных (DSN) через параметр [[yii\db\Connection::dsn|dsn]]. -Формат DSN отличается для разных баз данных. По -The format of DSN varies for different databases. Дополнительное описание смотрите в [справочнике PHP](http://php.net/manual/ru/pdo.construct.php). +Формат DSN отличается для разных баз данных. Дополнительное описание смотрите в [справочнике PHP](http://php.net/manual/ru/pdo.construct.php). Ниже представлены несколько примеров: * MySQL, MariaDB: `mysql:host=localhost;dbname=mydatabase` @@ -73,7 +72,7 @@ The format of DSN varies for different databases. Дополнительное * Oracle: `oci:dbname=//localhost:1521/mydatabase` Заметьте, что если вы подключаетесь к базе данных через ODBC, вам необходимо указать свойство [[yii\db\Connection::driverName]], -чтобы Yii знал какой тип базы данных используется. Например: +чтобы Yii знал какой тип базы данных используется. Например, ```php 'db' => [ @@ -142,7 +141,8 @@ $count = $db->createCommand('SELECT COUNT(*) FROM post') > Подсказка: Если вам необходимо выполнить SQL запрос сразу после установки соединения (например, для установки > временной зоны или кодировки), вы можете сделать это в обработчике события [[yii\db\Connection::EVENT_AFTER_OPEN]]. -> Например: +> Например, + ```php return [ // ... @@ -165,7 +165,7 @@ return [ ### Привязка параметров При создании команды из SQL запроса с параметрами, вы почти всегда должны использовать привязку параметров для -предотвращения атак через SQL инъекции. Например: +предотвращения атак через SQL инъекции. Например, ```php $post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status') @@ -175,7 +175,7 @@ $post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status') ``` В SQL запрос, вы можете встраивать один или несколько маркеров (например `:id` в примере выше). Маркеры должны быть -строкой начинающейся с двоеточия. Далее вам нужно вызвать один из следующих методов для привязки значений к параметрам: +строкой, начинающейся с двоеточия. Далее вам нужно вызвать один из следующих методов для привязки значений к параметрам: * [[yii\db\Command::bindValue()|bindValue()]]: привязка одного параметра по значению * [[yii\db\Command::bindValues()|bindValues()]]: привязка нескольких параметров в одном вызове @@ -197,7 +197,7 @@ $post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', Привязка переменных реализована через [подготавливаемые запросы](http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php). Помимо предотвращения атак путём SQL инъекций, это увеличивает производительность, так как запрос подготавливается -один раз, а потом выполняется много раз с разными параметрами. Например: +один раз, а потом выполняется много раз с разными параметрами. Например, ```php $command = $db->createCommand('SELECT * FROM post WHERE id=:id'); @@ -227,7 +227,7 @@ $post2 = $command->queryOne(); ### Выполнение Не-SELECT запросов В методах `queryXyz()`, описанных в предыдущих разделах, вызываются SELECT запросы для извлечения данных из базы. -Для запросов не возвращающих данные, вы должны использовать метод [[yii\db\Command::execute()]]. Например: +Для запросов не возвращающих данные, вы должны использовать метод [[yii\db\Command::execute()]]. Например, ```php $db->createCommand('UPDATE post SET status=1 WHERE id=1') @@ -238,7 +238,7 @@ $db->createCommand('UPDATE post SET status=1 WHERE id=1') Для запросов INSERT, UPDATE и DELETE, вместо написания чистого SQL, вы можете вызвать методы [[yii\db\Command::insert()|insert()]], [[yii\db\Command::update()|update()]], [[yii\db\Command::delete()|delete()]], соответственно, для создания указанных -SQL конструкций. Например: +SQL конструкций. Например, ```php // INSERT (table name, column values) @@ -307,7 +307,7 @@ return [ Затем в коде, когда вам нужно ссылаться на таблицу, имя которой содержит такой префикс, используйте синтаксис `{{%table name}}`. Символ процента будет автоматический заменён на префикс таблицы, который вы указали во время конфигурации соединения с -базой данных. Например: +базой данных. Например, ```php // для MySQL будет выполнен следующий SQL: SELECT COUNT(`id`) FROM `tbl_employee` @@ -426,12 +426,12 @@ try { try { $db->createCommand($sql2)->execute(); $innerTransaction->commit(); - } catch (Exception $e) { + } catch (\Exception $e) { $innerTransaction->rollBack(); } $outerTransaction->commit(); -} catch (Exception $e) { +} catch (\Exception $e) { $outerTransaction->rollBack(); } ``` @@ -478,7 +478,7 @@ try { Вышеуказанная конфигурация определяет систему с одним мастером и несколькими подчинёнными. Один из подчинённых будет подключен и использован для чтения, в то время как мастер будет использоваться для запросов записи. -Такое разделение чтения и записи будет осуществлено автоматический с указанной конфигурацией. Например: +Такое разделение чтения и записи будет осуществлено автоматический с указанной конфигурацией. Например, ```php // создание экземпляра соединения, использующего вышеуказанную конфигурацию @@ -506,7 +506,7 @@ $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute(); Это означает, что если сервер не ответит за 10 секунд, он будет считаться "мёртвым". Вы можете отрегулировать этот параметр исходя из настроек вашей среды. -Вы также можете настроить несколько основных и несколько подчинённых серверов. Например: +Вы также можете настроить несколько основных и несколько подчинённых серверов. Например, ```php [ @@ -625,7 +625,7 @@ $db->createCommand()->createTable('post', [ ``` Вы также сможете получить описание схемы таблицы через вызов метода [[yii\db\Connection::getTableSchema()|getTableSchema()]]. -Например: +Например, ```php $table = $db->getTableSchema('post'); diff --git a/docs/guide-ru/db-migrations.md b/docs/guide-ru/db-migrations.md index 17d2c9bf98..2fa0214ed3 100644 --- a/docs/guide-ru/db-migrations.md +++ b/docs/guide-ru/db-migrations.md @@ -1,7 +1,7 @@ Миграции Баз Данных ================== -В ходе разработки и ведения баз данных приложений, которые управляют данными, структуры используемых баз данных развиваются как и исходный код приложений. Например, при разработке приложения, в будущем может оказаться необходимой новая таблица; уже после того, как приложение будет развернуто в рабочем режиме (продакшене), также может быть обнаружено, что для повышения производительности запросов должен быть создан определённый индекс; и так далее. +В ходе разработки и ведения баз данных приложений, которые управляют данными, структуры используемых баз данных развиваются, как и исходный код приложений. Например, при разработке приложения, в будущем может оказаться необходимой новая таблица; уже после того, как приложение будет развернуто в рабочем режиме (продакшене), также может быть обнаружено, что для повышения производительности запросов должен быть создан определённый индекс; и так далее. В связи с тем, что изменение структуры базы данных часто требует изменение исходного кода, yii поддерживает так называемую возможность *миграции баз данных*, которая позволяет отслеживать изменения в базах данных при помощи терминов *миграции баз данных*, которые являются системой контроля версий вместе с исходным кодом. @@ -28,6 +28,9 @@ Yii предоставляет набор инструментов для миг Все эти инструменты доступны через команду `yii migrate`. В этом разделе мы опишем подробно, как выполнять различные задачи, используя эти инструменты. Вы также можете сами посмотреть как использовать каждый отдельный инструмент при помощи команды `yii help migrate`. +> Подсказка: Миграции могут не только изменять схему базы данных, но и приводить данные в соответствие с новой схемой, создавать иерархию RBAC или очищать кеш. + + ## Создание миграций Чтобы создать новую миграцию, выполните следующую команду: @@ -49,20 +52,32 @@ yii migrate/create create_news_table ```php dropTable('news'); } - } ``` -> Для справки: Не все миграции являются обратимыми. Например, если метод `up()` удаляет строку из таблицы, возможно что у вас уже не будет возможности вернуть эту строку методом `down()`. Иногда Вам может быть просто слишком лень реализовывать метод `down()`, в связи с тем, что это не очень распространено - откатывать миграции базы данных. В этом случае вы должны в методе `down()` вернуть `false`, чтобы указать, что миграция не является обратимой. +> Информация: Не все миграции являются обратимыми. Например, если метод `up()` удаляет строку из таблицы, возможно что у вас уже не будет возможности вернуть эту строку методом `down()`. Иногда Вам может быть просто слишком лень реализовывать метод `down()`, в связи с тем, что это не очень распространено - откатывать миграции базы данных. В этом случае вы должны в методе `down()` вернуть `false`, чтобы указать, что миграция не является обратимой. Базовый класс миграций [[yii\db\Migration]] предоставляет подключение к базе данных через свойство [[yii\db\Migration::db|db]]. Вы можете использовать его для манипулирования схемой базы данных используя методы описанные в [работе со схемой базы данных](db-dao.md#database-schema). @@ -111,7 +126,36 @@ class m150101_185401_create_news_table extends \yii\db\Migration Вы можете добавить дополнительные ограничения при использовании абстрактных типов. В приведенном выше примере, ` NOT NULL` добавляется к `Schema::TYPE_STRING` чтобы указать, что столбец не может быть NULL. -> Для справки: Сопоставление абстрактных типов и физических типов определяется свойством [[yii\db\QueryBuilder::$typeMap|$typeMap]] в каждом конкретном `QueryBuilder` классе. +> Информация: Сопоставление абстрактных типов и физических типов определяется свойством [[yii\db\QueryBuilder::$typeMap|$typeMap]] в каждом конкретном `QueryBuilder` классе. + +Начиная с версии 2.0.6, появился новый построитель схем, который является более удобным инструментом для описания структуры столбцов. +Теперь, при написании миграций, можно использовать такой код: + +```php +createTable('news', [ + 'id' => $this->primaryKey(), + 'title' => $this->string()->notNull(), + 'content' => $this->text(), + ]); + } + + public function down() + { + $this->dropTable('news'); + } +} +``` + +Весь список методов описания типов столбцов доступен в API документации [[yii\db\SchemaBuilderTrait]]. + ### Транзакции Миграций @@ -122,8 +166,8 @@ class m150101_185401_create_news_table extends \yii\db\Migration В следующем примере, помимо создания таблицы `news` мы также вставляем в этой таблице начальную строку. ```php +createTable('news', [ - 'id' => 'pk', - 'title' => Schema::TYPE_STRING . ' NOT NULL', - 'content' => Schema::TYPE_TEXT, + 'id' => $this->primaryKey(), + 'title' => $this->string()->notNull(), + 'content' => $this->text(), ]); - + $this->insert('news', [ 'title' => 'test 1', 'content' => 'content 1', @@ -184,7 +228,10 @@ class m150101_185401_create_news_table extends Migration * [[yii\db\Migration::createIndex()|createIndex()]]: создание индекса * [[yii\db\Migration::dropIndex()|dropIndex()]]: удаление индекса -> Примечание: [[yii\db\Migration]] не предоставляет методы запросов к базе данных. Это потому, что обычно не требуется отображать дополнительные сообщения об извлечении данных из базы данных. Это также, потому, что можно использовать более мощный [Построитель Запросов](db-query-builder.md) для построения и выполнения сложных запросов. +> Информация: [[yii\db\Migration]] не предоставляет методы запросов к базе данных. Это потому, что обычно не требуется отображать дополнительные сообщения об извлечении данных из базы данных. Это также, потому, что можно использовать более мощный [Построитель Запросов](db-query-builder.md) для построения и выполнения сложных запросов. + +> Примечание: при обработке данных внутри миграции, может показаться, что использование существующих классов [Active Record](db-active-record.md), со всей их готовой бизнес логикой, будет разумным решением и упросит код миграции. Однако, следует помнить, что код миграций не должен меняться, по определению. В отличии от миграций, бизнес логика приложений часто изменяется. Это может привести к нарушению работы миграции при определённых изменениях на уровне Active Record. Поэтому рекомендуется делать миграции независимыми от других частей приложения, таких как классы Active Record. + ## Применение Миграций @@ -327,7 +374,8 @@ yii migrate --db=db2 Иногда может случиться так, что Вы захотите применить *некоторые* из миграций к одной базе данных, а некоторые другие к другой базе данных. Для достижения этой цели, при реализации класса миграции, необходимо явно указать идентификатор ID компонента базы данных, который миграция будет использовать, следующим образом: ```php -use yii\db\Schema; + Информация: В основном вы будете работать с [[yii\db\Query]] вместо [[yii\db\QueryBuilder]]. Последний вызывается - неявно при вызове одного из методов запроса. [[yii\db\QueryBuilder]] это класс отвечающий за генерацию зависимого + неявно при вызове одного из методов запроса. [[yii\db\QueryBuilder]] это класс, отвечающий за генерацию зависимого от СУБД SQL выражения (такие как экранирование имён таблиц/столбцов) из независимых от СУБД объектов [[yii\db\Query]]. @@ -58,7 +58,7 @@ $query->select(['id', 'email']); $query->select('id, email'); ``` -Имена столбцов могут быть выбраны вместе с префиксами таблиц и/или алиасами столбцов, также как при записи обычного SQL. +Имена столбцов могут быть выбраны вместе с префиксами таблиц и/или алиасами столбцов, также как при записи обычного SQL выражения. Например, ```php @@ -80,14 +80,14 @@ $query->select(['user_id' => 'user.id', 'email']); выбрать *все* столбцы. Кроме имён столбцов, вы можете также использовать SQL выражения. Вы должны использовать формат массива для использования -выражений, которые содержат запятые для предотвращения некорректного автоматического экранирования. Например: +выражений, которые содержат запятые для предотвращения некорректного автоматического экранирования. Например, ```php $query->select(["CONCAT(first_name, ' ', last_name) AS full_name", 'email']); ``` Начиная с версии 2.0.1, вы также можете использовать подзапросы. Вы должны указывать каждый подзапрос в выражении как -объект [[yii\db\Query]]. Например: +объект [[yii\db\Query]]. Например, ```php $subQuery = (new Query())->select('COUNT(*)')->from('user'); @@ -103,7 +103,7 @@ $query = (new Query())->select(['id', 'count' => $subQuery])->from('post'); $query->select('user_id')->distinct(); ``` -Вы можете вызвать [[yii\db\Query::addSelect()|addSelect()]] для добавления полей. Например: +Вы можете вызвать [[yii\db\Query::addSelect()|addSelect()]] для добавления полей. Например, ```php $query->select(['id', 'username']) @@ -113,7 +113,7 @@ $query->select(['id', 'username']) ### [[yii\db\Query::from()|from()]] -Метод [[yii\db\Query::from()|from()]] указывает фрагмент `FROM` SQL запроса. Например: +Метод [[yii\db\Query::from()|from()]] указывает фрагмент `FROM` SQL запроса. Например, ```php // SELECT * FROM `user` @@ -121,7 +121,7 @@ $query->from('user'); ``` Вы можете указать имена таблиц в виде строки или массива. Имена таблиц могут содержать префикс схемы и/или алиасы -таблиц, как при написании обычного SQL. Например: +таблиц, как при написании обычного SQL выражения. Например, ```php $query->from(['public.user u', 'public.post p']); @@ -137,7 +137,7 @@ $query->from('public.user u, public.post p'); $query->from(['u' => 'public.user', 'p' => 'public.post']); ``` -Кроме имён таблиц, вы можете, также как и в select, указывать подзапросы в виде объекта [[yii\db\Query]]. +Кроме имён таблиц, вы можете, также, как и в select, указывать подзапросы в виде объекта [[yii\db\Query]]. ```php $subQuery = (new Query())->select('id')->from('user')->where('status=1'); @@ -152,14 +152,14 @@ $query->from(['u' => $subQuery]); Метод [[yii\db\Query::where()|where()]] определяет фрагмент `WHERE` SQL выражения. Вы можете использовать один из трёх форматов: -- строковый формат, например: `'status=1'` -- формат массива, например: `['status' => 1, 'type' => 2]` -- формат операторов, например: `['like', 'name', 'test']` +- строковый формат, Например, `'status=1'` +- формат массива, Например, `['status' => 1, 'type' => 2]` +- формат операторов, Например, `['like', 'name', 'test']` #### Строковый формат -Строковый формат - это лучший выбор для простых условий. Он работает так, будто вы просто пишете SQL запрос. Например: +Строковый формат - это лучший выбор для простых условий. Он работает так, будто вы просто пишете SQL запрос. Например, ```php $query->where('status=1'); @@ -281,7 +281,7 @@ $query->where(['id' => $userQuery]); Вы можете использовать [[yii\db\Query::andWhere()|andWhere()]] или [[yii\db\Query::orWhere()|orWhere()]] для добавления дополнительных условий. Вы можете использовать эти вызовы несколько раз для добавления нескольких условий. -Например: +Например, ```php $status = 10; @@ -317,7 +317,7 @@ $query->filterWhere([ ``` Единственное отличие между [[yii\db\Query::filterWhere()|filterWhere()]] и [[yii\db\Query::where()|where()]] -заключается в игнорировании пустых значений переданных в условие в [форме массива](#hash-format). Таким образом +заключается в игнорировании пустых значений, переданных в условие в [форме массива](#hash-format). Таким образом если `$email` будет пустым, а `$username` нет, то приведённый выше код сформирует `...WHERE username=:username`. > Информация: значение признаётся пустым, если это null, пустой массив, пустая строка или строка состоящая из одних пробельных символов. @@ -339,7 +339,7 @@ $query->orderBy([ ]); ``` -В данном коде, ключи массива это имена столбцов, а значения массива это соответствующее направление сортировки. +В данном коде, ключи массива - это имена столбцов, а значения массива - это соответствующее направление сортировки. PHP константа `SORT_ASC` определяет сортировку по возрастанию и `SORT_DESC` сортировка по умолчанию. Если `ORDER BY` содержит только простые имена столбцов, вы можете определить их с помощью столбцов, также @@ -369,7 +369,7 @@ $query->groupBy(['id', 'status']); ``` Если фрагмент `GROUP BY` содержит только простые имена столбцов, вы можете указать их используя строку, также как в -обычном SQL. +обычном SQL выражении. ```php $query->groupBy('id, status'); @@ -501,7 +501,7 @@ $query1->union($query2); [[yii\db\Query::max()|max($q)]], [[yii\db\Query::min()|min($q)]]. Параметр `$q` обязателен для этих методов и могут содержать либо имя столбца, либо выражение БД. -Например: +Например, ```php // SELECT `id`, `email` FROM `user` @@ -520,7 +520,7 @@ $row = (new \yii\db\Query()) > Примечание: метод [[yii\db\Query::one()|one()]] вернёт только первую строку результата запроса. Он НЕ добавляет `LIMIT 1` в генерируемый SQL. Это хорошо и предпочтительно если вы знаете, что запрос вернёт только одну или несколько строк данных (например, при запросе по первичному ключу). Однако, если запрос потенциально может вернут много - строк данных, вы должны вызвать `limit(1)` для повышения производительности, Например: + строк данных, вы должны вызвать `limit(1)` для повышения производительности, Например, `(new \yii\db\Query())->from('user')->limit(1)->one()`. Все методы выборки могут получать необязательный параметр `$db`, представляющий [[yii\db\Connection|соединение с БД]], @@ -566,7 +566,7 @@ $rows = $command->queryAll(); ### Индексация результатов запроса При вызове [[yii\db\Query::all()|all()]] возвращается массив строк индексированный последовательными целыми числами. -Иногда вам может потребоваться индексировать его по другому, например сделать индекс по указанному столбцу или +Иногда вам может потребоваться индексировать его по-другому, например, сделать индекс по указанному столбцу или значением выражения. Вы можете реализовать такое поведение через вызов [[yii\db\Query::indexBy()|indexBy()]] перед вызовом [[yii\db\Query::all()|all()]]. diff --git a/docs/guide/concept-di-container.md b/docs/guide/concept-di-container.md index bcb32b52c1..8346f38c1b 100644 --- a/docs/guide/concept-di-container.md +++ b/docs/guide/concept-di-container.md @@ -14,7 +14,7 @@ dependency injection: * Constructor injection; * Setter and property injection; -* PHP callable injection. +* PHP callable injection; * Controller action injection. @@ -133,6 +133,7 @@ public function actionSend($email, EmailValidator $validator) } ``` + Registering Dependencies ------------------------