拉拉维尔中的上下文绑定



在Laravel文档之后,我想将一个实现接口Processable的实现TransferToInventory绑定到特定的类(Handler(。

可处理接口

interface Processable
{
    public function process(array $data);
}

转移到库存类

class TransferToInventory implements Processable
{
    public function process(array $data): void
    {
        dd($data);
    }
}

处理器

class Handler
{
    protected $data;
    protected $processor;
    /**
     * This is incoming JSON payload, already decoded to an array
     *   - var_dump($data);
     *
     * Raw JSON payload from SQS, if necessary
     *   - var_dump($job->getRawBody());
     *
     * @param  Job   $job
     * @param  array $data
     */
    public function handle(Job $job, array $data)
    {
        resolve(Processorable::class)->process($data);
    }
}

我将依赖项绑定放在应用程序服务提供程序中。

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->when(Handler::class)
            ->needs(Processable::class)
            ->give(function () {
                return new TransferToInventory;
            });
    }
    public function boot()
    {
        //
    }
}

但我总是收到以下错误。

当地。错误:目标 [应用\服务\协定\可处理] 不是 可实例化。

这个Handler类是什么都需要从容器中解析,并且需要在其构造函数中具有类型提示依赖项,以便此接口才能使上下文绑定正常工作。

正如 lagbox 所建议的那样,它对我有用,如下所示:

class Handler
{
    protected $data;
    protected $processor;
    public function __construct(Processable $processor)
    {
        $this->processor = $processor;
    }
    public function handle(Job $job, array $data)
    {
        $this->processor->process($data);
    }
    
}

最新更新