Разработка простого веб-приложения CakePHP (часть 1)

Что такое CakePHP?

CakePHP – мощный и ошибкоустойчивый PHP-фреймворк, основанный на парадигме программирования Model-View-Controller (MVC, или «модель-представление-поведение»). Кроме гибких путей разработки приложения данный фреймворк также предоставляет базовую структуру для организации имен файлов и таблиц базы данных, которая помогает сохранять их в последовательном и логичном порядке.

В предыдущем руководстве речь шла о том, как установить CakePHP на виртуальный выделенный сервер и выполнить базовую настройку фреймворка. Кроме того, в ходе предыдущего руководства была создана база данных, которая теперь пригодится для разработки простого веб-приложения. Цель данного урока – поэкспериментировать, поиграть с CakePHP, чтобы лучше разобраться в процессе разработки приложения. Также в данном руководстве затронуты некоторые основные понятия (​​контроллеры, модели, представления и т.д.) и приведены их примеры. В результате получится небольшое приложение, выполняющее операции CRUD (create, read, update, delete) в созданной ранее таблице базы данных.

Будучи продолжением руководства «Установка CakePHP», это руководство предполагает, что вы выполнили все действия, описанные в предыдущем уроке (нужен доступ к командной строке сервера, на котором уже запущена группа программ LAMP, а также установлен и настроен CakePHP).

В предыдущем уроке была выполнена простая установка CakePHP в папку /var/www/project и создана база данных по имени cake с таблицей posts, состоящей на данный момент из одной строки. Теперь откройте командную строку MySQL и добавьте еще одну строку:

INSERT INTO posts (title,body,created)
VALUES ('Another title', 'Another body text', NOW());

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

Соглашение об именах

При соблюдении соглашения об именах CakePHP предоставляет некоторые полезные функции, благодаря которым разработка приложения остается последовательной. К примеру, для написания имен контроллеров используется ВерблюжийРегистр (или CamelCase); кроме того, имя контроллера должно быть во множественном числе и заканчиваться словом Controller (например, PostsController). Согласно данной договоренности контроллер хранится в одноименном файле (PostsController.php).

Имена моделей (Model) должны быть в единственном числе и отражать индивидуальную модель данных (например, Post). Кроме того, если следовать соглашению, модель будет искать информацию в таблице базы данных с тем же именем в множественном числе (в этом случае – posts) и будет использоваться контроллером с тем же именем в множественном числе и со словом Controller в конце (то есть, PostsController в данном случае).

В целом, это лишь короткая справка. Чтобы узнать о данном соглашении больше, посетите эту страницу.

Модель

Классы моделей – это слой бизнес логики (business layer) в приложении, они используются для взаимодействия с данными. В CakePHP модели, как правило, представляют собой таблицу базы данных, но они также могут быть использованы для доступа к другим видам данных. В этом отношении модели – это модели данных (такие, как сообщения в блоге, комментарии, и даже учетные записи пользователей), объявить которые нужно в файлах папки /app/Model.

В данном руководстве соблюдается описанное выше соглашение об именах; потому класс модели по имени Post будет размещаться в файле Post.php папки app/Model. Таким образом, фреймворк будет знать, что он должен использовать таблицу posts в PostsController.

Итак, создайте файл и поместите в него следующее объявление класса, которое расширит классы моделей CakePHP по умолчанию и понадобится для создания постов в блоге (не забудьте внести открывающий тег PHP  в начало файла):

class Post extends AppModel {
}

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

Контроллер

Контроллер используется для маршрутизации запроса пользователя в браузере к поведению в приложении. Затем он интерпретирует запрос и использует модели, которые должны предоставить запрашиваемую информацию в определенном формате (что определяется видом (Views)).

В данном приложении контроллер по имени PostsController будет помещен в файл PostsController.php папки app/Controller. Вставьте следующий код (не забудьте добавить открывающий тег PHP в начале файла).

class PostsController extends AppController {
public $helpers = array('Form');
public function index() {
$this->set('posts', $this->Post->find('all'));
}
}

Данный класс расширяет класс контроллеров CakePHP по умолчанию и  заявляет атрибут ($helpers), хранящий некоторые вспомогательные библиотеки CakePHP, которые понадобятся позже. Затем он создает метод index() (он вызывается по умолчанию, если контроллер не получает указаний использовать другой метод). Методы в CakePHP также называются поведениями (actions).

