文档/容器/收货服务

从容器获取服务

可以通过多种方式实现对容器内容的直接访问。 为了选择适合具体项目代码的合适方法,有必要考虑每种方法的优缺点以及测试选项。


#当前类中对容器的引用

从类 Hleb\Base\Container 继承的类在方法和属性 $this->container 中获得了访问服务的额外功能。 框架的标准类 - 控制器、middlewares、命令、事件,已经从该类继承。

如果容器接口中的服务分配了自己的方法,则可以通过该方法访问服务。 控制器中演示服务的访问示例:

<?php
// File /app/Controllers/ExampleController.php

namespace App\Controllers;

use 
App\Bootstrap\Services\RequestIdInterface;
use 
Hleb\Base\Controller;

class 
ExampleController extends Controller
{
    public function 
index(): void
    
{
        
// variant 1
        
$requestIdService $this->container->get(RequestIdInterface::class);
        
// variant 2
        
$requestIdService $this->container->requestId();
    }
}

指向容器的引用存储在从 Hleb\Base\Container 继承的对象类的属性 $this->config(数组中的键 'container')中。 在创建指定对象时,可以在参数 'config' 中分配不同的值(例如,带测试容器)。
否则,如果在参数 'config' 中未指定特定的容器或缺少构造函数的参数 'config',则默认会创建容器。

<?php

use App\Bootstrap\Services\RequestIdInterface;

class 
ExampleService extends \Hleb\Base\Container
{
    public 
RequestIdInterface $service;

    public function 
__construct(array $config = [])
    {
        
parent::__construct($config);

        
$this->service $this->container->get(RequestIdInterface::class);
    }
}

// Create an object with a framework container.
$requestIdService = (new ExampleService())->service;

// Create an object with a test container.
$config = ['container' => new TestContainer()];
$requestIdService = (new ExampleService($config))->service;

模型类是例外,其中文件同样获取服务将如下:

<?php
// File /app/Models/DefaultModel.php

namespace App\Models;

use 
App\Bootstrap\Services\RequestIdInterface;
use 
Hleb\Base\Model;

class 
DefaultModel extends Model
{
    public static function 
getCollection(): array
    {
        
// variant 1
        
$requestIdService self::container()->get(RequestIdInterface::class);
        
// variant 2
        
$requestIdService self::container()->requestId();

        return [];
    }
}

#Container 类

对服务容器的访问还由 Hleb\Static\Container 类提供,例如:

use App\Bootstrap\Services\RequestIdInterface;
use 
Hleb\Static\Container;

// variant 1
$container Container::getContainer();
$requestIdService $container->get(RequestIdInterface::class);

// variant 2
$requestIdService Container::get(RequestIdInterface::class);

#标准服务

/vendor/phphleb/framework/Static/ 文件夹中,有框架标准服务的包装类,可以在代码中类似于类 Hleb\Static\Container 使用,但仅用于单独的服务。
这些服务也可以通过先前提到的方法获得。

由于接口命名中存在不同的方法,从容器中获取标准服务可以带有 Interface 后缀,也可以不带。 例如,Hleb\Reference\RequestInterface 等同于 Hleb\Reference\Interface\Request

容器结构 依赖注入

页面翻译:chatgpt 4-o
返回顶部