Lithium — это простой, но средний PHP-фреймворк (машина?), Созданный для PHP 5.3 и выше. Он разработан, чтобы обеспечить хороший набор инструментов для запуска вашего веб-приложения, но не слишком ограниченный.
Lithium использует архитектуру Model-View-Controller (MVC), и это то, что мы собираемся рассмотреть в этой статье. Я покажу вам, как это работает и как вы можете определить бизнес-логику своего приложения и логику представления с помощью этой среды. В этом отношении мы сделаем несколько вещей.
Мы настроим контроллер для маршрутизации URL-запросов. Этот контроллер будет получать и обрабатывать некоторую информацию из базы данных с помощью модели данных. Эта информация затем будет отображаться в браузере с помощью просмотра. Все стандартные вещи MVC, но настоящее удовольствие выполнять с Lithium.
Я предполагаю, что у вас уже есть инфраструктура, настроенная на вашем сервере до такой степени, что вы можете по крайней мере увидеть начальную страницу приложения по умолчанию, если перейдете по URL-адресу. Кроме того, вам понадобится база данных, заполненная некоторой информацией. Я буду использовать MySQL, но Lithium поддерживает ряд других систем хранения, таких как MongoDB или CouchDB.
Я создал Git-репозиторий, который вы можете клонировать, если хотите следовать. Основная ветвь содержит vanilla Lithium framework, тогда как MVC
ветвь содержит код из этой статьи. Не забудьте также init
и update
подмодуль лития. Чтобы подключить вашу базу данных, сделайте копию файла connections_default.php
расположенного в папке app/config/bootstrap
и переименуйте его в connections.php
. Затем добавьте свои учетные данные в этом файле.
Давайте начнем.
Данные
Прежде чем перейти к интересным вещам MVC, давайте добавим в нашу базу данных таблицу с некоторой информацией. Я буду работать с фиктивными данными страницы, поэтому моя таблица (называемые pages
) будет содержать столбец id
(INT, автоинкремент и первичный ключ), столбец title
(varchar 255), столбец content
(текст) и created
столбец (INT ). И в этой таблице у меня есть 2 образца строк. Если вы хотите точно следовать, вот инструкция создания таблицы:
CREATE TABLE `pages` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `content` text, `created` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
И вот мои пустышки:
INSERT INTO `pages` (`id`, `title`, `content`, `created`) VALUES (1, 'My awesome page title', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 1397158745), (2, 'Some other page title', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 1397158768);
Конечно, вы можете использовать что-то еще.
C обозначает контроллер
Контроллеры, вероятно, являются наиболее важной частью любой инфраструктуры MVC. Их роль заключается в обработке запросов, направленных к нему системой маршрутизации приложения.
Если вы загляните в папку app/controllers/
вашего приложения, вы увидите, что это то место, куда мы должны поместить наше. Давайте создадим там новый файл с именем SiteController.php
(каждый класс Controller находится в своем собственном файле) и вставим следующее объявление класса, чтобы начать:
<?php namespace app\controllers; class SiteController extends \lithium\action\Controller { }
Как видите, мы расширяем класс базового контроллера Lithium в наш собственный, называемый SiteController
. Внутри этого класса вы создаете методы, которые выполняют логику, необходимую, когда они запрашиваются из URL. Мы увидим это в действии через минуту, но сначала давайте разберемся, как работает маршрутизация.
По умолчанию при создании URL-адреса мы используем аргументы, которые сопоставляются с именами класса Controller (в нашем случае, site
), методами и параметрами. Если имя метода не передано, Lithium примет одно из них, называемое index()
. Поэтому, если вы перейдете на http://example.com/site/
, Lithium будет искать этот метод и вызывать его. Теперь допустим, что у нас есть метод view()
который принимает 1 аргумент ( $id
). URL-адрес для вызова этого метода Controller: http://example.com/site/view/1
, где view
— это имя метода, а 1 — параметр, который передается этой функции. И если метод получает больше параметров, вы просто передаете их в URL, разделенном косой чертой ( /
).
Однако, как я уже говорил, это поведение по умолчанию. Для большего контроля вы можете сами определять маршруты в файле /app/config/routes.php
. Я не буду вдаваться в подробности, но вы можете найти более подробную информацию на соответствующей странице документации .
Теперь давайте продолжим и создадим метод page()
который будет отвечать за отображение отдельных страниц из моей фиктивной базы данных:
public function page() { // Mock page info. $title = 'My awesome page title'; $content = 'My awesome page content. Yes indeed.'; $created = '10 April 2014'; // Prepare page info for passing to the View. $data = array( 'title' => $title, 'content' => $content, 'created' => $created, ); // Pass the data to the View. $this->set($data); }
Выше мы макетируем информацию о странице базы данных и храним ее в виде массива. Затем мы передаем этот массив методу set()
класса Controller (который мы наследуем), и он отправляется в View. В качестве альтернативы, мы также можем вернуть массив $data
вместо использования метода set()
. Но в обоих случаях ключи массива представляют имена переменных, к которым мы затем можем получить доступ из нашего файла View. Посмотрим, как это работает.
V обозначает вид
Представления — это уровень представления инфраструктуры MVC. Они используются для того, чтобы отделить бизнес-логику приложения и упростить создание тем, которые отображаются в браузере.
Давайте создадим представление для отображения информации о нашей странице. В папке app/views/
вам нужно создать еще одну папку с именем класса Controller, который ее использует (в нашем случае, site
). Внутри этой папки вы должны создать файл с именем самого метода, дополненный расширением .html.php
. Это соглашение о присвоении имен Lithium для Views, которое позволяет нам легко подключать их к контроллерам.
Так что для нашего примера страницы новый файл будет в app/views/site/page.html.php
.
Внутри этого файла вставьте следующее:
<!-- Title --> <h1><?=$title ?></h1> <!-- Created date --> <p><?=$created ?></p> <!-- Main content --> <div class="content"> <?=$content ?> </div>
Как вы, наверное, уже догадались, это некоторая базовая разметка, в которую мы печатаем переменные, названные в честь ключей массива, переданных из контроллера. Lithium использует этот синтаксис для печати переменных, потому что он также запускает их через функцию $h()
которая отвечает за очистку HTML. Это относится, однако, только к тем случаям, когда вы печатаете переменные, а не свойства объекта $this
.
Чтобы проверить, что мы имеем до сих пор, перейдите на http://example.com/site/page
и вы должны увидеть красивую страницу с отображаемой макетной информацией. Вы также заметите, что наш простой View визуализируется внутри более сложного макета (по умолчанию, который поставляется с каркасом).
Макеты в Lithium используются для переноса содержимого с помощью обычно используемой разметки, такой как верхние и нижние колонтитулы. Они живут в папке app/layouts
и используют $this->content()
для визуализации представления внутри. Наш вид по умолчанию отображается внутри макета default.html.php
но вы можете указать другой, если хотите. Вы делаете это из Контроллера, который отображает Представление, либо как свойство класса, которое будет применяться ко всем методам этого Контроллера, либо внутри самого метода следующим образом:
public function page() { // Method logic ... $this->_render['layout'] = 'yourLayout'; }
Мы будем придерживаться стандартного, потому что он выглядит хорошо для демонстрационных целей.
М обозначает модель
Теперь, когда логика запроса и представления позаботилась, пришло время заменить фиктивные данные страницы содержимым нашей фиктивной базы данных. Мы будем использовать Модель, чтобы абстрагироваться и легко получить доступ к этой информации.
Классы моделей являются очень важной частью инфраструктуры MVC, поскольку они определяют и обрабатывают контент в вашей базе данных. Они также облегчают приложению выполнение операций CRUD (создание, чтение, обновление, удаление) над этими данными. Давайте посмотрим, как они работают в литии.
Первое, что вам нужно сделать, это создать файл класса в папке app/models
именем Pages.php
и вставить в него следующее:
<?php namespace app\models; class Pages extends \lithium\data\Model { }
Мы просто расширяем базовый класс Model и используем все его методы. Имя нашего класса Model должно соответствовать таблице базы данных, которая содержит соответствующие записи. Поэтому, если у вас нет pages
, убедитесь, что вы адаптировались соответствующим образом, потому что Lithium автоматически выберет это имя, чтобы нам было легче.
Далее нам нужно включить этот файл в наш файл класса Controller, поэтому вставьте следующее под объявлением пространства имен:
use app\models\Pages;
Следует удалить фиктивное содержимое из метода page()
и убедиться, что этой функции передан параметр $id
чтобы мы знали, какую страницу нам нужно получить. И у нас остается простая задача — запросить запись страницы и передать результаты в представление. Таким образом, исправленный метод page()
будет выглядеть примерно так:
public function page($id) { // Look for the first record that matches the passed criteria $record = Pages::first(array('conditions' => array('id' => $id))); $page = $record->data(); // Prepare page info for passing to the View. $data = array( 'title' => $page['title'], 'content' => $page['content'], 'created' => date('F j Y', $page['created']), ); // Pass the data to the View. $this->set($data); }
Мы используем метод first()
родительского класса Model для запроса условий. Результатом является объект, из которого мы извлекаем данные записи, используя метод data()
. И это в виде массива с ключом имени столбцов таблицы. Все остальное, как и раньше, за исключением created
поля, которое мы форматируем с помощью функции PHP date()
поскольку мы получаем отметку времени UNIX из базы данных. И это в значительной степени так.
Если мы перейдем по http:example.com/site/page/1
, мы увидим страницу с идентификатором 1. Если мы переключим последний аргумент URL-адреса на 2, страница должна загрузить вторую запись. Ухоженная.
Вывод
В этом уроке мы увидели, как легко понять и работать со средой Lithium MVC. Мы узнали, как определять контроллеры, представления и модели и как использовать их вместе для создания аккуратно разделенного процесса приложения. Мы также видели, насколько полезны литиевые соглашения, чтобы начать нас. Даже не зная об этом, мы абстрагировали содержимое нашей базы данных и предоставили его для очень легкого доступа.
Я надеюсь, что вы чему-то научились и достаточно любопытны, чтобы немного углубиться и взглянуть на другие мощные функции, которые предлагает Литий. Каковы некоторые из встроенных методов CRUD и как вы можете их расширить? Как вы можете определить свои собственные маршруты? Как вы можете использовать несколько макетов и даже визуализировать меньшие elements
в ваших представлениях? Это все замечательные возможности, которые Lithium предлагает нам для нашего веб-приложения, и их стоит проверить.
Я сделал тебя любопытным? Хотите узнать больше об этой замечательной платформе?