Как создать приложение на yii
В этой статье попробуем разобраться как устроены приложения на фоеймвлоке Yii. Затем модифицируем стандартный пример "basic", создав ещё одну страницу с простейшим выводом информации из параметра запрова. Но сначала взглянем и опишем структуру файлов в корневом каталоге фреймворка: Такое разбиение по папкам соответствует логике архитектуры MVC. Далее в статье мы будем плотно работать файлами в папках "controllers" и "views".
Создание простейшего сайта
- Приложение обработает запрос и выполнит нужное "действие контроллера".
- Действие контроллера отобразит "представление" пользователю.
Создание действия контроллера
После установки Yii был создан файл controllers/SiteController.php . В нём находится одноимённый класс, который вызывает представления. К примеру, там есть метод "actionAbout", который показывает содержание страницы с информацией "о сайте" из коробочного примера: Воспользуемся им, скопировав и модифицировав, добавив в класс контроллера ещё один публичный метод. В него будет входить только вызов одного метода "render":
В названии метода мы сохранили приставку "action", потому что Yii использует её чтобы распознавать методы-действия и обычные методы. Часть названия после "action" воспринимается как идентификатор действия (после измнения до нижнего регистра: если метод "actionMouse", то идентификатор "mouse").
В метод "render" передаётся название представления и массив с параметрами. Результат отображения передаётся через "return" в приложение, а затем пользователю.
Создание представления
Теперь сделаем представление. То есть оформим страницу, которая будет выводиться при нашем запросе. Для этого необходимо создать файл по адресу views/site/mouse.php .
При вызове метода "render" из действия, он начинает искать PHP файл по адресу views/ID_контроллера/имя_представления.php. В нашем случае контроллер называется "Site" (первая часть называния из "SiteController"), а представление называется "mouse" (вторая часть в нижнем регистре из "actionMouse")
Содержание файла будет таким: При вызове страницы нашего приложения без параметров будет показана всего одна строка "Тише, мыши, кот на крыше". Но как можно заметить по коду метода "actionMouse", он может принимать параметр "$animal". предполагается, что этот параметр может быть передан пользователем, а следовательно необходимо экранировать все HTML небезопасные символы в нём, чтобы избежать XSS атаки.
Для начала попробуем запустить наше приложение без параметров. Для этого обратимся к странице /index.php?r=site/mouse . Параметр "r" в строке адреса зарезервирован в Yii для указания контроллера, который обрабатывает запрос. А через слеш "/" (он же символ "%2F") указывается действие.
На странице по этому адресу можно увидеть текст, обрамлённый шапкой и футером от стандартного сайта примера: Теперь испытаем вывод пользовательских данных, полученных через URL строку параметром. Для этого обратимся к странице /index.php?r=site/mouse&animal=котята . Результат будет таким: Таким образом мы создали простейшее приложение (страницу сайта) на Yii.
Установка YII2
Документация
Вы можете найти подробную инструкцию здесь, я же пробегусь по простой и типичной для Mac OS X установке и настройки среды. У фреймоврка есть подробная документация и описание классов, которое содержит все детали о YII.
От переводчика. Я в свою очередь не имею под рукой яблочного девайса и буду проделывать все действия под Ubuntu (запущенной под VMWare Player).
Установка Composer
Для комфортного использования фреймворка рекомендуется использовать популярный менеджер расширений PHP – Composer. Если он у вас еще не установлен проделайте следующее:
Установка YII2
Теперь используем Composer для установки YII2. Для установки требуется аккаунт на GitHub, если у вас его нет – зарегистрируйтесь.
Давайте назовем наш первый проект «hello»:
YII2 поддерживает два типа приложений для разработки: простые и продвинутые. Для данного урока мы будем использовать простое приложение, оно устанавливается по умолчанию. Шаблон продвинутого приложения поддерживает front-end, back-end и консоль, так же как WordPress, это административная панель и задачи для cron.
Установка и настройка локальной среды разработки
Я использую бесплатное ПО MAMP for OS X с открытым исходным кодом, для разработки. Убедитесь, что MAMP запущен и его web сервер и сервер базы данных запущены. Затем создайте символьную ссылку на директорию с сайтом:
Теперь, если вы настроили все верно, то открыв localhost:8888/hello/web вы увидите простой шаблон приложения YII2 с Bootstrap 3.x.
Эта страница удивит разработчиков, ранее разрабатывающих на YII 1.1, где не был предустановлен Bootstrap последней версии, который прочно занял свое место в сети.
YII архитектура приложения
Одна из ключевых особенностей фреймворка – поддержка паттерна MVC. Это позволяет создавать более структурированный код, который проще понимать, упрощает многие вещи, которые реализуются с трудом на PHP, такие как безопасность и автоматическая кодогенерация. Также это способствует поддержке и повторному использованию кода.
В приложении YII весь трафик направляется на один файл /web/index.php. Этот файл загружает YII, зависимости, а затем запускает наше приложение.
По умолчанию это Index метод в файле /controllers/SiteController.php
Как правило, в контроллерах много методов, но с минимальным количеством кода. Контроллеры управляют доступом, загружают модели и представления. Основная смысловая нагрузка должна лежать на моделях, а представления лишь отображают шаблоны.
По умолчанию YII отображает /views/layouts/main.php в качестве представления для /views/site/index.php. main.php поддерживает html и css структуру страницы с тулбаром и контентом. Внутри main.php происходит вызов содержимого:
Переменная $content будет заменена кодом сгенерированным в /views/site/index.php, который представляет статичную html страницу.
Пишем приложение «Привет мир!»
Включаем красивые URL-адреса
В начале давайте включим красивые адреса при помощи mod_rewrite. Если на домашней странице вы кликнете по кнопке about то увидите адрес подобный этому: localhost:8888/hello/web/index.php?r=site%2Fabout. Мы же сейчас его приведем к такому виду localhost:8888/hello/web/site/about.
В директории config хранятся настройки всей вашей среды: настройки веб приложения, консольного приложения и настройки баз данных. Изменим файл /config/web.php следующим образом:
Затем необходимо создать в директории /web, где хранится наш index.php, файл .htaccsess, со следующим содержимым:
Убедитесь, что в MAMP включен mod_rewrite, если же возникли проблемы посмотрите ветку на stackoverflow.
В вашем браузере перейдите по адресу localhost:8888/hello/web/site/about, теперь там вы должны увидеть страницу About простого приложения YII.
Создаем экшн
Эта функция будет искать параметр target в адресе url для его вывода на экран. В случае его отсутствия выведется просто «World». В фреймворке YII экшены реализованы как методы с префиксом actionИмяЭкшена. В класссе SiteController мы использовали public function actionSay для создания экшена Say.
Стандартным поведением метода render является поиск файла в views/ControllerID/ViewName.php поэтому давайте создадим в /views/site/ файл say.php:
Этот шаблон выведет строку «Hello +$(target)», где $(target) — переменная переданная в url. Для обеспечения безопасности она попадает не на прямую в строку, а в начале проверяется на вредоносный код.
Если вы теперь посетите localhost:8888/hello/web/site/say?target=Tuts%20Readers, то увидите следующее:
Это простой пример реализации MVC модели фреймворка. Более детально вы можете ознакомиться с данным примером на сайте фреймворка в официальной документации.
А теперь давайте зальем наше приложение на GitHub и запустим на продакшн-сервере.
Настройка вашей удаленной среды
Простое приложение YII должно запускаться на серверах Apache и Nginx «из коробки», я буду приводить инструкции по запуску на Apache, про Nginx вы сможете найти здесь.
Создаем репозиторий на GitHub
Теперь войдите удаленно по ssh на ваш сервер при помощи IP или доменного имени
Обновите кофигурацию, установите Git, включите mod_rewrite для Apache и mcrypt для PHP.
Настройка доступа удаленного сервера к GitHub
Теперь мы настроим pull запросы с GitHub. Вначале установите Git
Теперь мы создадим группу для www, добавим данные и GitHub пользователей и настроим их права:
Теперь создадим ключ для синхронизации с репозиторием:
Если все правильно сконфигурированно то вы увидите:
По мере увеличения количества кода вы через репозиторий сможете легко синхронизировать код локальной машины и продакшн-сервера. Это гораздо проще чем синхронизировать архивом или вручную, вы убедитесь в этом сами в процессе дальнейшего обучения.
Создание конфигурации сайта для Apache
Создадим конфигурационный файл:
Измените доменное имя на ваше:
Включите ваш сайт:
What You'll Be CreatingЕсли вы задаетесь вопросом: "что такое Yii?" посмотрите мой прошлый туториал Введение в Yii фреймворк, который объясняет преймущества Yii и демонтсрирует новые возможности Yii 2.0 вышедшом в Октябре 12, 2014.
Данный туториал проведет вас через установку Yii 2.0, установку локального енвайромента разработчика, создание просто Хеллоу-Ворлд приложения, настройку вашего удаленного продакшен енвайромента для хостинга и деплоинг вашего кода из GitHub репозитория.
Установка Yii 2.0
Документация
Вы можете найти подробную инструкции об установке здесь; Я же помогу вам проти через основы установки енвайромента разработчика на Mac OS X. Yii 2.0 имеет свое Полное Руководство (PDF) и Референс Классов, которые объясняют каждую деталь Yii.
Установка Composer
Yii2 требует Composer, популярный менеджер зависимостей для PHP. Если у вас он не установлен, запустите следующие:
Установка Yii2
Дальше, используйте Composer, что-бы установить Yii2. Установка требует что-бы вы использовали свои собственные данные от GitHub аккаунта; Зарегистрируйтесь если у вас нету своего аккаунта.
Давайте назовем наш первый проект "hello":
Yii2 предоставляет два различных шаблона установки, в зависимости от приложения вы разрабатываете: "basic" и "advanced". Для данного туториала мы воспользуемся "basic" приложением, которое установлено по умолчанию. В расширенном шаблоне приложения предусмотрены точки доступа для фронтенда, бэкенда и консоли для более продвинутого веб-приложения, такого как блог WordPress, административная панель управления и задачи cron.
Настройка локальной среды разработки
Я использую бесплатный MAMP для OS X для разработки LAMP. Убедитесь, что MAMP запущен, а его серверы веб-сайтов и базы данных активны. Затем создайте символическую ссылку для MAMP в каталог приложений для Sites :
Эта страница, скорее всего, понравится разработчикам Yii 1.1, у которых не была предварительно настроенная поддержка последней версии Bootstrap.
Архитектура приложений Yii
Одной из наиболее важных особенностей Yii Framework является то, что он предоставляет Model View Controller для PHP. Это не только обеспечивает более структурированную среду программирования и более понятный код, но и упрощает ряд вещей, которые трудно сделать в PHP, например, безопасность и автоматическое создание кода. Это также делает наш код более легким для расширения и повторного использования.
В приложении Yii мы направляем весь трафик на один файл: /web/index.php . Этот встроенный файл загружает Yii, любые зависимости, а затем запускает ваше приложение.
По умолчанию это метод Index в /controllers/SiteController.php :
Как правило, в контроллерах много методов, но с минимальным кодом, как указано выше. Контроллеры управляют доступом, используют модели и рендерят представления. Основная часть интеллекта должна быть встроена в ваши модели, а представления, как правило, должны производить относительно простые операции с шаблонами.
По умолчанию Yii будет отображать /views/layouts/main.php вокруг вашего индексного представления в /views/site/index.php . Макет main.php обеспечивает структуру HTML и CSS на странице, например. панели инструментов и области содержимого. Внутри main.php вы увидите краткий вывод контента:
Эта переменная $content будет заменена сгенерированным кодом из /views/site/index.php , который в настоящее время является статическим кодом HTML, который генерирует Congratulations! страница, показанная выше.
Создаем Hello World!
Включение красивых URL-адресов
Подкаталог config включает конфигурацию среды для ваших веб-приложений и консольных приложений, а также будущие настройки базы данных. Измените /config/web.php , чтобы добавить urlManagement к текущему веб-приложению. Добавьте следующий раздел urlManager в массив компонентов:
Затем создайте файл .htaccess в /web , где существует основной файл index.php :
Убедитесь, что mod_rewrite запущен локально на MAMP; если нет, ознакомьтесь с этим руководством на Stack Overflow.
Пишем экшен Hello World!
Это будет искать параметр URL, называемый target для вывода на экран. Если нет целевого параметра, он будет повторять World. В Yii действия определяются как метод с префиксом "action", за которым следует имя действия. В этом классе SiteController мы используем public action actionSay . Yii использует префикс "action" для того, чтобы отличать методы действий от других методов.
Поведение метода рендеринга по умолчанию будет искать файл во views/ControllerID/ViewName.php . Итак, внутри /views/site/ , создайте файл представления say.php :
Это файл просмотра шаблонов, чтобы повторить статический HTML-тег h1 с Hello, за которым следует переменная target. Примечание. Мы экранируем переменную target для защиты аргумента параметра URL-адреса от вредоносного кода.
Это очень простой пример контроллера Yii2 Model View Controller. Вы можете прочитать более подробное описание демонстрации Hello World и Yii2 MVC здесь.
Теперь давайте настроим наше приложение на GitHub и развернем его на продакшен сервер.
Настройка среды удаленного хостинга
Базовое приложение Yii должно отлично работать с Apache или Nginx, я дам инструкции для Apache, а здесь вы можете найти инструкции для Nginx.
Создать репозиторий на GitHub
После того как я создал шаблон приложения Yii, я создаю репозиторий на Github:
Примечание. Сначала немного проще копировать и вставлять Yii2 .gitignore из GitHub в локальный файл
/Sites/hello/.gitignore, а не создавать сайт с ним удаленно и объединять его локально
Я использую приложение Mac OS X GitHub, но вы также можете использовать командную строку для инициализации репозитория. Ниже я следую инструкциям по добавлению существующего проекта из GitHub с помощью командной строки (замените «youraccount» на ваше имя учетной записи GitHub):
Настройка сайта Apache на вашем сервере
Если у вас еще нет сервера LAMP или облака, следуйте моим общим инструкциям по установке Ubuntu для начала работы. После того, как у вас есть свой IP-адрес, измените свои DNS-записи, чтобы иметь точку записи A на вашем сервере.
Затем войдите на свой сервер через IP-адрес или доменное имя:
Обновите конфигурацию, установите Git, включите mod_rewrite для Apache и mcrypt для PHP:
Настройка доступа GitHub на удаленном сервере
Теперь мы настроим пользователя для получение кода из Github, который может обслуживаться Apache. Сначала установите git на свой сервер.
Затем мы создадим группу для www, добавим в нее www-data и пользователей GitHub и предоставим им право собственности на наши веб-каталоги.
Затем мы создаем ключ для пользователя, который мы совместно используем GitHub для синхронизации кода:
Перейдите на страницу настроек вашего репозитория GitHub с ключами и добавьте этот ключ в свой репозиторий:
Как только вы добавите его, вы увидите его здесь:
Наконец, вы можете клонировать дерево на ваш производственный сервер:
Если вы правильно настроили GitHub, он должен выглядеть так (если нет, просмотрите это):
По мере расширения кодовой базы в этой серии уроков и пуша обновлений с вашего локального компьютера вы сможете синхронизировать их на удаленном сервере с помощью git pull. Это проще, чем вытащить tarball или синхронизирующий код вручную - и станет более полезным, поскольку эта серия руководств будет продолжена с более поздними модулями.
Создание конфигурации сайта Apache
Создайте файл конфигурации сайта Apache:
Настройте эту конфигурацию для своего доменного имени:
Включите свой сайт:
Поздравляем! Теперь мы готовы изучить более сложные функции в Yii2. Если вы хотите узнать, когда будет готов следующий учебник по Yii2, подпишитесь на @tutspluscode или @reifman в Twitter или просмотрите мою страницу автора. Моя страница автора будет включать все статьи из этой серии сразу же после их публикации.
Если у вас есть какие-либо вопросы или исправления в этом уроке, разместите их ниже в комментариях.
Этот урок поможет вам познакомиться с Yii2. В данный момент Yii2 абсолютно не готов для продакшена. Я не рекомендую использовать его в рабочих проектах.
Начнём
Сегодня авторы Yii Framework анонсировали публичное превью Yii2. Между Yii1 и Yii2 довольно много изменений.
Этот урок описывает создание простого блога на Yii2. В процессе мы будем скачивать и устанавливать Yii2, создавать базовое приложение, подключаться к базе данных и описывать логику создания, обновления, чтения и удаления постов.
Для продолжения вам потребуется:
- Вебсервер, например Apache или Nginx. Я буду использовать Nginx. Использование Apache будет отличаться незначительно, поэтому не волнуйтесь если у вас нет поблизости сервера с Nginx.
- Север базы данных для нашего приложения. Я выбрал MySQL 5.5
- Базовые знания PHP. Я постараюсь объяснять всё так просто, как это возможно, но чем лучше вы знаете PHP, тем проще вам будет двигаться дальше.
- Базовые знания Yii или MVC. Если у вас нет никакого опыта работы с MVC, то я рекомендую вам прочесть основы MVC. Вы можете прочитать этот урок и без знания MVC, но вам будет гораздо легче понимать происходящее, разбираюсь в теме MVC.
Вперёд!
Я буду предполагать, что у вас уже есть настроенный вебсервер. В уроке я буду использовать следующие пути и адреса:
Скачиваем Yii2
Получить копию Yii2 с Github можно либо клонировав репозиторий, либо скачав архив.
После распаковки Yii2, перейдите в папку /dir/to/yii2/framework
И запустите следующую команду для создания базового веб-приложения, ответив Yes на первый вопрос.
Это эквивалент команде создания веб-приложения в Yii 1.x. Теперь перейдите в /var/www/yii2. Вы увидите одну папку и один файл.
Перед тем, как запустить наш сайт, мы должны внести некоторые модификации в файл index.php. На мой взгляд, там есть несколько спорных решений. Надеюсь, они будут исправлены до финального релиза Yii2, чтобы сделать его более дружественным в установке.
Измените index.php следующим образом:
Посмотрим на то, что мы изменили:
Во-первых, мы должны изменить путь к файлу framework/yii.php. По умолчанию считается, что он лежит в той же директории. Возможно, так и бывает, но нам нужно указать точный путь к Yii2.
Во-вторых, мы обновляем путь к конфигурационному файлу, чтобы он использовал __FILE__ вместо __DIR__. Это необходимо, чтобы бы ваше приложение могло запуститься.
Перед тем как мы продолжим, важно отметить кое-что новое в Yii — Namespaces
Смысл пространств имён в инкапсуляции кода в логические единицы, чтобы избежать коллизий между различными кодовыми базами. Допустим, у вас есть два класса, оба называются Foo и оба имеют метод Bar. Если они будут располагаться в различных пространствах имён, то вы сможете вызывать их независимо друг от друга без каких-либо коллизий.
Пространства имён это простой способ избежать коллизий в коде. Я рекомендую вам прочитать о них, так как Yii2 будет полностью построен на этом принципе.
Теперь вы создали первое приложение! Перейдите на адрес, по которому у вас расположен yii2 и вы увидите следующую страницу.
Ваше первое приложение на Yii2!
В отличии от Yii 1.x, базовое приложение Yii2 не такое восхищающее. Давайте научим его делать немного больше.
Первым делом откроем файл /protected/views/layout/main.php и заменим его содержимое:
Теперь обновите страницу. Видите? Разве не всё становится лучше с Twitter Bootstrap? Опять же, не так и много изменилось между Yii1 и Yii2. У вас по-прежнему есть переменная $content для отображения контента во view. Однако, Yii::app() заменили на Yii::$app. И напомню ещё раз — всё в Yii2 разделено по пространствам имён, поэтому важно запомнить обращаться ко всему по их пространству имён, а не просто вызывать «сырые» классы.
Теперь займёмся настоящим кодингом!
Подключаемся к базе данных
Для этого приложения у нас будет лишь простая таблица Posts, в которой мы будем хранить посты нашего блога.
Создаём таблицу в базе данных
Войдите в MySQL и создайте пользователя и базу данных с именем yii2. Затем выполните следующий запрос для обновления структуры:
Обновляем конфиг
Перейдите в папку /var/www/yii2/protected/ и откройте файл config.php в любимом редакторе. Замените всё его содержимое на это:
Если вы знакомы с Yii, то заметите сильное улучшение относительно тех монструозных конфигов, которые генерировал Yii1. Несмотря на то, что структура осталась прежней, это всё, что нам нужно для подключения к базе данных.
Создаём модель Post
Создайте новую папку models в папке protected, а затем создайте в ней файл Post.php со следующим кодом.
Если вы знакомы с Yii1, единственное что изменилось в ActiveRecord (по крайней мере в этом примере), это то, что функции primaryKey и tableName теперь являются статическими методами. Всё остальное в основном осталось прежним. По большей части, ActiveRecord осталась нетронутой.
Самой важной частью класса является включение пространства имён app\models. Это говорит Yii как мы можем ссылаться на этот файл.
В отличии от Yii1, где вы можете просто вызвать имя класса, Yii2 использует другой тип автозагрузки файлов, который требует от вас точного указания того, что вы собираетесь использовать. Это может несколько замедлить разработку (Попытки запомнить всегда подключать \yii\framework\web\Html вместо простого вызова CHtml могут утомить), но в тоже время сделает Yii2 значительно быстрее по той причине, что автозагрузчик теперь не должен искать по всему фреймворку, чтобы загрузить какой-то один класс. По крайней мере, в теории.
После того, как мы поместили модель Post в пространство имён, мы можем начать создавать CRUD-приложения.
Просмотр всего
Отмечу несколько вещей. Во-первых, ::model()-> исчезло. Данные из ActiveRecord и модели теперь доступны по прямому вызову метода. Например, $post->find()->all(). Несмотря на то, что лично я люблю Post::model()->findAll(), новый способ доступа к данным выглядит более стандартным и легким для чтения.
Во-вторых, findAll был заменён на find()->all(). Все методы поиска теперь исходят от find() или findBySql().
В-третьих, $this->render() теперь требует echo в начале строки. Лично я ненавижу это. Это очень похоже на CakePHP и, на мой взгляд, избыточно. Идея, стоящая за этим изменением, в том, что всё, что вы хотите показать пользователю должно быть отправлено через echo, иначе должно быть просто помещено в переменную для дальнейших действий. Я предпочитаю старый способ рендеринга в переменную (передачу параметра в метод рендеринга), но, возможно, я сживусь в этим.
Если вы знакомы с пространствами имён, вы, вероятно, закричите на меня, спрашивая почему я не включил модель Post. Если же не знакомы, то, возможно, будете удивлены тем, что получили ошибку. Причина проста. _Вы должны помнить пространства имён в Yii2_. Всё что вы хотите использовать должно быть чётко указано, если это не было сделано ранее.
Добавьте следующую строку в начале файла SiteController. Затем обновите страницу.
Теперь добавим разметку для отображения постов. Откройте файл protected/views/site/index.php и замените его содержимое на следующее:
Хммм, выглядит иначе, не так ли? CHtml::link() пропало, вместо него появился хелпер Html. К счастью, структура CHtml::link и Html::a не отличается. Так что просто заполняйте параметры.
Читаем
Чтение это просто, поэтому давайте разберёмся с ним. Создайте новый метод в SiteController со следующим определением:
Теперь перейдите к ?r=site/read&id=1. Вы увидите HelloWorld на экране. Видите? Хорого. Это значит, что наш метод был вызван. Теперь обновим его, чтобы показывать данные из базы.
Теперь дополним действие read
Далее, мы должны создать новый файл protected/views/site/read.php и добавить в него следующий код для отображения поста.
Теперь, на главной странице нажмите на «Example Post». Вуаля! Теперь вы можете просматривать посты в блоге!
Удаление
Удаление постов так же просто, поэтому им и займёмся. Создайте новый метод со следующим кодом:
Во-первых, опишем метод
Несколько замечаний касательно Yii2. Первое, перенаправление теперь делается с помощью Yii::$app->getResponse->redirect() вместо $this->redirect(). Данное решение имеет смысл в плане организации кода, но это так долго печатать! В добавок, это создаёт ощущение перегруженности $app. В тоже время, определение метода осталось прежним.
Второе, setFlash теперь доступно через $app вместо app(). Вы должны теперь к этому привыкнуть. =)
Теперь мы закончили с удалением. Давайте вернёмся к protected/views/site/index.php и поймаем уведомления, которые послали.
Просто добавьте это после первого тэга hr
Теперь попробуйте удалить «Example Post». Довольно просто, да? Теперь вы поняли идею Yii::$app, правда?
Создаём
Теперь перейдём к весёлым вещаем, созданию новых записей в нашем блоге. Мы должны сделать несколько вещей для создания. Во-первых, мы собираемся использовать ActiveForm для работы с формой. Во-вторых, мы должны ловить и валидировать данные в $_POST. И, наконец, после этого мы должны сохранить данные в базу. Начнём.
Во-первых, сделаем view для формы. Создайте файл protected/views/site/create.php. Так как мы собираемся использовать виджет, то необходимо создать папку «assets» в корне приложения и сделать её доступной для записи вебсервером. Chmod 755 обычно решает этот вопрос. Затем добавьте определение метода в SiteController.
Выглядит более-менее также, как и в Yii1. Но всё же есть несколько различий. Во-первых, у Controller теперь есть метод «populate» ($this->populate($ds, $model)), который в теории должен избавить нас от всего этого убожества с isset($_POST). Код создания нового поста будет выглядеть так:
Наконец, я наткнулся на ещё одну преграду — сохранение в базу с уникальным ID. Так что и это мы должны делать вручную. Если кто-то выяснит как это решить — не стесняйтесь оставить комментарий.
Давайте обновим модель Post, чтобы заставить уникальный первичный ключ работать. Просто добавьте этот код в конец файла:
Всё что он делает, это проверяет создаётся ли новая запись и если да, то получает максимальный ID из базы, инкрементирует его и использует в качестве ID.
Я пробовал несколько разных комбинаций (NULL, 0, _ for $model->id, но по каким-то причинам ActiveRecord отказывалась сохранять модель с ID отличным 0. У меня нет никаких мыслей почему это не работает).
(На самом деле, автор просто забыл указать AUTO_INCREMENT у поля id. Но я решил оставить эту часть как небольшой урок невнимательности. Прим. переводчика.)
С этим разобрались, теперь создаём view.
Вот и всё, теперь вы можете сохранять модель. Но кое-что странно, не так ли? Например, почему время создания и обновления — 0? Что если мы отправим пустую форму?
Давайте исправим эти две ошибки, прежде чем продолжим. Откроем модель Post и добавим следующий метод:
Этот метод делает поля title и content обязательным. Теперь при попытке сохранения модели, вы получите ошибку, если одно из этих полей пустое. И так как мы используем bootstrap, то очень легко увидеть в чём именно была ошибка. Попробуйте!
Далее мы должны автоматически выставлять верное время.
Во-первых, добавим ещё одну use-строку вверху нашей модели.
Во-вторых, обновим метод beforeSave для автоматизации процесса.
Внутри блока if ($this->isNewRecord) добавьте строку:
Перед return parent::beforeSave($insert) добавьте:
В итоге метод должен иметь такой вид:
Попробуем сохранить ещё раз. Теперь модель валидирует поля title и content, а также автоматически заполняет время создания и обновления. Перейдём к обновлению.
Обновляем
Действие обновления будет практически идентично созданию. Единственное отличие в том, как мы определяем модель, которую будем использовать.
В действии создания мы делали так:
В действии обновления сделаем так:
Я люблю бросать исключения когда что-то не найдено, поэтому моё действие будет делать некоторые проверки на ошибки. После их добавления код должен выглядеть как-то так:
Заметили кое-что интересное? Мы по-прежнему используем view для создания, потому что они абсолютно одинаковы. Круто, да?
Выводы
Итак, у нас получилось. За несколько часом мы прошли путь от полного незнания Yii2 к простому CRUD-приложению на нём. Используя эти знания, вы легко можете расширить приложения, добавив в него поддержку пользователей, аутентификацию, дополнительные таблицы в базе данных и даже куда более мощные фичи.
Yii2 очень похож Yii 1.x, однако в нём много изменений, которые вы должны научиться использовать. Так как Yii2 пока не очень хорошо задокументирован, я написал эту статью лишь на основе исходного кода на Github. Код фреймворка очень хорошо документирован. И так как методы очень похожи на Yii1, то было несложно найти то, что мне было нужно.
Как мы обнаружили, есть ещё несколько проблем, которые должны быть исправлены (либо через лучшее документирование ActiveRecord, либо через исправление того, что сломано).
Читайте также: