Первое знакомство с CakePHP

CakePHP создан, чтобы сделать наиболее частые задачи веб-разработки простыми и не требующими особых усилий на их реализацию. Предоставляя инструментарий все-в-одном для начала работы различные части CakePHP работают хорошо все вместе либо по отдельности.

Цель данного обзора ознакомить Вас с основными концепциями CakePHP, и дать Вам быстрый обзор того, как эти концепции реализованы в CakePHP. Если Вы горите желанием начать свой проект, Вы можете начать с руководства, или погрузиться в документацию.

Соглашения превыше конфигурации

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

Модель

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

В случае с соц. сетями, Модель заботится о таких задачах, как сохранение пользовательских данных, ассоциации пользователя с его друзьями, хранение и получение пользовательских фото, нахождение возможных друзей, и т.д. Объектами модели в данном случае могут быть «Друг», «Пользователь», «Комментарий», или «Фото». Если нам нужно загрузить некоторые данные из нашей таблицы users мы должны сделать следующее:

use Cake\ORM\TableRegistry;

// Prior to 3.6 use TableRegistry::get('Users')
$users = TableRegistry::getTableLocator()->get('Users');
$query = $users->find();
foreach ($query as $row) {
    echo $row->username;
}

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

Если бы мы хотели создать нового пользователя (с использованием валидации) мы могли бы это сделать например так:

use Cake\ORM\TableRegistry;

// Prior to 3.6 use TableRegistry::get('Users')
$users = TableRegistry::getTableLocator()->get('Users');
$user = $users->newEntity(['email' => '[email protected]']);
$users->save($user);

Вид

Вид создает визуальное представление данных полученных из Модели. Существуя отдельно от объектов Модели он отвечает за использование доступной ему информации для создания пользовательского интерфейса необходимого Вашему приложению.

К примеру Вид может использовать данные Модели для вывода HTML-шаблона, который отображает данные в удобочитаемом для пользователя виде, либо оформить данные в формате XML для удобной передачи другим пользователям для дальнейшей обработки:

// В файле шаблона, мы выводим 'element' для каждого пользователя.
<?php foreach ($users as $user): ?>
    <li class="user">
        <?= $this->element('user', ['user' => $user]) ?>
    </li>
<?php endforeach; ?>

Вид предоставляет ряд расширений, таких как Шаблоны Представления, Элементы и Ячейки Представления для вывода повторяющихся элементов(шапка сайта, футер, меню и т.д.).

Вид не ограничен в плане выбора формата, используемого для вывода информации. К примеру вместо HTML или простого текста можно выводить данные в форматах XML, JSON, а засчет модульной архитектуры можно поключить дополнительные форматы к использованию (например CSV).

Контроллер

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

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

public function add()
{
    $user = $this->Users->newEntity();
    if ($this->request->is('post')) {
        $user = $this->Users->patchEntity($user, $this->request->data);
        if ($this->Users->save($user, ['validate' => 'registration'])) {
            $this->Flash->success(__('You are now registered.'));
        } else {
            $this->Flash->error(__('There were some problems.'));
        }
    }
    $this->set('user', $user);
}

Как Вы могли заметить мы никогда не указываем явно какой Вид использовать. Благодаря соглашениям CakePHP метод set() передаст данные от Контроллера в нужный Вид.

Цикл обработки запросов CakePHP

Теперь когда Вы знакомы с различными частями CakePHP, давайте рассмотрим как протекает полный цикл обработки запросов в фреймворке:

Схема последовательности операций в типичном запросе CakePHP

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

  1. Веб-сервер перенаправляет запрос к webroot/index.php.

  2. Ваше приложение загружено и связано с HttpServer.

  3. Промежуточное ПО Вашего приложения инициализировано.

  4. Запрос и ответ обработан через ромежуточное ПО PSR-7 используемое Вашим приложением. Обычно это включает в себя перехват ошибок и маршрутизацию.

  5. Если промежуточное ПО не возвращает ответа и запрос содержит информацию о маршруте, выбираются соответствующие контроллер и экшен.

  6. Экшен контроллера вызывается и контроллер взаимодействует с нужными Моделями и Компонентами.

  7. Контроллер делегирует создание ответа Виду для вывода данных, полученных от Модели.

  8. Вид используя Хелперы и Ячейки генерирует тело запроса и заголовки.

  9. Ответ посылается обратно через Промежуточное ПО.

  10. HttpServer выбрасывает ответ веб-серверу.

Только начало

Надеемся этот краткий обзор пробудил в Вас интерес. Некоторые другие потрясающие возможности CakePHP:

Следующие традиционные шаги это скачать CakePHP, прочитать руководства и создать что-нибудь потрясающее.