Одним из самых больших и горячих обсуждений о будущем 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
CodeIgniter 4: https://habrahabr.ru/post/275657/
CI Community Apps: https://habrahabr.ru/post/276375/
Requests и Responses в CodeIgniter 4: https://habrahabr.ru/post/278489/
Внедрение зависимостей в CodeIgniter 4: https://habrahabr.ru/post/278641/
Маршрутизация в CodeIgniter 4: https://habrahabr.ru/post/278873/