gpt4 book ai didi

php - 如何在 Laravel 作业类中使用绑定(bind)实现?

转载 作者:行者123 更新时间:2023-12-02 16:56:31 24 4
gpt4 key购买 nike

我会在我的作业中使用接口(interface),并在作业类中获取它的上下文实现。

我读了所有的 tuts。

我注册它:

class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app
->when(SendinBlueJob::class)
->needs(MessageProviderInterface::class)
->give(SendinBlueService::class);
}
}

我 dispatch 工作:

class MessageObserver
{
public function created(MessageInterface $message)
{
SendinBlueJob::dispatch($message);
}
}

在作业类中我想获得绑定(bind)服务:

class SendinBlueJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

public $message;
public $messageProvider;

public function __construct(MessageInterface $message, MessageProviderInterface $messageProvider)
{
$this->message = $message;
$this->messageProvider = $messageProvider;
$this->handle();
}

public function handle()
{
dd($this->messageProvider);
}
}

我无法分派(dispatch)作业,因为服务器抛出错误:

Too few arguments to function App\Jobs\SendinBlueJob::__construct(), 1 passed in /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php on line 16 and exactly 2 expected

我明白了,但我不明白为什么在构造函数中调用接口(interface)时 Laravel 不注入(inject)绑定(bind)服务。

最佳答案

您可以在handle 方法中注入(inject)依赖。

class SendinBlueJob implements ShouldQueue
{
use Dispatchable,
InteractsWithQueue,
Queueable,
SerializesModels;

public $message;

public function __construct(MessageInterface $message)
{
$this->message = $message;
}

public function handle(MessageProviderInterface $messageProvider)
{
dd(
$this->message, // MessageInterface
$messageProvider // SendInBlueService
);
}
}

更新

解决方案一

因为您正在使用上下文绑定(bind),并且当您通过方法进行依赖注入(inject)时上下文绑定(bind)不起作用(这是在作业中执行此操作的唯一方法),请考虑以下方法...

在您的服务提供商中:

class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->when(MessagesController::class) // Your controller
->needs(MessageProviderInterface::class)
->give(SendinBlueService::class);
}
}

在你的 Controller 中:

class MessagesController extends Controller
{
protected $messageProvider;

public function __construct(MessageProviderInterface $messageProvider)
{
$this->messageProvider = $messageProvider;
}

public function store(Request $request)
{
// ...

// Create your message
$message = Message::create($request->all());

// Dispatch your job in the controller
SendInBlueJob::dispatch($message, $this->messageProvider);

// ...
}
}

在你的工作中:

class SendinBlueJob implements ShouldQueue
{
use Dispatchable,
InteractsWithQueue,
Queueable,
SerializesModels;

protected $message;

protected $messageProvider;

public function __construct(MessageInterface $message, MessageProviderInterface $messageProvider)
{
$this->message = $message;

$this->messageProvider = $messageProvider;
}

public function handle()
{
dd($this->messageProvider);
}
}

解决方案2

或者,不要使用上下文绑定(bind)。您可以执行类似于以下操作的操作...

创建一个新的SendinBlueMessageProviderInterface:

interface SendinBlueMessageProviderInterface extends MessageProviderInterface
{
//
}

将接口(interface)绑定(bind)到您的实现。

$this->app->bind(
SendinBlueMessageProviderInterface::class,
SendinBlueService::class
);

现在您将能够通过 handle 方法注入(inject)消息提供程序。

public function handle(SendinBlueMessageProviderInterface $messageProvider)
{
dd($messageProvider);
}

关于php - 如何在 Laravel 作业类中使用绑定(bind)实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56168125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com