Основные понятия



Соглашения принятые в CakePHP фреймворке

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

Модели (The Model Layer)

Слой Model представляет собой часть приложения CakePHP, которая реализует бизнес-логику. Он отвечает за получение данных и их преобразование. Слой Model включает в себя обработку, проверку, установку связей, а так же другие задачи, связанные с обработкой данных.

Если, например, рассматривать сайт социальной сети, то, уровень Model будет осуществлять такие вещи, как сохранение данных пользователей, информации об их друзьях (связи, ассоциации), хранение и извлечение пользовательских фотографий, предложения для новых друзей (друзья друзей пользователя) и т.д. К объектам модели можно отнести такие понятия, как 'Friend' (Друг), 'User' (Пользователь), 'Comment' (Комментарий), 'Photo' (Фото). Если мы хотим загрузить некоторые данные из таблицы базы данных Users (Пользователи), например получить все имена, то достаточно сделать следующее:

use Cake\ORM\TableRegistry;

$users = TableRegistry::get('Users'); //получаем доступ к таблице Users
$query = $users->find(); //извлекаем из таблицы все записи (массив объектов)
//Далее циклом перебираем все записи, обращаясь к свойству username (имя пользователя) каждой: 
foreach ($query as $row) {
    echo $row->username; 
}

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

Если необходимо создать нового пользователя и сохранить его (с проверкой) в нашей таблице users, то можно написать лишь несколько строк кода:

use Cake\ORM\TableRegistry;

$users = TableRegistry::get('Users'); //получаем доступ к таблице users
$user = $users->newEntity(['email' => 'mark@example.com']); //создаем нового пользователя (сущность) и присваиваем полю email значение mark@example.com 
$users->save($user); //производим сохранение записи в таблице

Виды (The View Layer)

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

Например, в шаблоне вида мы используем данные, полученные от модели (в примере, это массив пользователей $users). Эти данные необходимо сформировать в виде HTML (XML) представления:

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

Слой View использует несколько вариантов представлений, это View Templates, Elements и View Cells, которые можно использовать неоднократно.

Слой View не ограничивается только HTML или текстовым представлением данных. Он может быть использован для представления данных в виде таких форматов, как JSON или XML.

Контроллеры (The Controller Layer)

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

Контроллер может рассматриваться в качестве менеджера, обеспечивающего корректную работу всех ресурсов, необходимых для выполнения поставленной задачи. Он ждет обращений от пользователей, проверяет их достоверность в соответствии с правилами аутентификации или авторизации, ведет обработку данных, получаемых от модели. Так же, контроллер определяет тип данных, передаваемых в процесс рендеринга уровню представления View. Ниже, для примера, представлена функция контроллера (action), выполняющая регистрацию пользователей на сайте:

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(__('Регистрация прошла успешно.'));
        } else {
            $this->Flash->error(__('Регистрация не выполнена из-за возникшей ошибки.'));
        }
    }
    $this->set('user', $user);
}

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

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

Теперь, когда вы знакомы с различными слоями, можно рассмотреть работу цикла запроса (Request) в CakePHP:

Цикл запроса в CakePHP-3

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

  1. Веб-сервер, согласно прописанным правилам направляет запрос на Webroot/index.php.
  2. Происходит загрузка приложения с привязкой к HttpServer.
  3. С помощью промежуточного программного обеспечения приложения (Middleware), происходит инициализируется.
  4. Запрос и ответ выполняется согласно стандарту PSR-7 через Middleware приложения. Как правило, это включает в себя перехват ошибок и маршрутизацию.
  5. Если ответ не будет возвращен из промежуточного программного обеспечения (например ответ об ошибке), то согласно содержащейся в запросе информации о маршрутизации, произойдет выбор контроллера (controller) и действия (action).
  6. Выполняется выбранный action (действие) контроллера, который взаимодействует с требуемыми моделями (Models) и компонентами (Components).
  7. Далее, сформированный контроллером ответ, в виде определенного типа данных, передается в слой View для создания представления
  8. При создании представления и генерации заголовков, слой View, в свою очередь, использует хелперы (Helpers) и модули (Cells).
  9. Ответ передается обратно через Middleware.
  10. HttpServer выдает ответ на веб-сервер.

В заключение хочу добавить, если вы всерьез заинтересовались фреймворком, но что-то из вышесказанного показалось непонятным, то не стоит унывать, просто начните работу с CakePHP и все само по себе прояснится!