Spec-Zone.ru › CodeIgniter 4

Модули кода

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

  • Имена пространств
  • Автозагрузка файлов, не являющихся классами
  • Автообнаружение
    • Включение/выключение обнаружения
    • Указание элементов обнаружения
    • Обнаружение и Composer
  • Работа с файлами
    • Маршруты
    • Фильтры
    • Контроллеры
    • Конфигурационные файлы
    • Миграции
    • Сетки
    • Вспомогательные функции
    • Файлы языковых строк
    • Библиотеки
    • Модели
    • Представления

Имена пространств

Основной элемент функциональности модулей происходит из совместимого с PSR4 автозагрузчика, который использует CodeIgniter. Хотя любой код может использовать автозагрузчик PSR4 и имена пространств, основной способ в полной мере воспользоваться модулями — это использовать имена пространств в вашем коде и добавить их в app/Config/Autoload.php, в разделе psr4.

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

/acme        // New modules directory
/app
/public
/system
/tests
/writable

Откройте app/Config/Autoload.php и добавьте имя пространства Acme в свойство массива psr4.

public $psr4 = [
    APP_NAMESPACE => APPPATH, // For custom namespace
    'Config'      => APPPATH . 'Config',
    'Acme'        => ROOTPATH . 'acme',
];

Теперь, когда это настроено, мы можем получить доступ к любому файлу в папке acme через имя пространства Acme. Это само по себе решает 80% потребностей для работы модулей, поэтому вы должны обязательно ознакомиться с именами пространств и освоиться с их использованием. Несколько типов файлов будут автоматически сканироваться во всех определенных именах пространств — важная составляющая работы с модулями.

Типичная структура каталогов внутри модуля будет имитировать структуру каталогов основного приложения:

/acme
    /Blog
        /Config
        /Controllers
        /Database
            /Migrations
            /Seeds
        /Helpers
        /Language
            /en
        /Libraries
        /Models
        /Views

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

Автозагрузка файлов, не являющихся классами

В большинстве случаев ваш модуль будет содержать не только PHP-классы, но и другие файлы, такие как процедурные функции, файлы начальной загрузки, файлы констант модуля и т. д., которые обычно не загружаются так же, как и классы. Одним из подходов к этому является require-ing файла(ов) в начале файла, где он будет использоваться.

Другой подход, предоставляемый CodeIgniter, заключается в автозагрузке этих файлов не-классов так же, как вы загружаете свои классы. Все, что нам нужно сделать, это указать список путей к этим файлам и включить их в свойство $files вашего файла app/Config/Autoload.php.

public $files = [
    'path/to/my/functions.php',
    'path/to/my/constants.php',
    'path/to/my/bootstrap.php',
];

Автообнаружение

Часто вам нужно указывать полное имя пространства для файлов, которые вы хотите включить, но CodeIgniter можно настроить для упрощения интеграции модулей в ваши приложения, автоматически обнаруживая множество различных типов файлов, включая:

  • События
  • Регистраторы
  • Файлы маршрутов
  • Сервисы

Это настраивается в файле app/Config/Modules.php.

Система автообнаружения работает путем сканирования определенных каталогов и файлов в именах пространств PSR4, которые были определены в Config/Autoload.php.

Для того, чтобы автообнаружение работало для нашего имени пространства Blog, нам нужно внести небольшое изменение. Acme нужно изменить на Acme\Blog, потому что каждый «модуль» внутри имени пространства должен быть полностью определен.

public $psr4 = [
    APP_NAMESPACE => APPPATH, // For custom namespace
    'Config'      => APPPATH . 'Config',
    'Acme\Blog'   => ROOTPATH . 'acme/Blog', // Change
];

После того, как путь к папке модуля определен, процесс обнаружения будет искать обнаруживаемые элементы в этом пути и, например, найдет файл маршрутов в /acme/Blog/Config/Routes.php.

Включение/выключение обнаружения

Вы можете включить или отключить все автообнаружение в системе с помощью переменной класса $enabled. Значение False отключит все обнаружения, оптимизируя производительность, но лишая ваши модули специальных возможностей.

Указание элементов обнаружения

С помощью опции $aliases вы можете указать, какие элементы будут автоматически обнаружены. Если элемент отсутствует, то для этого элемента не будет происходить автообнаружения, но другие элементы в массиве все еще будут обнаружены.

Обнаружение и Composer

Пакеты, установленные через Composer, также будут обнаруживаться по умолчанию. Это требует только того, чтобы имя пространства, которое Composer знает, было именем пространства PSR4. Имена пространств PSR0 не будут обнаружены.

Если вы не хотите, чтобы все известные каталоги Composer сканировались при поиске файлов, вы можете отключить это, изменив переменную $discoverInComposer в Config\Modules.php:

public $discoverInComposer = false;

Работа с файлами

В этом разделе мы рассмотрим каждый тип файлов (контроллеры, представления, файлы языковых строк и т. д.) и то, как они могут использоваться в модуле. Некоторые из этих сведений более подробно описаны в соответствующем разделе руководства пользователя, но здесь они воспроизводятся для более простого понимания того, как все части складываются вместе.

Маршруты

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

Примечание

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

Фильтры

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

Примечание

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

В файле Config/Filters.php модуля вам нужно определить псевдонимы фильтров, которые вы используете.:

$filters->aliases['menus'] = MenusFilter::class;

Контроллеры

Контроллеры за пределами основного каталога app/Controllers не могут автоматически обрабатываться URI-детекцией, но должны быть указаны в самом файле маршрутов:

// Routes.php
$routes->get('blog', 'Acme\Blog\Controllers\Blog::index');

Для уменьшения необходимой для этого рутинной работы полезна функция группировки маршрутов:

$routes->group('blog', ['namespace' => 'Acme\Blog\Controllers'], function ($routes) {
    $routes->get('/', 'Blog::index');
});

Конфигурационные файлы

При работе с конфигурационными файлами дополнительных изменений не требуется. Они по-прежнему являются классами с именами пространств и загружаются с помощью команды new:

$config = new \Acme\Blog\Config\Blog();

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

Миграции

Файлы миграций будут автоматически обнаружены в определенных именах пространств. Все найденные миграции по всем именам пространств будут выполняться каждый раз.

Сетки

Файлы сеток могут использоваться как из командной строки, так и вызываться из других файлов сеток, если указано полное имя пространства. Если вызываете из командной строки, вам нужно использовать двойные обратные косые черты:

> php public/index.php migrations seed Acme\\Blog\\Database\\Seeds\\TestPostSeeder

Вспомогательные функции

Вспомогательные функции будут автоматически находиться по определенным именам пространств при использовании метода helper() , если они находятся в каталоге Helpers:

helper('blog');

Файлы языковых строк

Файлы языковых строк автоматически находятся по определенным именам пространств при использовании метода lang(), если файлы следуют той же структуре каталогов, что и основное приложение.

Библиотеки

Библиотеки всегда инициализируются по полному имени класса, поэтому специальный доступ не предоставляется:

$lib = new \Acme\Blog\Libraries\BlogLib();

Модели

Модели всегда инициализируются по полному имени класса, поэтому специальный доступ не предоставляется:

$model = new \Acme\Blog\Models\PostModel();

Представления

Представления можно загружать, используя имя пространства класса, как описано в документации по представлениям:

echo view('Acme\Blog\Views\index');

© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/general/modules.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API