Yii2 framework

Выполнение не-SELECT запросов

В методах, описанных выше, вызываются запросы для извлечения данных из базы. Для запросов не возвращающих данные, предназначен метод . Например

Yii$app->db->createCommand('UPDATE product SET active=1 WHERE id=1')->execute();

Метод возвращает количество строк, обработанных SQL запросом.

Для запросов , и , вместо написания чистого SQL, можно вызвать методы , , , соответственно, для создания указанных SQL конструкций. Например

// запрос INSERT INTO uses ('name', 'age') VALUES ('Сергей', 30)
Yii$app->db
         ->createCommand()
         ->insert('user', 'name' => 'Сергей','age' => 30)
         ->execute();

// запрос UPDATE user SET status=1 WHERE age>30
Yii$app->db
         ->createCommand()
         ->update('user', 'status' => 1, 'age > 30')
         ->execute();

// запрос DELETE FROM user WHERE status=0
Yii$app->db
        ->createCommand()
        ->delete('user', 'status = 0')
        ->execute();

Можно также вызвать метод для вставки множества строк за один вызов. Это более эффективно, чем вставлять записи по одной за раз:

Yii$app->db
        ->createCommand()
        ->batchInsert(
            'user',
            'name', 'age'
            
                'Сергей', 30,
                'Николай', 20,
                'Катерина', 25,

            
        )
        ->execute();

Using third-party extensions

