Создание панели администратора с помощью Fuel PHP Framework



Создание панели администратора с помощью Fuel PHP Framework

В первой части этой серии статей мы изучили основы Fuel PHP Framework. Во второй части поговорим о более серьезных темах. Мы создадим панель администратора для нашего приложения, пройдемся по основам использования ORM и научимся пользоваться пакетом Authentication для ограничения прав доступа. Также вы можете посмотреть уроки по php.
Итак, начнем!

Введение

После написания первой статьи Fuel был переименован в FuelPHP. Кроме того, в отличие от первой статьи, которая базировалась на версии 1.0.1, эта статья требует версию 1.1.0. Поэтому кое-что будет незначительно отличаться. Все теоретические сведения, которые Вы познали в первой статье, до сих пор вполне актуальны и почти не изменились.

Шаг 1 – Настройка Oil

Если Вы еще не установили утилиту для командной строки Oil и являетесь пользователем Linux, Mac, Solaris и т.д., то сделайте это с помощью следующей команды:

Шаг 2 – Создание нового приложения

Команда oil поможет Вам создать новый проект, используя всего несколько ключевых слов и алиас php oil, находясь в Вашем приложении FuelPHP:
Этим самым мы создадим приложение blog. И если у Вас есть Apache или любой другой веб-сервер, работающий в папке “Sites”, то Вы сможете пройти по следующему URL-адресу и увидите страницу с приветствием.

Теперь, когда FuelPHP и Ваш веб-сервер готовы к работе, мы можем приступить к настройке нашего приложения.

Шаг 3 – Настройка приложения

Откройте Ваш любимый редактор кода, чтобы начать настройку соединения с базой данных и конфигурацию самого приложения. Все это делается практически также как и в версии 1.0.1, так что создайте базу данных и настройте пользователей SQL, как Вы это делали ранее. Когда дело дойдет до конфигурации базы данных, то здесь появятся два отличия:
  • PDO сейчас является драйвером по умолчанию
  • FuelPHP версии 1.1 имеет конфигурационные директории на основе окружающей среды.
Эти изменения очень просты, однако Вы всегда можете вернуться к использованию MySQL в качестве основного драйвера, если пожелаете. PDO очень полезен для разработчиков, т.к. Ваше приложение сможет работать с базой данных любого типа. Это значит, что Вы без проблем сможете перейти, например, от SQLite к PostgreSQL.
Просто откройте fuel/app/config/development/db.php и отредактируйте настройки, указав имя базы данных, а также Ваши логин и пароль для доступа к серверу базы данных:
Далее откройте fuel/app/config/config.php и активируйте пакеты auth и orm, как было сказано в первом абзаце.
В этом конфигурационном файле нам необходимо сделать одно небольшое изменение в массиве whitelisted_classes, что позволит нам передавать объекты в следующем виде:

Настройка групп

Пакет auth, включенный в FuelPHP основан на использовании драйверов. Мы же будем использовать “SimpleAuth”, который является единственным драйвером, включенным в пакет. Когда Вы наберетесь побольше опыта в работе с FuelPHP, то сможете создавать свои собственные драйверы для интеграции других систем – таких как сторонние форумы, системы управления контентом и т.д.
Для активации групп для SimpleAuth мы просто открываем fuel/packages/auth/config/simpleauth.php и настраиваем группы следующим образом:
Группы, конечно же, могут быть любыми, но для нашей статьи мы будем использовать стандартный вариант.

Шаг 4 – Создание пользователей

Т.к. мы хотим создать панель администратора, то нам необходимо создать таблицу пользователей, а затем внести в нее запись с пользователем, который будет администратором. Можно воспользоваться чем-то вроде phpMyAdmin или графическим интерфейсом вроде Navicat, но лучше делать такие вещи с помощью Oil:
Этим самым мы создаем модель пользователей и миграцию, которая создаст таблицу пользователей. Далее нам необходимо создать администратора. Опять-таки, мы можем сделать это через графический интерфейс, но зачем нам это?
Мы воспользовались консолью Oil, чтобы написать команды в реальном времени и сразу же получить результат. Методу Auth::create_user() были переданы следующие параметры: имя пользователя, пароль, e-mail адрес, идентификатор группы (group_id) – 100, для того, чтобы показать, что он администратор. 1 – это ответ выполнения кода, который означает, что user_id имеет значение 1.

Шаг 5 – Генерация кода

