文档/容器/收货服务
从容器获取服务
可以通过多种方式实现对容器内容的直接访问。
为了选择适合具体项目代码的合适方法,有必要考虑每种方法的优缺点以及测试选项。
#当前类中对容器的引用
从类 Hleb\Base\Container 继承的类在方法和属性 $this->container 中获得了访问服务的额外功能。
框架的标准类 - 控制器、middlewares、命令、事件,已经从该类继承。
如果容器接口中的服务分配了自己的方法,则可以通过该方法访问服务。
控制器中演示服务的访问示例:
<?php
namespace App\Controllers;
use App\Bootstrap\Services\RequestIdInterface;
use Hleb\Base\Controller;
class ExampleController extends Controller
{
public function index(): void
{
$requestIdService = $this->container->get(RequestIdInterface::class);
$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);
}
}
$requestIdService = (new ExampleService())->service;
$config = ['container' => new TestContainer()];
$requestIdService = (new ExampleService($config))->service;
模型类是例外,其中文件同样获取服务将如下:
<?php
namespace App\Models;
use App\Bootstrap\Services\RequestIdInterface;
use Hleb\Base\Model;
class DefaultModel extends Model
{
public static function getCollection(): array
{
$requestIdService = self::container()->get(RequestIdInterface::class);
$requestIdService = self::container()->requestId();
return [];
}
}
#Container 类
对服务容器的访问还由 Hleb\Static\Container 类提供,例如:
use App\Bootstrap\Services\RequestIdInterface;
use Hleb\Static\Container;
$container = Container::getContainer();
$requestIdService = $container->get(RequestIdInterface::class);
$requestIdService = Container::get(RequestIdInterface::class);
#标准服务
在 /vendor/phphleb/framework/Static/ 文件夹中,有框架标准服务的包装类,可以在代码中类似于类 Hleb\Static\Container 使用,但仅用于单独的服务。
这些服务也可以通过先前提到的方法获得。
由于接口命名中存在不同的方法,从容器中获取标准服务可以带有 Interface 后缀,也可以不带。
例如,Hleb\Reference\RequestInterface 等同于 Hleb\Reference\Interface\Request。
← 容器结构
依赖注入 →
页面翻译:chatgpt 4-o