'components' => [
    ...
    'fs' => [
        'class' => 'creocoder\flysystem\LocalFilesystem',
        'path' => '@webroot/files'
    ],
    ...

Set filesystem component name in storage configuration:

'components' => ,
    ...

Actions

File Kit contains several Actions to work with uploads.

Upload Action

Designed to save the file uploaded by the widget

public function actions(){
    return [
           'upload'=>[
               'class'=>'trntv\filekit\actions\UploadAction',
               //'deleteRoute' => 'my-custom-delete', // my custom delete action for deleting just uploaded files(not yet saved)
               //'fileStorage' => 'myfileStorage', // my custom fileStorage from configuration
               'multiple' => true,
               'disableCsrf' => true,
               'responseFormat' => Response::FORMAT_JSON,
               'responsePathParam' => 'path',
               'responseBaseUrlParam' => 'base_url',
               'responseUrlParam' => 'url',
               'responseDeleteUrlParam' => 'delete_url',
               'responseMimeTypeParam' => 'type',
               'responseNameParam' => 'name',
               'responseSizeParam' => 'size',
               'deleteRoute' => 'delete',
               'fileStorage' => 'fileStorage', // Yii::$app->get('fileStorage')
               'fileStorageParam' => 'fileStorage', // ?fileStorage=someStorageComponent
               'sessionKey' => '_uploadedFiles',
               'allowChangeFilestorage' => false,
               'validationRules' => ,
               'on afterSave' => function($event) {
                    /* @var $file \League\Flysystem\File */
                    $file = $event->file
                    // do something (resize, add watermark etc)
               }

       ];
}

See additional settings in the corresponding class

Delete Action

public function actions(){
    return [
       'delete'=>[
           'class'=>'trntv\filekit\actions\DeleteAction',
           //'fileStorage' => 'fileStorageMy', // my custom fileStorage from configuration(such as in the upload action)

    ];
}

See additional settings in the corresponding class

View (Download) Action

public function actions(){
    return ;
}

See additional settings in the corresponding class

Upload Widget

Standalone usage

echo \trntv\filekit\widget\Upload::widget(,
    'uploadPath' => 'subfolder', // optional, for storing files in storage subfolder
    'sortable' => true,
    'maxFileSize' => 10 * 1024 * 1024, // 10Mb
    'minFileSize' => 1 * 1024 * 1024, // 1Mb
    'maxNumberOfFiles' => 3, // default 1,
    'acceptFileTypes' => new \yii\web\JsExpression('/(\.|\/)(gif|jpe?g|png)$/i'),
    'showPreviewFilename' => false,
    'clientOptions' => 
]);

Standalone usage — without model

echo \trntv\filekit\widget\Upload::widget([
    'name' => 'filename',
    'hiddenInputId' => 'filename', // must for not use model
    'url' => ,
    'uploadPath' => 'subfolder', // optional, for storing files in storage subfolder
    'sortable' => true,
    'maxFileSize' => 10 * 1024 * 1024, // 10Mb
    'minFileSize' => 1 * 1024 * 1024, // 1Mb
    'maxNumberOfFiles' => 3, // default 1,
    'acceptFileTypes' => new \yii\web\JsExpression('/(\.|\/)(gif|jpe?g|png)$/i'),
    'showPreviewFilename' => false,
    'clientOptions' => 
]);

With ActiveForm

echo $form->field($model, 'files')->widget(
    '\trntv\filekit\widget\Upload',

        'url' => ,
        'uploadPath' => 'subfolder', // optional, for storing files in storage subfolder
        'sortable' => true,
        'maxFileSize' => 10 * 1024 * 1024, // 10 MiB
        'maxNumberOfFiles' => 3,
        'clientOptions' => 

);

Попробуем ¶

Чтобы увидеть всё созданное в работе, откройте в браузере следующий URL:

После ввода верных данных и их отправки, вы увидите страницу с данными, которые вы только что ввели.

Как работает вся эта «магия»

Вы, скорее всего, задаётесь вопросом о том, как же эта HTML-форма работает на самом деле. Весь процесс может показаться
немного волшебным: то как показываются подписи к полям, ошибки проверки данных при некорректном вводе и то, что всё это
происходит без перезагрузки страницы.

Да, проверка данных на самом деле происходит и на стороне клиента при помощи JavaScript, и на стороне сервера.
yii\widgets\ActiveForm достаточно продуман, чтобы взять правила проверки, которые вы объявили в ,
преобразовать их в JavaScript код и использовать его для проведения проверок. На случай отключения JavaScript в браузере
валидация проводится и на стороне сервера как показано в методе . Это даёт уверенность в том, что данные
корректны при любых обстоятельствах.

Подписи для полей генерируются методом , на основе имён свойств модели. Например, подпись генерируется
для свойства . Вы можете модифицировать подписи следующим образом:

Требования к ПО и знаниям ¶

Yii 2.0 требует PHP 5.4.0 и выше и наилучшим образом работает на последней версии PHP 7. Чтобы узнать требования для отдельных возможностей вы можете запустить скрипт проверки
требований, который поставляется с каждым релизом фреймворка.

Для разработки на Yii потребуется общее понимание ООП, так как фреймворк полностью следует этой парадигме. Также стоит
изучить такие современные возможности PHP как пространства имён
и трейты. Понимание этих концепций позволит вам более легко освоиться c Yii 2.0.

Обновление с версии 1.1

Found a typo or you think this page needs improvement?Edit it on github !

Other behaviors ¶

There are several built-in and external behaviors available:

  • yii\behaviors\BlameableBehavior — automatically fills the specified attributes with the current user ID.
  • yii\behaviors\SluggableBehavior — automatically fills the specified attribute with a value that can be used
    as a slug in a URL.
  • yii\behaviors\AttributeBehavior — automatically assigns a specified value to one or multiple attributes of
    an ActiveRecord object when certain events happen.
  • yii2tech\ar\softdelete\SoftDeleteBehavior — provides methods to soft-delete
    and soft-restore ActiveRecord i.e. set flag or status which marks record as deleted.
  • yii2tech\ar\position\PositionBehavior — allows managing records order in an
    integer field by providing reordering methods.

Проверка установки ¶

После установки приложение будет доступно по следующему URL:

Здесь подразумевается, что вы установили приложение в директорию в корневой директории вашего веб сервера
сервер работает локально (). Вам может потребоваться предварительно его настроить.

Вы должны увидеть страницу приветствия «Congratulations!». Если нет — проверьте требования Yii одним из способов:

  • Браузером перейдите по адресу
  • Или выполните команду в консоли:

Для корректной работы фреймворка вам необходима установка PHP, соответствующая его минимальным требованиям. Основное
требование — PHP версии 5.4 и выше. Если ваше приложение работает с базой данных, необходимо установить
расширение PHP PDO и соответствующий драйвер
(например, для MySQL).

Upload Widget events

Upload widget trigger some of built-in blueimp events:

  • start
  • fail
  • done
  • always

You can use them directly or add your custom handlers in options:

'clientOptions' => [ 
    'start' => new JsExpression('function(e, data) { ... do something ... }'),
    'done' => new JsExpression('function(e, data) { ... do something ... }'),
    'fail' => new JsExpression('function(e, data) { ... do something ... }'),
    'always' => new JsExpression('function(e, data) { ... do something ... }'),

UploadBehavior

This behavior is designed to save uploaded files in the corresponding relation.

Somewhere in model:

For multiple files

 public function behaviors()
 {
    return [
        'file' => [
            'class' => 'trntv\filekit\behaviors\UploadBehavior',
            'filesStorage' => 'myfileStorage', // my custom fileStorage from configuration(for properly remove the file from disk)
            'multiple' => true,
            'attribute' => 'files',
            'uploadRelation' => 'uploadedFiles',
            'pathAttribute' => 'path',
            'baseUrlAttribute' => 'base_url',
            'typeAttribute' => 'type',
            'sizeAttribute' => 'size',
            'nameAttribute' => 'name',
            'orderAttribute' => 'order'
        ],
    ];
 }

For single file upload

 public function behaviors()
 {
     return [
          'file' => [
              'class' => 'trntv\filekit\behaviors\UploadBehavior',
              'filesStorage' => 'fileStorageMy', // my custom fileStorage from configuration(for properly remove the file from disk)
              'attribute' => 'file',
              'pathAttribute' => 'path',
              'baseUrlAttribute' => 'base_url',
               ...
          ],
      ];
 }

See additional settings in the corresponding class.

Validation

There are two ways you can perform validation over uploads.
On the client side validation is performed by Blueimp File Upload.
Here is about available options.

On the server side validation is performed by ], where you can configure validation rules for
] that will be used in validation process

Привязка параметров

При создании команды из SQL запроса с параметрами, нужно использовать привязку параметров для предотвращения атак через SQL инъекции. Например,

$product = Yii$app->db
                    ->createCommand('SELECT * FROM product WHERE id=:id AND active=:active')
                    ->bindValue(':id', $_GET'id')
                    ->bindValue(':active', 1)
                    ->queryOne();

В SQL запрос можно добавить один или несколько маркеров (например в примере выше). Маркеры должны быть строкой, начинающейся с двоеточия. Далее нужно вызвать один из следующих методов для привязки значений к параметрам:

Следующий пример показывает альтернативный способ привязки параметров:

$params = ':id' => $_GET'id', ':active' => 1;

$products = Yii$app->db
                     ->createCommand('SELECT * FROM product WHERE id=:id AND active=:active')
                     ->bindValues($params)
                     ->queryOne();

$product = Yii$app->db
                    ->createCommand('SELECT * FROM post WHERE id=:id AND active=:active', $params)
                    ->queryOne();

Привязка переменных реализована через подготавливаемые запросы. Помимо предотвращения атак путём SQL инъекций, это увеличивает производительность, так как запрос подготавливается один раз, а потом выполняется много раз с разными параметрами. Например

$command = Yii$app->db->createCommand('SELECT * FROM product WHERE id=:id');

$product1 = $command->bindValue(':id', 1)->queryOne();
$product2 = $command->bindValue(':id', 2)->queryOne();
$product3 = $command->bindValue(':id', 3)->queryOne();
$command = Yii$app->db
                    ->createCommand('SELECT * FROM product WHERE id=:id')
                    ->bindParam(':id', $id);
$id = 1;
$product1 = $command->queryOne();
$id = 2;
$product2 = $command->queryOne();
$id = 3;
$product3 = $command->queryOne();

Методы выборки #

yii\db\Query предоставляет целый набор методов для разных вариантов выборки:

  • : возвращает массив строк, каждая из которых это ассоциативный массив пар ключ-значение.
  • : возвращает первую строку запроса.
  • : возвращает первый столбец результата.
  • : возвращает скалярное значение первого столбца первой строки результата.
  • : возвращает значение указывающее, что выборка содержит результат.
  • : возвращает результат запроса.
  • Другие методы агрегирования запросов, включая , ,
    , . Параметр обязателен для этих методов и могут
    содержать либо имя столбца, либо выражение БД.

Например,

Все методы выборки могут получать необязательный параметр , представляющий соединение с БД,
которое должно использоваться, чтобы выполнить запрос к БД. Если вы упускаете этот параметр, будет использоваться
компонент приложения . Ниже приведён ещё один пример использования метода
:

При вызове методов выборки yii\db\Query, внутри на самом деле проводится следующая работа:

  • Вызывается yii\db\QueryBuilder для генерации SQL запроса на основе текущего yii\db\Query;
  • Создаёт объект yii\db\Command с сгенерированным SQL запросом;
  • Вызывается выбирающий метод (например ) из yii\db\Command для выполнения SQL запроса и извлечения данных.

Иногда вы можете захотеть увидеть или использовать SQL запрос построенный из объекта yii\db\Query. Этой цели можно
добиться с помощью следующего кода:

Индексация результатов запроса

При вызове возвращается массив строк индексированный последовательными целыми числами.
Иногда вам может потребоваться индексировать его по-другому, например, сделать индекс по указанному столбцу или
значением выражения. Вы можете реализовать такое поведение через вызов перед
вызовом .

Для индексации по значению выражения, передайте анонимную функцию в метод :

Анонимная функция должна принимать параметр , который содержит текущую строку запроса и должна вернуть скалярное
значение, которое будет использоваться как значение индекса для текущей строки.

Пакетная выборка

При работе с большими объемами данных, методы на подобие не подходят, потому что они требуют
загрузки всех данных в память. Чтобы сохранить требования к памяти минимальными, Yii предоставляет поддержку
так называемых пакетных выборок. Пакетная выборка делает возможным курсоры данных и выборку данных пакетами.

Пакетная выборка может использоваться следующим образом:

Метод и возвращает объект yii\db\BatchQueryResult, который
реализует интерфейс и может использоваться в конструкции . Во время первой итерации будет выполнен
SQL запрос к базе данных. Данные будут выбираться пакетами в следующих итерациях. По умолчанию, размер пакета имеет
размер 100, то есть при каждой выборке будет выбираться по 100 строк. Вы можете изменить размер пакета, передав
первый параметр в метод или .

По сравнению с , пакетная выборка загружает только по 100 строк данных за раз в память.
Если вы обрабатываете данные и затем сразу выбрасываете их, пакетная выборка может помочь уменьшить использование памяти.

Если указать индексный столбец через , в пакетной выборке индекс будет сохранятся.
Например,

Локализация и языки #

В Yii приложении определены два языка: и .

На «исходном языке» написаны сообщения в коде приложения. Если мы определяем исходным языком английский, то
в коде можно использовать конструкцию:

Язык перевода определяет, в каком виде будет отображаться текущая страница, т.е. на какой язык будут переведены
оригинальные сообщения. Этот параметр определяется в конфигурации приложения:

Вы можете установить значение текущего языка в самом приложении в соответствии с языком, который выбрал пользователь.
Это необходимо сделать до того, как будет сгенерирован какой-либо вывод, чтобы не возникло проблем с его
корректностью. Используйте простое переопределение свойства на нужное значение:

Формат для установки языка/локали: , где — это двух или трёхбуквенный код языка в нижнем регистре в
соответствии со стандартом ISO-639, а — это код страны в соответствии
со стандартом .

Method Details

beginField()

public method

Begins a form field.

This method will create a new form field and returns its opening tag.
You should call afterwards.

See also:

public string ( $model, $attribute, $options = [] )
$model yii\base\Model

The data model.

$attribute string

The attribute name or expression. See for the format
about attribute expression.

$options array

The additional configurations for the field object.

return string

The opening tag.

endField()

public method

Ends a form field.

This method will return the closing tag of an active form field started by .

public string ( )
return string

The closing tag of the form field.

throws yii\base\InvalidCallException

if this method is called without a prior call.

errorSummary()

public method

Generates a summary of the validation errors.

If there is no validation error, an empty error summary markup will still be generated, but it will be hidden.

See also .

public string ( $models, $options = [] )
$models yii\base\Model|yii\base\Model[]

The model(s) associated with this form.

$options array

The tag options in terms of name-value pairs. The following options are specially handled:

  • : string, the header HTML for the error summary. If not set, a default prompt string will be used.
  • : string, the footer HTML for the error summary.

The rest of the options will be rendered as the attributes of the container tag. The values will
be HTML-encoded using . If a value is , the corresponding attribute will not be rendered.

return string

The generated error summary.

field()

public method

Generates a form field.

A form field is associated with a model and an attribute. It contains a label, an input and an error message
and use them to interact with end users to collect their inputs for the attribute.

See also .

public yii\widgets\ActiveField ( $model, $attribute, $options = [] )
$model yii\base\Model

The data model.

$attribute string

The attribute name or expression. See for the format
about attribute expression.

$options array

The additional configurations for the field object. These are properties of yii\widgets\ActiveField
or a subclass, depending on the value of .

return yii\widgets\ActiveField

The created ActiveField object.

getClientOptions()

protected method

Returns the options for the form JS widget.

protected array ( )
return array

The options.

init()

public method

Initializes the widget.

This renders the form open tag.

public void ( )

registerClientScript()

public method
(available since version 2.0.12)

This registers the necessary JavaScript code.

public void ( )

run()

public method

Runs the widget.

This registers the necessary JavaScript code and renders the form open and close tags.

public void ( )
throws yii\base\InvalidCallException

if and calls are not matching.

validate()

public static method

Validates one or several models and returns an error message array indexed by the attribute IDs.

This is a helper method that simplifies the way of writing AJAX validation code.

For example, you may use the following code in a controller action to respond
to an AJAX validation request:

To validate multiple models, simply pass each model as a parameter to this method, like
the following:

public static array ( $model, $attributes = null )
$model yii\base\Model

The model to be validated.

$attributes mixed

List of attributes that should be validated.
If this parameter is empty, it means any attribute listed in the applicable
validation rules should be validated.

When this method is used to validate multiple models, this parameter will be interpreted
as a model.

return array

The error message array indexed by the attribute IDs.

validateMultiple()

public static method

Validates an array of model instances and returns an error message array indexed by the attribute IDs.

This is a helper method that simplifies the way of writing AJAX validation code for tabular input.

For example, you may use the following code in a controller action to respond
to an AJAX validation request:

public static array ( $models, $attributes = null )
$models array

An array of models to be validated.

$attributes mixed

List of attributes that should be validated.
If this parameter is empty, it means any attribute listed in the applicable
validation rules should be validated.

return array

The error message array indexed by the attribute IDs.

Структура приложения Yii ¶

Ниже приведен список основных директорий и файлов вашего приложения (считаем, что приложение установлено в директорию ):

В целом, приложение Yii можно разделить на две категории файлов: расположенные в и расположенные в других директориях. Первая категория доступна через Web (например, браузером), вторая не доступна извне и не должна быть доступной т.к. содержит служебную информацию.

В Yii реализован архитектурный паттерн MVC,
которая соответствует структуре директорий приложения. В директории находятся Модели,
в расположены Виды, а в каталоге все Контроллеры приложения.

Диаграмма ниже демонстрирует внутреннее устройство приложения.

В каждом приложении Yii есть точка входа в приложение, это единственный PHP-скрипт доступный для выполнения из Web. Он принимает входящий запрос и создает экземпляр приложения.
Приложение обрабатывает входящие запросы при помощи компонентов и отправляет запрос контроллеру. Виджеты используются в Видах для построения динамических интерфейсов сайта.

Установка при помощи Composer ¶

Установка Composer

Если Composer еще не установлен это можно сделать по инструкции на
getcomposer.org, или одним из нижеперечисленных способов. На Linux или Mac
используйте следующую команду:

На Windows, скачайте и запустите Composer-Setup.exe.

В случае возникновения проблем читайте
раздел «Troubleshooting» в документации Composer.
Если вы только начинаете использовать Composer, рекомендуем прочитать как минимум
раздел «Basic usage».

В данном руководстве предполагается, что Composer установлен .
То есть он доступен через команду . Если вы используете из локальной директории,
изменяйте команды соответственно.

Если у вас уже установлен Composer, обновите его при помощи .

После установки Composer устанавливать Yii можно запустив следующую команду в папке доступной через веб:

Установка Yii

Эта команда устанавливает последнюю стабильную версию Yii в директорию . Если хотите, можете выбрать другое
имя директории.

Встроенные компоненты приложения ¶

В Yii есть несколько встроенных компонентов приложения, с фиксированными ID и конфигурациями по умолчанию. Например,
компонент используется для сбора информации о запросе пользователя и разбора его в
определенный маршрут; компонент представляет собой соединение с базой данных,
через которое вы можете выполнять запросы. Именно с помощью этих встроенных компонентов Yii приложения могут обработать
запрос пользователя.

Ниже представлен список встроенных компонентов приложения. Вы можете конфигурировать их также как и другие компоненты приложения.
Когда вы конфигурируете встроенный компонент приложения и не указываете класс этого компонента, то значение по умолчанию будет использовано.

assetManager: используется для управления и опубликования ресурсов приложения

Более детальная информация представлена в разделе Ресурсы;

db: представляет собой соединение с базой данных, через которое вы можете выполнять запросы.
Обратите внимание, что когда вы конфигурируете данный компонент, вы должны указать класс компонента также как и остальные
необходимые параметры, такие как .
Более детальная информация представлена в разделе Объекты доступа к данным (DAO);

: осуществляет обработку PHP ошибок и исключений.
Более детальная информация представлена в разделе Обработка ошибок;

formatter: форматирует данные для отображения их конечному пользователю. Например, число может
быть отображено с различными разделителями, дата может быть отображена в формате .
Более детальная информация представлена в разделе Форматирование данных;

i18n: используется для перевода сообщений и форматирования.
Более детальная информация представлена в разделе Интернационализация;

log: обработка и маршрутизация логов.
Более детальная информация представлена в разделе Логирование;

yii\swiftmailer\Mailer: предоставляет возможности для составления и рассылки писем.
Более детальная информация представлена в разделе Отправка почты;

: представляет собой данные от сервера, которые будет направлены пользователю.
Более детальная информация представлена в разделе Ответы;

: представляет собой запрос, полученный от конечных пользователей.
Более детальная информация представлена в разделе Запросы;

session: информация о сессии

Данный компонент доступен только в веб приложениях.
Более детальная информация представлена в разделе Сессии и куки;

urlManager: используется для разбора и создания URL.
Более детальная информация представлена в разделе Разбор и генерация URL;

user: представляет собой информацию аутентифицированного пользователя.
Данный компонент доступен только в веб приложениях.
Более детальная информация представлена в разделе Аутентификация;

view: используется для отображения представлений.
Более детальная информация представлена в разделе Представления.

Приложения
Контроллеры

Found a typo or you think this page needs improvement?Edit it on github !

Сравнение Yii с другими фреймворками #

Если вы уже знакомы с другими фреймворками, вам наверняка будет интересно сравнить их с Yii.

  • Как и многие другие PHP фреймворки, для организации кода Yii использует архитектурный паттерн MVC (Model-View-Controller).
  • Yii придерживается философии простого и элегантного кода, не пытаясь усложнять дизайн только ради следования каким-либо
    шаблонам проектирования.
  • Yii является full-stack фреймворком и включает в себя проверенные и хорошо зарекомендовавшие себя возможности, такие как
    ActiveRecord для реляционных и NoSQL баз данных, поддержку REST API, многоуровневое кэширование и другие.
  • Yii отлично расширяем. Вы можете настроить или заменить практически любую часть основного кода. Используя архитектуру расширений, легко делиться кодом или использовать код сообщества.
  • Одна из главных целей Yii – производительность.

Yii — не проект одного человека. Он поддерживается и развивается сильной командой и большим сообществом разработчиков,
которые ей помогают. Авторы фреймворка следят за тенденциями веб-разработки и развитием других проектов. Наиболее
подходящие возможности и лучшие практики регулярно внедряются в фреймворк в виде простых и элегантных интерфейсов.

Ссылка на основную публикацию