Unetway
Модули/HMVC в CodeIgniter 4

Модули/HMVC в CodeIgniter 4

Одним из самых больших и горячих обсуждений о будущем CodeIgniter 4, было обсуждение о поддержке и возможности использования модулей/HMVC.
Большинство было за то, чтобы в CodeIgniter по умолчанию можно было использовать два шаблона проектирования веб-приложений: MVC и HMVC. Однако совет CI пришел к мнению, что внедрение HMVC противоречит основных принципам и идеологии фреймворка в целом.
 

Поддержка модулей/HMVC

Как уже стало ясно, в CodeIgniter 4 не будет поддержки ни HMVC, ни модулей. Не будет официального определения структуры модуля как такового. По крайней мере, там не будет модульности в том виде, в какой ее можно представить в Yii Framework или Drupal CMS.
Нет никакой иерархической загрузки классов при помощи различных каталогов. 
Если все это так, то как мы можем поддерживать любую форму модулей и строить удобные модульные веб-приложения? На это у нас имеется автозагрузка и пространства имен.
 

Автозагрузка и пространства имен

Теперь фреймворк поставляется с встроенным PSR-4 совместимым автозагрузчиком. Нет необходимости использовать Composer. Если все же вы желаете его использовать, то его можно встроить в качестве дополнения.

Но почему бы просто не использовать Composer в качестве основного загрузчика? Лонни Эцелл, разработчик CodeIgniter 4, который сейчас занимается построением ядра фреймворка, сторонник использования Composer в CodeIgniter. Однако, разработчики пришли к выводу что использование Composer будет не правильным решением. Например, для некоторых хостингов Composer будет проблематичным, не везде его можно применять. Еще необходимо поддерживать функционал, который задействует Composer.
Системные файлы и файлы приложения могут быть в пространстве имен. Системные файлы в пространстве имен CodeIgniter, а каталог приложений в пространстве имен App по умолчанию. 
 

Простой пример

Представьте, что мы создаем модуль блога. Первое, что нужно сделать, это принять решение о пространстве имен, а затем решить где разместить файлы. Для примера будет использоваться каталог Standard, в котором будут все необходимые файлы модуля. Структура папок может выглядеть примерно так:

/application
/standard
    /Blog
        /Config
        /Controllers
        /Helpers
        /Libraries
        /Models
        /Views
/system

Чтобы система знала, где найти файлы, нужно открыть файл:

/application/Config/Autoload.php

где следует указать:
 

$psr4 = [
        'Config'                     => APPPATH.'Config',
        APP_NAMESPACE.'\Controllers' => APPPATH.'Controllers',
        APP_NAMESPACE                => realpath(APPPATH),
        'Standard'                   => APPPATH.'../standard'
    ];

Теперь, система может найти все что нужно и использовать в любом месте:

namespace Standard\Blog;

use Standard\Blog\Models\BlogModel;
use Standard\Blog\Libraries\BlogLibrary;
use Standard\Blog\Config\Blog as BlogConfig;

class BlogController extends \CodeIgniter\Controller
{
    public function index()
    {
        $model = new BlogModel();
        $blogLib = new BlogLibrary();
        $config = new BlogConfig();
    }
}

Загрузка Helpers

В нашем примере, мы могли бы иметь файл 

/standard/Blog/Helpers/BlogHelper.php. 

Для загрузки класса используем функцию load_helper ():

load_helper('Standard\Blog\Helpers\BlogHelper');

Функция поможет найти хелпер и загрузить его.

 

Загрузка View

При использовании шаблона модуля, представления могут быть загружены при помощи функции load_view ().
 

echo load_view('Standard\Blog\Views\index', $data);
load_helper('Standard\Blog\BlogHelper');
echo load_view('Standard\Blog\index', $data);

Хотя, это не единственный способ, которым вы можете структурировать вещи в вашем приложении.
 

ПРИМЕЧАНИЕ: Примеры основаны на коде предварительной версии и вся специфика может быть изменена на любую другую.

 

Ссылки по теме

Источник: Modules in CodeIgniter 4
CodeIgniter Wikipedia: ru.wikipedia.org/wiki/CodeIgniter
Официальный сайт CodeIgniter: www.codeigniter.com
Официальный форум CodeIgniter: forum.codeigniter.com

Понравился материал? Поделитесь с друзьями!

Автор

Комментарии

Незарегистрированным пользователям запрещено комментировать.
Войдите или пройдите регистрацию