Только что созданное поведение index() использует унаследованный от родительского контроллера метод set() для передачи данных из контроллера виду (или представлению, которое будет создано в дальнейшем). Эти данные хранятся в переменной posts и извлекаются из модели Post, которая использует метод find(‘all’) для извлечения всех постов из таблицы базы данных. Модель доступна из $this->Post благодаря соблюдению соглашения об именах.

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

Представление (вид)

Целью представления (View) является отображение данных, запрашиваемых контроллером и предоставленных моделью. Именно благодаря представлениям презентация приложения может находиться отдельно от логики. На данном этапе нужно создать файл представления для отображения информации, полученной через объявленный ранее метод index().

Виды CakePHP расположены в папке app/View, которая находится в папке с именем контроллера, к которому они относятся. Таким образом, файл вида нужно поместить в папку под названием Posts и назвать его index.ctp (как метод, запрашивающий его).  В сам файл нужно внести следующий код:

<h1>Blog posts</h1>
<?php foreach ($posts as $post): ?>
<p><?php echo $post['Post']['title']; ?> | <?php echo $post['Post']['created']; ?>
<?php endforeach; ?>
<?php unset($post); ?>

Это выведет достаточно простую страницу. Будет выполнен перебор элементов массива $posts (установленного в методе set()), после чего появятся заголовок и дата создания постов (эти данные выводятся из таблицы). Итак, чтобы получить эту информацию, откройте в браузере www.example.com/project/posts/index или просто www.example.com/project/posts (поскольку index() является поведением по умолчанию, которое вызывается, если не указан никакой другой метод).

Как видите, приложение уже может выполнять операцию “чтение” (read operation) без необходимости писать код для запроса к БД.

Как можно заметить, данные представлены в дефолтном лэйауте (layout) CakePHP (который находится в app/View/Layouts). Все представления являются частью лэйаутов, создавать которые можно в любых количествах. Потом остается только указать в контроллере, какой именно лэйаут нужно использовать. Далее в уроке будет использоваться дефолтный лэйаут (поскольку он используется автоматически и не нуждается в дополнительных настройках). Более подробную информацию о лэйаутах можно получить здесь.

Теперь попробуйте отобразить пост с отдельным представлением.

Для этого нужно добавить еще один метод в PostsController. Итак, найдите ранее добавленный метод index() и внесите ниже следующий код:

public function view($id = null) {
$post = $this->Post->findById($id);
$this->set('post', $post);
}

Поскольку нужно отобразить только один пост, модель Post будет использовать метод findById() и передаст ему необходимый идентификатор (ID). Этот идентификатор поступит из поведения view(), который получит данный параметр из URL-адреса следующим образом: www.example.com/posts/view/1, где 1 – идентификатор нужного поста. Затем метод set() передаст представлению переменную post, которая содержит извлеченные из таблицы данные поста. Как видите, все очень просто. Сейчас этот метод содержит абсолютный  минимум данных. Рекомендуется также проверить, является ли передаваемый на контроллер идентификатор действительным.

Теперь нужно создать представление view.ctp (в той же папке, в которой было создано предыдущее представление) и внести в него следующий блок кода:

<h1><?php echo h($post['Post']['title']); ?></h1>
<p><small>Created: <?php echo $post['Post']['created']; ?></small></p>
<p><?php echo h($post['Post']['body']); ?></p>

Если теперь перейти по www.example.com/project/posts/view/1, можно увидеть пост с идентификатором 1 (заголовок, дата создания и тело).

Итоги

Данное руководство учит основам разработки приложений CakePHP ( а именно выполнению базовой операции «чтение»). Итак, в ходе урока был  объявлен класс для модели данных, после чего эти данные были запрошены при помощи контроллера; также вы научились создавать простые представления и отображать их в браузере. Кроме того, все вышеперечисленные действия продемонстрировали преимущества использования соглашения об именах CakePHP. Как видите, при соблюдении этого соглашения не нужно отправлять никаких запросов к БД, чтобы получить данные; таким образом можно без лишних указаний связать модель, контроллер и представление.

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

Tags: , , , , ,

Добавить комментарий