marcbln/symfony-facades

使用外观类调用 Symfony 服务。

dev-main 2023-12-08 20:32 UTC

This package is auto-updated.

Last update: 2024-09-29 21:34:43 UTC


README

这是一个来自 lagdo/symfony-facades 的分支,支持 symfony 6。

Build Status Scrutinizer Code Quality StyleCI Coverage Status

Latest Stable Version Total Downloads License

Symfony 服务的外观类

使用此包,可以通过静态方法语法调用 Symfony 服务。

这是将服务作为参数传递给其他类的构造函数或使用懒加载服务的更简单替代方案。当类依赖于许多服务,但只偶尔调用每个服务时,这特别有趣。

安装

使用 composer 安装此包。

composer require marcbln/symfony-facades

如果项目不使用 Symfony Flex,则在 src/Kernel.php 文件中注册 Marcbln\Symfony\Facades\FacadesBundle 包。

使用方法

外观类继承自 Marcbln\Symfony\Facades\AbstractFacade 抽象类,并实现了 getServiceIdentifier() 方法,该方法返回对应服务的 ID。

namespace App\Facades;

use App\Services\MyService;
use Marcbln\Symfony\Facades\AbstractFacade;

class MyFacade extends AbstractFacade
{
    /**
     * @inheritDoc
     */
    protected static function getServiceIdentifier()
    {
        return MyService::class;
    }
}

现在可以通过 App\Facades\MyFacade 外观类调用 App\Services\MyService 服务的方法,如下所示。

class TheService
{
    public function theMethod()
    {
        MyFacade::myMethod();
    }
}

而不是这样做。

class TheService
{
    /**
     * @var MyService
     */
    protected $myService;

    public function __construct(MyService $myService)
    {
        $this->myService = $myService;
    }

    public function theMethod()
    {
        $this->myService->myMethod();
    }
}

使用服务定位器

上面的外观类仅适用于声明为公共的服务。

要在 config/services.yaml 文件中创建私有服务的外观类,必须声明服务定位器。请参阅 Symfony 服务定位器文档

在以下示例中,将 Twig 服务传递给服务定位器。

    marcbln.facades.service_locator:
        public: true
        class: Symfony\Component\DependencyInjection\ServiceLocator
        tags: ['container.service_locator']
        arguments:
            -
                Twig\Environment: '@twig'

然后可以为 Twig 服务定义外观类。

namespace App\Facades;

use Twig\Environment;
use Marcbln\Symfony\Facades\AbstractFacade;

class View extends AbstractFacade
{
    /**
     * @inheritdoc
     */
    protected static function getServiceIdentifier()
    {
        return Environment::class;
    }
}

现在可以使用外观类渲染模板。

use App\Facades\View;

class TheService
{
    public function theMethod()
    {
        ...
        $html = View::render($template, $vars);
        ...
    }
}

提供的外观类

此包为一些 Symfony 服务提供了外观类。

日志记录器

必须在 config/services.yaml 文件中将 logger 服务传递给服务定位器。

    marcbln.facades.service_locator:
        public: true
        class: Symfony\Component\DependencyInjection\ServiceLocator
        tags: ['container.service_locator']
        arguments:
            -
                Psr\Log\LoggerInterface: '@logger'

现在可以使用外观类记录消息。

use Marcbln\Symfony\Facades\Log;

Log::info($message, $vars);

视图

必须在 config/services.yaml 文件中将 twig 服务传递给服务定位器。

    marcbln.facades.service_locator:
        public: true
        class: Symfony\Component\DependencyInjection\ServiceLocator
        tags: ['container.service_locator']
        arguments:
            -
                Twig\Environment: '@twig'

现在可以使用外观类渲染视图。

use Marcbln\Symfony\Facades\View;

$html = View::render($template, $vars);

贡献

  • 问题跟踪器:github.com/marcbln/symfony-facades/issues
  • 源代码:github.com/marcbln/symfony-facades

许可协议

此包采用 3-Clause BSD 许可协议。