因此,这并不能完全回答问题,但会产生如下结果:
array:3 [▼
"default" => Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport {#401 ▶}
"first" => Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport {#407 ▶}
"second" => Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport {#413 ▶}
]
您将获得所需的数组索引以及实际的传输对象。
使用 bin/console debug:container mailer.transports 揭示了 Transports 对象的存在:
namespace Symfony\Component\Mailer\Transport;
final class Transports implements TransportInterface
{
private $transports;
$transports 是我们所追求的,但没有反射就无法访问它,并且该类是最终的,因此我们无法真正扩展它。一个蛮力解决方案是将完整的类克隆(即复制)到 App 命名空间中并说服邮件程序使用它:
namespace App\Mailer;
final class Transports implements TransportInterface
{
public $transports; // Change from private to public.
the rest stays the same
# config/services.yaml
App\Mailer\Transports: '@mailer.transports' # define alias
# HomeController.php
use App\Mailer\Transports;
class HomeController extends AbstractController
{
public function index(Transports $transports): Response
{
dump($transports->transports);
说服邮件系统使用我们的传输是困难的部分。通常,您只需添加编译器通道并将 mailer.transports 服务的类更改为 App 传输。遗憾的是,这不起作用,因为实际的服务定义使用工厂来创建传输,并且似乎没有更改传输类的特定点。具体来说:
namespace Symfony\Component\Mailer;
class Transport # This is actually a factory class, poor name
{
# and the factory method
public function fromStrings(array $dsns): Transports
{
$transports = [];
foreach ($dsns as $name => $dsn) {
$transports[$name] = $this->fromString($dsn);
}
return new Transports($transports);
}
如您所见,Transports 类名称是硬编码的。我试图扩展该类并说服它使用不同的 Transports 类,但它的返回类型使它变得困难。作为概念证明,我决定将整个类复制到 App 命名空间,看看会发生什么。你通常不会这样做,因为类中有相当多的代码。随着时间的推移可能会更新的代码。我还将这个类重命名为 TransportFactory,因为 Transport 这个名字似乎被过度使用了。然后更改服务定义以使用新类。
namespace App\Mailer;
class TransportFactory
{
# src/Kernel.php
class Kernel extends BaseKernel implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container->getDefinition('mailer.transport_factory')->setClass(TransportFactory::class);
}
此时,您应该有一个工作示例产生我在答案开头给出的数组。对于本应是一个简单的请求,这是相当多的工作。也许其他人现在会走过来说,嘿,就这样做吧。
显然,您应该仔细考虑是否确实需要此功能。直接从应用程序的扩展中读取 config/packages/mailer.yaml 可能会更好。