簡體   English   中英

Laravel 中的上下文綁定

[英]Contextual binding in Laravel

在 Laravel文檔之后,我想將實現接口Processable的實現TransferToInventory綁定到特定的 class ( Handler )。

可處理接口

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

TransferToInventory class

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] 不可實例化。

無論這個Handler class 是什么,都需要從容器中解析,並且需要在其構造函數中具有類型提示依賴項,才能使上下文綁定起作用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM