Lithium Framework: c чего начать?

Lithium полноценный PHP — фреймворк, совместимый с версиями PHP 5.3 и выше. Разработан, с целью предоставить пользователю великолепный инструмент для запуска веб-приложений.

В Lithium используется архитектура Model-View-Controller(MVC) и именно о ней пойдет речь в этой статье. Я покажу вам, как это работает на практике и то, как вы сможете описать бизнес-логику и логику отображения ваших приложений, используя этот фреймворк. Вот некоторые моменты, которые мы сделаем.

Мы настроим Контроллер для перенаправления на него URL-запросов. Контроллер будет получать и обрабатывать некую информацию из БД с помощью данных Макета.

Все эти данные, в дальнейшем, мы сможем отобразить в браузере, используя Вид. Использовать будем только стандартные средства MVC. Надеюсь, вы почувствуете, насколько удобно работать с Lithium.

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

Я использую MySQL, но Litium поддерживает также ряд других систем хранения данных, таких как MongoDB или CouchDB.

Также я установил репозиторий Git repository, который, при желании, вы можете клонировать, дабы оставаться в курсе событий. Ветвь master содержит код фреймворка Lithium, ветвь MVC — код этой статьи. Также не забудьте о подмодулях Lithium init и update.

Для подключения вашей к базе данных сделайте копию файла connections_default.php , расположенного в app/config/bootstrap и переименуйте его в connections.php. Затем добавьте в него ваши настройки.

Итак, начнем.

Данные

Прежде чем заняться непосредственно MVC, создадим в нашей базе данных какую-либо таблицу и наполним ее информацией. Я нафантазирую немного данных для моей таблицы (назову ее pages).

Она будет содержать столбец id (INT, автоматическое приращение и первичный ключ), и столбец title (varchar 255), а также столбцы content (text) и created (INT).

И две простых строки. Если вам понадобится последовать моему примеру в точности, то ниже приведен SQL-код для этого:

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 (каждый класс Контроллера располагается в отдельном файле) и помещаем в него следующий код класса:

<?php  namespace appcontrollers;  class SiteController extends lithiumactionController {  }

Как вы можете видеть, мы расширили ряд классов Контроллера путем создания нашего собственного класса, названного SiteController.

Внутри этого класса мы создаем методы, которые выполняют определенную логику, которая запрашивается путем обращения через URL. Позже мы увидим это в действии, а пока давайте разберемся, как работает маршрутизация.

По-умолчанию, при формировании URL-запроса, используются аргументы, которые привязаны к именам классов (в нашем случае это site), методов и параметров Контроллера. Если не один метод не объявлен, Lithium применяет метод index(). Потому, если вы обратитесь к http://example.com/site/, Lithium будет искать метод index() и использовать его.

Далее стоит упомянуть о методе view(), который имеет всего один аргумент — ($id). http://example.com/site/view/1 — URL, который вызывает этот метод.

Здесь view — имя метода, и «1» — параметр, который вызывает функцию. В случае, если же метод имеет более одного параметра, вы просто перечисляете их в URL, разделяя знаком слэш (/).

Это, как я уже упомянул, действия Lithium по-умолчанию. Для более полного контроля, вы должны определить маршруты собственноручно, в файле /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(), который мы унаследовали от класса Контроллера, и после этого массив ушел в Представление.

Альтернативный путь — возвращать массив $data вместо использования метода set(). Но в обоих случаях, ключи массива представляют собой имена переменных, с помощью которых мы можем впоследствии обращаться к ним из файла Представления.

Давайте посмотрим, как это работает.

V — Представление

Файлы Представлений это презентативный слой фреймворка MVC. Они используются, чтобы обособить бизнес-логику и облегчить процесс отображения данных в браузере.

Попробуем создать Представление для отображения информации о нашей странице. Для этого в папке app/views/ вам необходимо создать еще одну папку с именем класса Контроллера, который мы используем (в нашем случае имя — site).

