Встречайте пятую часть цикла статей по разработке с 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, и так далее.