Вы можете внедрить зависимости в методе handle
.
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
);
}
}
Обновление
Раствор 1
Поскольку вы используете контекстную привязку, а контекстная привязка не работает, когда вы вводите зависимости с помощью метода (который является единственным способом сделать это в работе), рассмотрите следующий подход ...
У вашего поставщика услуг:
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->when(MessagesController::class) // Your controller
->needs(MessageProviderInterface::class)
->give(SendinBlueService::class);
}
}
В вашем контроллере:
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
В качестве альтернативы, не используйте контекстную привязку. Вы можете сделать что-то похожее на следующее ...
Создать новый SendinBlueMessageProviderInterface
:
interface SendinBlueMessageProviderInterface extends MessageProviderInterface
{
//
}
Свяжите интерфейс с вашей реализацией.
$this->app->bind(
SendinBlueMessageProviderInterface::class,
SendinBlueService::class
);
Теперь вы сможете внедрить поставщика сообщений с помощью метода handle
.
public function handle(SendinBlueMessageProviderInterface $messageProvider)
{
dd($messageProvider);
}