Генераторы – это отличный способ автоматически сгенерировать большое количество шаблонного кода, на основе которого можно будет создавать приложение.
Как было рассказано в первой статье, используя скаффолдинг, мы можем очень быстро создавать большие фрагменты приложения. Это делается с помощью команды oil и совсем не обязательно, но знайте, что это отличный способ создать большое количество кода с нуля. Некоторые люди относятся к генераторам кода как к “инструментам для тех, кто не умеет писать код” или думают, что это какая-то черная магия. Однако, если Вы только начинаете познавать фреймворк, и не хотите изучать, что и как в нем работает, то заставить систему сгенерировать код за Вас – не такой уж и плохой вариант.
FuelPHP версии 1.1 на счет генерации кода делает еще один небольшой шаг вперед. Вместо обычного скаффолдинга (незащищенных CRUD-операций) Вы можете сгенерировать админский код. Это работает точно также, но включает еще и простой шаблон администраторской части приложения, администраторский контроллер и т.д. Также используется пакет auth для защиты сгенерированного кода. Воспользовавшись Twitter Bootstrap, все это будет выглядеть очень симпатично. Вам нужно будет только немного настроить приложение, и оно будет готово к использованию.
Это делается из командной строки с помощью Oil. Сейчас мы сгенерируем немного кода, а потом разберем его.
FuelPHP создаст несколько основных шаблонов и файлов, а потом создаст MVC-компоненты для секции post. Запомните, что это то же самое, что и написать код самому, но быстрее. Вы можете посмотреть на результат, перейдя к /blog/public/admin/posts:

Объяснение сути контроллеров

Мы добавили Controller_Base, который будет содержать логику для всего приложения. Он может быть унаследован каждым другим контроллером. Файл содержит следующий код:
Благодаря тому, что мы унаследовали Controller_Template, все виды будут обернуты в шаблон автоматически. Затем в функции before() мы делаем небольшие манипуляции с текущим пользователем и делаем так, чтобы он был доступен как $this->current_user в контроллерах и $current_user в видах.
Еще один контроллер, который мы создали, имеет имя Controller_Admin и наследует Controller_Base. Так что вдобавок к тому, что мы будем иметь доступ к текущему пользователю, мы сможем проверить, является ли он администратором:
Вы, наверное, заметили, что он устанавливает конкретный шаблон, поэтому вместо fuel/app/views/template.php будет использоваться fuel/app/views/admin/template.php. А затем в функции before() происходит проверка того, является ли пользователь администратором. Если нет – он будет отправлен на страницу авторизации приложения.

Наследование контроллеров

Возможность наследовать другие контроллеры во FuelPHP – это очень удобная функция. Обычно контроллеры просто напрямую загружаются классом Request после определения маршрута по URL-адресу, но иногда бывает очень полезно унаследовать другой контроллер, чтобы использовать его логику или методы. Например, мы проверяем права доступа в Controller_Admin. Для того чтобы использовать эту логику нам необходимо унаследовать этот контроллер.
Controller_Admin_Posts наследует Controller_Admin. Это означает, что он имеет такую же проверку в функции before() и поэтому защищен точно также как и любой контроллер в панели администратора.

Что дальше?

Генерация кода – это зачастую только первый шаг в работе над приложением. Нам все еще нужно настроить формы и создать интерфейс. Например, если Вы попробуете создать или отредактировать пост, то поле user_id будет показано в textarea.

Шаг 6 – Изменение CRUD-форм

Мы хотим изменить наш метод action_create() в файле fuel/app/classes/admin/posts.php, так чтобы нам был доступен список пользователей. Для этого изменим содержимое метода следующим кодом:
Код содержит всего пару изменений по сравнению с предыдущим:
Это создает новый объект View. Мы можем назначать ему свойства, так чтобы данные о пользователях легко передавались и удобно использовались:
Теперь аналогичным образом отредактируем action_edit():
Однако, поскольку оба вида create.php и edit.php используют шаблон partial_form.php, а свойства устанавливают переменные только конкретному виду, то нам придется использовать метод View::set_global():
Объект Model_User используется для того, чтобы извлечь всех пользователей, а затем переконвертировать данные в ассоциативный массив для нашей формы.
Теперь нужно изменить HTML-код, поэтому удалите блок div, который служит контейнером, а затем измените поле user_id с input на select:

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

Интерфейс

Создание базового интерфейса для блога – задача очень простая, поэтому можно без проблем использовать скаффолдинг.
Создайте новый контроллер fuel/app/classes/controller/blog.php:
И файл вида fuel/app/views/blog/index.php:
Это обычный цикл по массиву $posts, который содержит все Ваши статьи.

