php - 在 Laravel 5.4 中覆盖邮件服务
问题描述
我正在尝试覆盖Mailer
in的默认实现Illuminate\Mail\MailServiceProvider
。
起初,我以为我只是扩展服务并在容器中切换实现如下:
应用\邮件\邮件程序
<?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
属性,这意味着它将以一种特殊的方式得到解决,如下所示:
照亮\基础\应用
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
并用自定义替换它。但这似乎有点苛刻。
有任何想法吗?
解决方案
The only way to solve this issue is to upgrade Laravel to version 5.5
and above. The fixed version is referenced in this issue and won't be fixed in 5.4
since the version is no longer supported.
推荐阅读
- python - 猫图像的 Keras 自动编码器的微调
- python - 我们如何将用户重定向到 Django 中的指定管理员?
- android - 检查文件内容类型
- appium - 启动会话时 Appium 桌面服务器错误无法使用默认证书签名
- javascript - 对查询字符串应用 CSS - 我的代码不起作用,但为什么?
- java - 参数化 Cucumber 特征文件
- c# - 用于 syslog 的 Serilog ASP.NET Core appsettings 配置
- java - 用相同的开头但不同的结尾解析java中的字符串
- typo3 - Typo3 为所有子页面创建参考元素
- amazon-s3 - BucketNotEmpty - 409 冲突不起作用