Laravel中的上下文绑定

时间:2019-11-21 02:15:50

标签: php laravel dependency-injection laravel-6

在Laravel document之后,我想将实现接口TransferToInventory的实现Processable绑定到特定的类(Handler)。

可处理的界面

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

TransferToInventory类

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);
    }
}

我将依赖项绑定放入AppServiceProvider中。

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

    public function boot()
    {
        //
    }
}

但是我总是遇到以下错误。

  

local.ERROR:目标[App \ Services \ Contract \ Processable]不是   实例化的。

2 个答案:

答案 0 :(得分:0)

Handler类的所有内容都需要从容器中解析出来,并且需要在其构造函数中具有类型提示依赖项才能使该接口生效,以使上下文绑定起作用。

答案 1 :(得分:0)

正如 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);
    }
    
}