Spec-Zone.ru › CodeIgniter 4

Фабрики

  • Введение
  • Параметры фабрики
  • Параметры фабрик
  • Поведение фабрик
    • Конфигурации
    • Метод setOptions
    • Параметры опций

Введение

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

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

Посмотрите на Models в качестве примера. Вы можете получить доступ к фабрике, специфичной для Models, используя магический статический метод класса Фабрики, Factories::models(). Из-за общей структуры путей для имен пространств и папок, фабрики знают, что файлы моделей и классы находятся в папке Models, поэтому вы можете запросить модель по её сокращённому базовому имени:

use CodeIgniter\Config\Factories;

$users = Factories::models('UserModel');

Или вы также можете запросить конкретный класс:

$widgets = Factories::models('Some\Namespace\Models\WidgetModel');

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

class SomeOtherClass
{
    $widgets = Factories::models('WidgetModel');
    // ...
}

Параметры фабрики

Factories принимает во второй параметр массив значений параметров (описаны ниже). Эти директивы переопределят параметры, настроенные по умолчанию для каждого компонента.

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

$conn  = db_connect('AuthDatabase');
$users = Factories::models('UserModel', [], $conn);

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

Параметры фабрик

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

Ключ Тип Описание Значение по умолчанию
component строка или null Имя компонента (если оно отличается от имени статического метода). Это можно использовать для алиасирования одного компонента на другой. null (по умолчанию — имя компонента)
path строка или null Относительный путь внутри пространства имен/папки для поиска классов. null (по умолчанию — имя компонента)
instanceOf строка или null Требуемое имя класса для соответствия возвращаемому экземпляру. null (нет фильтрации)
getShared boolean Возвращать ли общий экземпляр класса или загружать новый. true
preferApp boolean Классы с одинаковым базовым именем в пространстве имен App переопределяют ли другие явные запросы к классам. true

Поведение фабрик

Параметры можно применить одним из трёх способов (в порядке убывания приоритета):

  • Файл конфигурации Factory со свойством компонента.
  • Статический метод Factories::setOptions.
  • Передача параметров напрямую при вызове с параметром.

Конфигурации

Чтобы установить параметры компонентов по умолчанию, создайте новый файл конфигурации в app/Config/Factory.php, который предоставляет параметры в виде массива свойств, соответствующих имени компонента. Например, если вы хотите гарантировать, что все фильтры, используемые вашим приложением, являются действительными экземплярами фреймворка, ваш файл Factories.php может выглядеть так:

<?php

namespace Config;

use CodeIgniter\Config\Factory as BaseFactory;
use CodeIgniter\Filters\FilterInterface;

class Factories extends BaseFactory
{
    public $filters = [
        'instanceOf' => FilterInterface::class,
    ];
}

Это предотвратит конфликт с независимым сторонним модулем, у которого случайно был нерелевантный путь «Filters» в пространстве имен.

Метод setOptions

Класс Factories имеет статический метод для настройки параметров во время выполнения: просто передайте желаемый массив параметров с помощью метода setOptions() и они будут объединены со значениями по умолчанию и сохранены для следующего вызова:

Factories::setOptions('filters', [
    'instanceOf' => FilterInterface::class,
    'prefersApp' => false,
]);

Параметры опций

Магический статический вызов Factories принимает во второй параметр массив значений параметров. Эти директивы переопределят сохранённые параметры, настроенные для каждого компонента, и могут быть использованы во время вызова для получения именно того, что вам нужно. Вход должен быть массивом с именами параметров в качестве ключей к каждому переопределяемому значению.

Например, по умолчанию Factories предполагает, что вы хотите получить общий экземпляр компонента. Добавив второй параметр к магическому статическому вызову, вы можете управлять тем, вернёт ли этот единственный вызов новый или общий экземпляр:

$users = Factories::models('UserModel', ['getShared' => true]); // Default; will always be the same instance
$other = Factories::models('UserModel', ['getShared' => false]); // Will always create a new instance

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

Spec-Zone.ru

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