Symfony:如何创建在多个捆绑包中使用的通用共享(Helper)


Symfony :HOW TO Create Shared -General- (Helper) used in multiple bundles

我有很多助手函数-Grouped In Classes-用于(格式化字符串和日期,URL助手(,我想在几个捆绑包中使用和共享,我需要知道如何在捆绑包之间共享这些助手函数的最佳实践。

我想到的是创建一个助手捆绑包,并在我的项目中的另一个捆绑包中使用这个捆绑包,或者使用供应商助手。

那么我该如何做到这一点,以及在多个捆绑包中使用创建共享帮助程序的最佳实践是什么。

如果有任何参考资料我可以看,请与我分享。

提前谢谢。

最佳实践是创建一个包含这些类的PHP库。如果您确实需要Symfony集成(例如DIC配置(,那么创建依赖于此库的捆绑包。

每个使用bundle的bundle都必须在composer.json中列出它的依赖项。因此,每次安装依赖它的bundle时,它都会被自动安装。

有很多很棒的库示例,它们可以使用composer导入并使用,即使它们本身不是捆绑包,也可以使用,例如,看看Doctrine''Common。

无论如何,您也可以像在Symfony中创建任何其他捆绑包一样创建捆绑包,并根据您的需要构建代码。您会注意到,Doctrine的许多捆绑包将使用共享库Doctrine'Common

如果你有通用类,它应该被分组在一个bundle中(正如你所说的"Helper bundle"(,如果可能的话,类应该被定义为服务。

如果你在多个项目中使用这个捆绑包,并且你想在未来升级它,你应该考虑将这个捆绑包移动到单独的repo中,并将其定义为"独立"捆绑包(这样你就可以按composer和vendor目录将其包含在你的项目中。

我认为最佳实践创建helper Bundle并在helper Bundle中创建服务然后您可以使用多个捆绑包中的服务。

伪示例:在您的服务Helper.php

 namespace HelperBundle'Services;
class Helper{
    protected $url;
    public function __construct(){
   }
}

在依赖项注入文件夹中的ProfileTreeUserExtension.php中确认加载的服务配置文件是sevices.yml

namespace HelperBundle'DependencyInjection;
use Symfony'Component'DependencyInjection'ContainerBuilder;
use Symfony'Component'Config'FileLocator;
use Symfony'Component'HttpKernel'DependencyInjection'Extension;
use Symfony'Component'DependencyInjection'Loader;
/**
 * This is the class that loads and manages your bundle configuration
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 */
class ProfileTreeLayoutExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);
        $loader = new Loader'YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}

service.yml

services:
      helper.service: 
      class: HelperBundle'Services'Helper

然后您可以在几个捆绑包中致电HelperService Just

$helper = $this->container->get('helper.service');

您还可以在另一个服务中扩展Helper类

use HelperBundle'Services'Helper;
class AnotherService extends Helper{}

关于服务容器和依赖注入的好文章