charcoal/factory

炭对象创建(工厂、抽象工厂、构建器、类解析器)

v5.0.0 2024-03-13 15:05 UTC

README

工厂包提供抽象对象工厂以创建对象。

安装

composer require charcoal/factory

用法

工厂可以将类型解析为FQN,并使用可选的参数集创建该类的实例,同时确保默认基类。

工厂选项应直接从构造函数设置

$factory = new Charcoal\Factory\GenericFactory([
    // Ensure the created object is a Charcoal Model
    'base_class' => '\Charcoal\Model\ModelInterface',

    // An associative array of class map (aliases)
    'map' => [
        'foo' => '\My\Foo',
        'bar' => '\My\Bar',
    ],

    // Constructor arguments
    'arguments' => [
        $dep1,
        $dep2,
    ],

    // Object callback
    'callback' => function ($obj) {
        $obj->do('foo');
    },
]);

// Create a "\My\Custom\Baz" object with the given arguments + callbck
$factory->create('\My\Custom\Baz');

// Create a "\My\Foo" object (using the map of aliases)
$factory->create('foo');

// Create a "\My\Custom\FooBar" object with the default resolver
$factory->create('my/custom/foo-bar');

构造函数选项(类依赖)是

注意

  • [1] 如果未提供解析器,将使用默认的 \Charcoal\Factory\GenericResolver

类解析器

发送到 create() 方法的类型(类标识符)可以通过自定义的 Callable 解析器进行解析/解析。

如果构造函数未传递 resolver,则使用默认的 \Charcoal\Factory\GenericResolver。此默认解析器将 my/custom/foo-bar 转换为 \My\Custom\FooBar 等。

类映射和别名

可以通过在工厂构造函数中设置它们来添加类别名。

$factory = new GenericFactory([
    'map' => [
        'foo' => '\My\Foo',
        'bar' => '\My\Bar',
    ],
]);

// Create a `\My\Foo` instance
$obj = $factory->create('foo');

确保对象类型

可以通过设置 base_class 属性来确保对象类型。

设置基类的推荐方法是将其设置在构造函数中

$factory = new GenericFactory([
    'base_class' => '\My\Foo\BaseClassInterface',
]);

👉 注意,接口 也可以用作工厂的基类。

设置默认对象类型

可以通过设置 default_class 属性来设置默认对象类型(默认类)。

设置默认类的推荐方法是在构造函数中设置它

$factory = new GenericFactory([
    'default_class' => '\My\Foo\DefaultClassInterface',
]);

⚠️ 设置默认类名将更改标准工厂行为。当使用无效类名时,而不是抛出 Exception,将始终返回默认类类型的对象。

构造函数参数

可以设置“自动”构造函数参数,这些参数将传递给每个创建的对象。

设置构造函数参数的推荐方法是将参数数组传递给构造函数

$factory = new GenericFactory([
    'arguments' => [
        [
            'logger' => $container['logger'],
        ],
        $secondArgument,
    ],
]);

执行对象回调

可以在对象实例化时执行对象回调。回调是任何接受新创建的对象引用作为其函数参数的 Callable

// $obj is the newly created object
function callback($obj): void;

添加对象回调的推荐方法是将 Callable 传递给构造函数

$factory = new GenericFactory([
    'arguments' => [[
        'logger' => $container['logger']
    ]],
    'callback' => function ($obj) {
        $obj->foo('bar');
        $obj->logger->debug('Objet instanciated from factory.');
    }
]);

资源