Встречайте пятую часть цикла статей по разработке с Kohana PHP V3 (KO3). Предыдущие части можно найти по метке "знакомство с kohana 3.0". В этой части мы рассмотрим HMVC (Иерархические-Модель-Вид-Контроллер).
HMVC является продолжением MVC (модель-вид-контроллер), позволяющим контроллеру давать определенные поручения другим контроллерам в иерархическом порядке. Чтобы понять это, представьте модули, которые могут работать сами по себе или в группах. Если не помогло, ознакомьтесь с этой иллюстрацией паттерна Иерархические-Модель-Вид-Контроллер.
Ранее мы проектировали страницы, за которые отвечал один единственный контроллер с несколькими экшенами, получающими данные из модели и нужным образом компонующими виды в одну полноценную веб-страничку. HMVC позволяет организовать код намного лучше и сделать его более готовым для повторного использования. А с тем, как реализован HMVC в Kohana 3, можно даже обращаться к другим серверам за контентом для секций.
Давайте создадим новый контроллер:
Сохраните файл как “hmvc.php” в папке “application/classes/controller”.
Код выше должен выглядеть знакомым, хотя одна строка выделяется:
Тут-то и происходит магия HMVC. Здесь вызывается экшен “getposts” из контроллера “posts”, возвращающий результат, который мы получаем и сохраняем в массив, передаваемый в дальнейшем виду.
И раз уж начали о видах, давайте создадим один для этого контроллера:
Сохраните это как “hmvc.php” в папке “application/views/pages/”.
Теперь, собственно, сделаем контроллер “posts”:
Сохраните файл как “posts.php” в директории “application/classes/controller”.
Теперь откроем чистый документ для нового вида:
Сохраните это как “hmvc_posts.php” в папке “applications/views/pages”.
Если сейчас открыть в браузере “http://localhost/mykohana3/hmvc”, на экране должны появиться несколько записей. Тот же результат можно достичь, обращаясь к контроллеру непосредственно из вида. Поскольку у нас используется один шаблон, не нужно будет внедрять HMVC во все контроллеры, использующие этот шаблон.
Приведите файл “hmvc.php” из папки “application/classes/controller” к следующему виду:
Теперь отредактируйте “hmvc.php” из папки “application/views/pages/”, чтобы он стал выглядеть так:
Это довольно простой пример, который можно расширить, сделав возможность отправлять данные в разных форматах, например: простой html, html, полный html, xml, json, и так далее.
HMVC является продолжением MVC (модель-вид-контроллер), позволяющим контроллеру давать определенные поручения другим контроллерам в иерархическом порядке. Чтобы понять это, представьте модули, которые могут работать сами по себе или в группах. Если не помогло, ознакомьтесь с этой иллюстрацией паттерна Иерархические-Модель-Вид-Контроллер.
Ранее мы проектировали страницы, за которые отвечал один единственный контроллер с несколькими экшенами, получающими данные из модели и нужным образом компонующими виды в одну полноценную веб-страничку. HMVC позволяет организовать код намного лучше и сделать его более готовым для повторного использования. А с тем, как реализован HMVC в Kohana 3, можно даже обращаться к другим серверам за контентом для секций.
Давайте создадим новый контроллер:
<?php
defined('SYSPATH') or die('No direct script access.');
class Controller_Hmvc extends Controller_DefaultTemplate
{
public function action_index()
{
// Set meta data
$this->template->title = 'Kohana 3.0 HMVC Test';
$this->template->meta_keywords = 'PHP, Kohana, KO3, Framework, HMVC';
$this->template->meta_description = 'A test of of the KO3 framework HMVC pattern';
// Fill in content
$ko3 = array();
$ko3['posts'] = Request::factory('posts/getposts')->execute()->response;
$this->template->content = View::factory('pages/hmvc', $ko3);
}
}
Сохраните файл как “hmvc.php” в папке “application/classes/controller”.
Код выше должен выглядеть знакомым, хотя одна строка выделяется:
$ko3['posts'] = Request::factory('posts/getposts')->execute()->response;
Тут-то и происходит магия HMVC. Здесь вызывается экшен “getposts” из контроллера “posts”, возвращающий результат, который мы получаем и сохраняем в массив, передаваемый в дальнейшем виду.
И раз уж начали о видах, давайте создадим один для этого контроллера:
<?php echo $posts;?>
Сохраните это как “hmvc.php” в папке “application/views/pages/”.
Теперь, собственно, сделаем контроллер “posts”:
<?php
defined('SYSPATH') or die('No direct script access.');
class Controller_Posts extends Controller
{
public function action_index()
{
}
public function action_getposts()
{
// Load model
$posts = new Model_Post();
// Fill content array for view with last 10 posts.
$content = array();
$content['posts'] = $posts->getLastTenPosts();
// Render and output.
$this->request->response = View::factory('pages/hmvc_posts', $content);
}
}
Сохраните файл как “posts.php” в директории “application/classes/controller”.
Теперь откроем чистый документ для нового вида:
<?php foreach($posts as $post):?>
<h1><?php echo $post['title'];?></h1>
<?php echo $post['post'];?>
<hr />
<?php endforeach;?>
Сохраните это как “hmvc_posts.php” в папке “applications/views/pages”.
Если сейчас открыть в браузере “http://localhost/mykohana3/hmvc”, на экране должны появиться несколько записей. Тот же результат можно достичь, обращаясь к контроллеру непосредственно из вида. Поскольку у нас используется один шаблон, не нужно будет внедрять HMVC во все контроллеры, использующие этот шаблон.
Приведите файл “hmvc.php” из папки “application/classes/controller” к следующему виду:
<?php
defined('SYSPATH') or die('No direct script access.');
class Controller_Hmvc extends Controller_DefaultTemplate
{
public function action_index()
{
// Set meta data
$this->template->title = 'Kohana 3.0 HMVC Test';
$this->template->meta_keywords = 'PHP, Kohana, KO3, Framework, HMVC';
$this->template->meta_description = 'A test of of the KO3 framework HMVC pattern';
// Fill in content
$ko3 = array();
$ko3['content'] = 'Hello there!';
$this->template->content = View::factory('pages/hmvc', $ko3);
}
}
Теперь отредактируйте “hmvc.php” из папки “application/views/pages/”, чтобы он стал выглядеть так:
<?php echo $content;?><br/>
<?php echo Request::factory('posts/getposts')->execute()->response;?>
Это довольно простой пример, который можно расширить, сделав возможность отправлять данные в разных форматах, например: простой html, html, полный html, xml, json, и так далее.