yakoffka.ru
    грабли, костыли и велосипеды php, css, html, js и прочего

    Yii 2.0 часть 1. Установка и первые шаги

    YiiYii 2.0. конспект-памятка курса 'Полное руководство по Yii 2.0' с незначительными вариациями. Оригинал на русском языке можно найти здесь.

    АЛАРМА!!! Данная памятка являет собой откровенный копипаст! Для ознакомления с первоисточником перейдите по ссылке, указанной выше.

    копипастил Капустин Яков

    оглавление

    Yii – это универсальный фреймворк и может быть задействован во всех типах веб-приложений. Благодаря его компонентной структуре и отличной поддержке кэширования, фреймворк особенно подходит для разработки таких крупных проектов, как порталы, форумы, CMS, магазины или RESTful-приложения. На данный момент существует две основные ветки Yii: 1.1 и 2.0. Ветка 1.1 является предыдущим поколением и находится в состоянии поддержки. Версия 2.0 – это полностью переписанный Yii, использующий последние технологии и протоколы, такие как Composer, PSR, пространства имен, трейты и многое другое. 2.0 — текущее поколение фреймворка.

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

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

    На моей машине (ubuntu 16.04) уже установлены веб-сервер, PHP 7, MySQL и Composer (глобальная версия).

    1. Переходим на страницу загрузок yii. Существуют два основных варианта установки: базовый и продвинутый. Начнём с начала и выберем базовый.
    2. Выбираем предпочтительную, с точки зрения разработчиков, установку yii при помощи composer.
    3. Открываем терминал и переходим в директорию, в которую будем устанавливать фреймворк:
      cd /var/www/html
    4. Создаём новую директорию и переходим в неё:
      mkdir yii
      cd yii
    5. Проверяем наличие установленного плагина:
      composer global require "fxp/composer-asset-plugin:~1.3"
      cd yii
    6. Выбираем установку yii при помощи composer. Так как композер на моей машине установлен глобально, вводим адаптированную для этого случая команду (где 'b2' - имя директории с новым проектом yii2-app-basic):
      composer create-project yiisoft/yii2-app-basic b2
    Рис. 1 Установка плагина
    Рис. 1 Установка плагина
    Рис. 2 Установка Yii при помощи composer
    Рис. 2 Установка Yii при помощи composer

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

    Так как Yii приложения организованы согласно шаблону проектирования модель-представление-контроллер (MVC), основное внимание уделим директориям 'models', 'views' и 'controllers'.

    Модели представляют собой данные, бизнес логику и бизнес правила;

    Представления отвечают за отображение информации, в том числе и на основе данных, полученных из моделей;

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

    В отличие от фреймворка как только приложение установлено, оно становится целиком вашим. Вы можете изменять его код как угодно.

    Для получения новой страницы с отображением $message необходимо создать действие контроллера и представление. Действие say читает параметр message из запроса и отображает его значение пользователю. Если в запросе не содержится параметра message, то действие будет выводить «Привет».

    Действия объявляются в контроллерах. Объявим действие say в уже существующем контроллере SiteController, который определен в файле класса controllers/SiteController.php.

    Yii использует префикс action чтобы различать методы-действия и обычные методы. Название после префикса action считается идентификатором соответствующего действия. Объявим действие say как метод actionSay в классе SiteController:

    дополнение файла controllers/SiteController.php:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15

      
    ...

      
    /**
       * Создание Действия "say".
       *
       * @return string
       */
      
    public function actionSay($message="Привет!")
      {
          return 
    $this->render("say", ["message"=>$message]);
      }

      ...
      

    Идентификаторы действий задаются в нижнем регистре. Если идентификатор состоит из нескольких слов, они соединяются дефисами, то есть create-comment. Имена методов действий получаются путём удаления дефисов из идентификатора, преобразования первой буквы каждого слова в верхний регистр и добавления префикса action. Например, идентификатор действия create-comment соответствует методу actionCreateComment.

    Метод действия принимает параметр $message, который по умолчанию равен 'Привет!'. Когда приложение получает запрос и определяет, что действие say ответственно за его обработку, параметр заполняется одноимённым значением из запроса.

    Внутри метода действия, для вывода отображения представления с именем say, используется метод render(). Для того, чтобы вывести сообщение, в отображение передаётся параметр message. Результат отображения при помощи return передаётся приложению, которое отдаёт его пользователю.

    Представления являются скриптами, которые используются для формирования тела ответа. Создадим представление say, которое будет выводить параметр message, полученный из метода действия:

    Когда метод render() вызывается в действии, он будет искать PHP файл с именем вида views/ControllerID/ViewName.php.

    Создаём файл views/site/say.php:

    создание views/site/say.php:
    1
    2
    3
    4
    5
    <?php
      
    use yii\helpers\Html;
      echo 
    Html::encode($message);  // Вызов статического метода encode() класса Html
    ?>
      

    Фактически, представление say является простым PHP скриптом, который выполняется методом render(). Содержимое, выводимое скриптом представления, будет передано пользователю приложением.

    Проверим правильность написания, открыв следующий URL: /index.php?r=site/say.

    Проверим правильность написания кода, открыв URL с параметром message: /index.php?r=site/say&message=Строка, переданная в параметре message с помощью GET..

    Новая страница использует ту же шапку и футер, что и другие страницы, потому что метод render() автоматически вставляет результат представления say в, так называемый, макет views/layouts/main.php.

    Рис. 3 Вывод строки, переданной в параметре message с помощью GET
    Рис. 3 Вывод строки, переданной в параметре message с помощью GET

    Параметр r в нашем URL требует дополнительных пояснений. Он связан с маршрутом (route), который представляет собой уникальный идентификатор, указывающий на действие. Его формат ControllerID/ActionID. Когда приложение получает запрос, оно проверяет параметр r и, используя ControllerID, определяет какой контроллер следует использовать для обработки запроса. Затем, контроллер использует часть ActionID, чтобы определить какое действие выполняет реальную работу. В нашем случае маршрут site/say будет соответствовать контроллеру SiteController и его действию say. В результате, для обработки запроса будет вызван метод SiteController::actionSay().

    Как и действия, контроллеры также имеют идентификаторы, которые однозначно определяют их в приложении. Идентификаторы контроллеров также используют правила именования. Имена классов контроллеров получаются путём удаления дефисов из идентификатора, преобразования первой буквы каждого слова в верхний регистр и добавления в конец Controller. Например, идентификатор контроллера post-comment соответствует имени класса контроллера PostCommentController.

    В этом процессе никак не была задействована модель, так как в качестве данных выступает лишь простой параметр message.

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

    Создание модели

    Начнём с создания модели. Опишем в ней класс EntryForm, который расширяет класс yii\base\Model, являющийся частью фреймворка и обычно используется для работы с данными форм.

    Создание файла models/EntryForm.php с объявлением класса модели EntryForm:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php

      
    namespace app\models;

      use 
    yii\base\Model;

      Class 
    EntryForm extends Model
      
    {
        public 
    $name;
        public 
    $email;

        public function 
    rules(){
          return [
            [[
    "name","email"], "required"],
            [
    "email","email"],
          ];
        }
      }
      

    Класс EntryForm содержит 2 публичных свойства name и email, которые используются для хранения данных, введённых пользователем. Он также содержит метод rules(), который возвращает набор правил проверки данных. Правила, объявленные в коде выше означают следующее:

    1. Поля name и email обязательны для заполнения;
    2. В поле email должен быть правильный адрес email.

    Создание действия

    Создание действия entry в контроллере site.

    Добавление действия entry в контроллере site (controllers/SiteController.php):
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

      
    ...
      use 
    app\models\EntryForm;  // импортируем новую модель
      
    ...

      
    /**
       * Создание Действия "entry"
       *
       * @return ?
       */
      
    public function actionEntry(){
        
    $model=new EntryForm();
        if(
    $model->load(Yii::$app->request->post()) && $model->validate()){
          
    // данные (? получены и) прошли проверку
          // здесь делаем с этими данными что-то полезное
          
    return $this->render("entry-confirm", ["model"=>$model]);
        }else{
          
    // данные не были отправлены либо не прошли проверку
          
    return $this->render("entry", ["model"=>$model]);
        }
      }

      ...
      

    Действие создает объект EntryForm. Затем оно пытается заполнить модель данными из массива Array, доступ к которому обеспечивает Yii при помощи yii\web\Request::post(). Если модель успешно заполнена, то есть пользователь отправил данные из HTML-формы, то для проверки данных будет вызван метод validate().

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

    Yii::$app представляет собой глобально доступный экземпляр-одиночку приложения (singleton). Одновременно это Service Locator, дающий доступ к компонентам вроде request, response, db и так далее. В коде выше для доступа к данным из $_POST был использован компонент request.

    Создание представлений

    Создание файла views/site/entry-confirm.php с описанием представления entry-confirm):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
      
    use yii\helpers\Html;

      echo 
    "
      <p>Нами было получено донесение от Вас, в котором Вы сообщаете своё имя ("
    .Html::encode($model->name).") и email (".Html::encode($model->email).").
      </p><p>
        Настоящим сообщаем Вам, что сведения приняты, а их достоверность будет проверена в ближайшее время. Ждите ответа.
      "
    ;
      
    Создание файла views/site/entry.php с описанием представления entry):
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
      
    use yii\helpers\Html;
      use 
    yii\widgets\ActiveForm;

      
    $form=ActiveForm::begin();

      echo 
    $form->field($model,"name")->label("Ваше имя");
      echo 
    $form->field($model,"email")->label("Ваш адрес электронной почты");

      echo 
    "
      <div class='form-group'>
        "
    .Html::submitButton('Отправить',['class'=>'btn btn-primary'])."
      </div>
      "
    ;

      
    ActiveForm::end();
      

    Для построения HTML-формы представление использует мощный виджет ActiveForm. Методы begin() и end() выводят открывающий и закрывающий теги формы. Между этими вызовами создаются поля ввода при помощи метода field(). Первым идёт поле для 'name', вторым — для 'email'.

    Для генерации кнопки отправки данных вызывается метод yii\helpers\Html::submitButton().

    Проверка

    Для проверки откроем следующий URL: /index.php?r=site%2Fentry.