Я пытаюсь переопределить реализацию по умолчанию Mailer
в Illuminate\Mail\MailServiceProvider
.
Сначала я подумал, что просто расширю службу и переключу реализацию в контейнере следующим образом:
App \ Mail \ Mailer
<?php
namespace App\Mail;
class Mailer extends \Illuminate\Mail\Mailer
{
public function getTo()
{
return $this->to;
}
}
App \ Providers \ AppServiceProvider
<?php
namespace App\Providers;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('mailer', function (Container $app) {
// ...
$mailer = new \App\Mail\Mailer(
$app['view'], $app['swift.mailer'], $app['events']
);
// ...
return $mailer;
});
}
}
Проблема заключается в том, чтонесмотря на то, что я переопределил определение контейнера при разрешении службы, он полностью игнорирует мое определение, потому что Illuminate\Mail\MailServiceProvider
имеет свойство $defer = true
, что означает, что оно будет разрешено особым образом, например:
Осветить \ Foundation \ Application
public function make($abstract)
{
$abstract = $this->getAlias($abstract);
if (isset($this->deferredServices[$abstract])) {
$this->loadDeferredProvider($abstract);
}
return parent::make($abstract);
}
Итак, не имеет значения, что я пытался переопределить службу, потому что Illuminate\Mail\MailServiceProvider
всегда будет предпочтительнее, поскольку это deferred
поставщик услуг,Я также попытался определить своего поставщика услуг как $defer = true
, но безуспешно.
Единственный вариант, который я могу придумать, - это полностью удалить Illuminate\Mail\MailServiceProvider
и заменить его на пользовательский.Но это кажется немного грубым.
Есть идеи?