Для этого вида нам необходим цикл, гиперссылка и превью. А вот для того, чтобы отображать отдельный пост мы создадим еще один файл. Мы назовем этот метод контроллера action_view() и создадим файл вида view.php:
Вот метод для контроллера blog:
Метод find_by_slug() – “магический”, он будет добавлять WHERE slug = "foo" в запрос к базе данных и возвращать единственный экземпляр данных типа Model_Post.
Comment form
Вот теперь Вы можете наслаждаться функционалом своего нестилизированного и ужасно выглядящего блога. Также у Вас есть интерфейс администратора для управления блогом.

Шаг 7 – Использование ORM

До сих пор мы использовали ORM с нашими моделями для выполнения основных CRUD-операций. Однако связей мы пока не касались. С помощью ORM это делать очень просто. Чтобы настроить отношения, все, что нам необходимо сделать – это немного изменить наши модели, чтобы показать то, как ORM необходимо “относится” к данным.
Пост создается одним пользователем, поэтому мы можем сказать, что он принадлежит пользователю (“belongs to a user”). В модели Model_Post необходимо добавить:
Пользователь может публиковать несколько постов, поэтому добавим следующую строку:
Быстрый способ проверить, что это все работает – выполнить в консоли:
Отличная работа!
Теперь мы можем обращаться к $post->user и выводить имя пользователя, поэтому давайте изменим файл fuel/app/views/blog/view.php:
Это называется lazy loading. Вот что здесь происходит: когда Вы обращаетесь к $post->user, то ORM возвращает объект пользователя, основанный на поле user_id. Это означает, что для получения поста и первого пользователя необходимо выполнить два запроса. А если бы у нас было больше информации, то по мере загрузки страницы выполнялись бы третий, четвертый запросы и т.д. Все эти дополнительные запросы к базе данных сильно замедляют процесс загрузки страницы в целом.
Для увеличения скорости загрузки страниц Вы можете перейти от lazy loading к eager loading, которая, по сути, сообщает ORM о том, что Вы собираетесь использовать поле users в будущем. Это можно выполнить одним большим запросом, но ORM заботливо разделит его на меньшие так, что Вы даже ничего не заметите.
Если Вы взглянете на запрос, который составляет ORM, то он будет похож на что-то в этом роде:
Сначала это может показаться ужасным, но ORM прекрасно знает, что происходит в этом запросе. Используя этот подход, некоторое время тому назад мы сократили 300+ запросов до 2-х очень быстрых.

Шаг 8 – Добавление комментариев

Большинство руководств по созданию блога заканчиваются на том моменте, когда уж пора перейти к созданию комментариев. Каждому блогу необходимы комментарии и наш не исключение. Давайте их быстро добавим. Начнем с построения интерфейса администратора:
Для комментариев придется выполнить несколько дополнительных изменений, как мы делали и для постов:
Model_User
Model_Post
Model_Comment
Добавьте комментарий с помощью интерфейса администратора, перейдя по адресу http://localhost/blog/public/admin/comments/create:

Теперь давайте снова проверим связи в консоли:
Вывод массива всех ORM объектов немного избыточен, но зато мы видим все необходимые данные. Это означает, что связи отлично работают. Теперь давайте отредактируем ORM запрос в контроллере blog в методе action_view() для добавления комментариев:
А теперь измените вид для вывода комментариев и отображения формы для добавления новых:
Этот код выведет все комментарии в очень простом стиле с обычной формой, используя разметку Twitter Bootstrap. Мы уверены, что у Вас получится что-то более симпатичное.

Мы видим, что комментарии успешно отображаются, а новые корректно добавляются. Единственное, что осталось сделать – реализовать сохранение новых комментариев.
Строка Form::open('blog/comment/'.$post->slug) передаст выполнение кода к blog/comment/women-love-guys-who-use-fuelphp. Это означает, что контроллеру Controller_Blog необходим новый метод action_comment($slug), который должен выглядеть примерно так:

Выводы

В этой статье опущены такие вещи, как настройка красивых URL-адресов вместо localhost/blog/public и использование валидации форм в модели или контроллере, потому что все это можно найти в официальной документации FuelPHP. Мы хотели осветить такие темы, как загрузка файлов или миграции, но опять-таки все это есть в документации.
К этому моменту Вы научились достаточно, чтобы начать разработку любого проекта с помощью FuelPHP. А все небольшие пробелы в знаниях можно заполнить, прочитав документацию.
Удачи!

Комментарии

Популярные сообщения из этого блога

Пишем логи на C# (.NET). Легкий способ.

Учебник yii2