Внутри этой папки создайте файл, с именем метода и расширением .html.php. Это синтаксис именования Lithium для Представлений, который делает очень легкой процедуру подключения Представлений к Контроллерам.

Итак, для нашего примера мы создадим новый файл 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 и вы должны увидеть прелестную страницу с кучей отображенной на ней информации.

Также заметьте, что наше простое Представление сгенерировано внутри комплексной схемы (той, которая идет в составе Lithium и используется по-умолчанию).

Схемы в Lithium используются для обертки вашего контента в теги разметки, наподобие хедеров и футеров. Располагаются эти схемы в папке app/layouts и используют метод $this->content() для генерации Представления.

Наше представление сгенерировано схемой по-умолчанию default.html.php, но вы можете использовать любую другую, на ваше усмотрение.

Делается это из Контроллера, который генерирует Представление, либо же, как свойство класса, которое применяется ко всем методам Контроллера, или внутри конкретного метода примерно так:

public function page() {      // Логика метода...      $this->_render['layout'] = 'yourLayout';    }

Мы будем использовать схему, установленную по умолчанию, потому как её достаточно для наших примеров.

M – Модель

Теперь, когда мы позаботились о логике запросов и представлений, самое время заменить данные макета страницы нашими фиктивными данными из базы данных. Мы будем использовать Модель для легкого доступа к информации.

Классы Модели очень важная часть MVC, потому как они определяют и обрабатывают содержимое базы данных.

Также с помощью классов Модели приложениям легко производить операции CRUD (создание, чтение, обновление, удаление) с данными. Давайте посмотрим, как это работает в Lithium.

Во-первых, создаем файл класса в папке app/models, называем его Pages.php и располагаем следующий код внутри него:

<?php  namespace appmodels;  class Pages extends lithiumdataModel {  }

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

И если ваша таблица называется не pages, убедитесь в том, что вы используете соответствующее название, потому как Lithium будет использовать автоматическое именование, чтобы упростить вам жизнь.

Следующее, что мы сделаем — включим наш созданный файл в файл классов Контроллера. Используйте код объявления пространства имен, приведенный ниже:

use appmodelsPages;

Итак. Мы удаляем макет содержимого из метода page() и убеждаемся, что этой функции передается параметр $id, чтобы мы знали, какие именно страницы мы должны получить в результате.

Нам остается простая задача запроса данных о записях из БД и передачи результатов в Представление. Отредактированный метод page() будет выглядеть примерно так:

public function page($id) {      
// Ищет первую запись, удовлетворяющую заданным условиям     
$record = Pages::first(array('conditions' => array('id' => $id)));     
$page = $record->data();      
// Подготовка данных для вывода в Представлении.     
$data = array(       'title' => $page['title'],       
'content' => $page['content'],       
'created' => date('F j Y', $page['created']),     );      
// Передача данных в Представление.    
$this->set($data);  }

Мы используем метод first() родительского класса Модели для создания запроса по определенным условиям. В результате мы имеем объект, из которого мы получаем записи, используя метод data().

Все это получено в виде массива с ключом в виде имен столбцов таблицы. Остальное делаем так же, как и ранее, за исключением того, что поле created форматируем с помощью PHP функции date() после того, как получили временную метку UNIX из базы данных.

Таким образом, если мы переходим по http:example.com/site/page/1, мы видим страницу с ID равному 1. И меняя последний аргумент URL на «2» страница загружает вторую запись. Ловко!

Заключение

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

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

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

Какие встроенные методы CRUD имеются, и как вы можете расширить их? Как вы можете настроить свою собственную маршрутизацию?

Как вы можете использовать несколько макетов и внести правки в Представления? Все эти возможности есть в Lithium и вы можете использовать это в ваших веб-приложениях.

Заинтересовались? Хотите прочитать еще об этом великолепном фреймворке?

Перевод статьи «Lithium Framework: Getting Started» был подготовлен дружной командой проекта Сайтостроение от А до Я.