添加和注册供应商包作为可选选项的symfony方式是什么?

时间:2014-02-20 21:04:10

标签: php symfony

我试图实现一个允许用户从小部件列表中进行选择的功能。这些小部件后面有类,它们将根据给定的选项获取和显示数据。我想知道什么是渲染这个列表的symfony方式?

假设我的文件结构如下:

vendor/
    namespace/
        widget1/
            Namespace/
                Widget1/
                    Controler/
                    Form/
                    NamespaceWidget1.php
        widget2/
            Namespace/
                Widget2/
                    Controler/
                    Form/
                    NamespaceWidget2.php

目前,我的项目中有一个包,它有一个跟踪所有小部件及其类的实体。我想知道的是,如果这是最好的方式,或者我应该使用像composer这样的文件系统,并创建类似widget.json的东西,它将存储与实体相同的信息?

1 个答案:

答案 0 :(得分:2)

只是我的想法,但......

如果您有多个具有相同依赖关系的项目,您可以将它们合并为一个并使它们成为完整的包,或者您可以将公共依赖项放在一个公共包中,然后在子包中构建特定的小部件,例如.. < / p>

Blah
    Common
    Widget1 (References Common)
    Widget2 (References Common)
    ....

对于您的情况,您可以使用一个使用服务标记的公共包,然后通过编译器传递获取该服务标记,然后只将可用的小部件构建到您可以在您的引用中的“小部件服务”中。例如......

service.yml(或其他)

bleh.something.i_have_no_imagination:
    class: %bleh.something.i_have_no_imagination.class%
    tags:
        - { name: bleh.something.tag_name }

class SmartCoverPolicyBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        $container->addCompilerPass(new YourCompilerPass());
    }
}

编译传递

class RegisterRuleCheckersPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        if (!$container->hasDefinition('bleh.something.common_registry')) {
            return;
        }

        $registry = $container->getDefinition('bleh.something.common_registry');
        $checkers = array();

        $ids = $container->findTaggedServiceIds('bleh.something.tag_name');

        foreach ($ids as $id => $attributes) {
            $registry->addMethodCall('addWidget', array(new Reference($id)));
        }
    }
}

服务

class Register
{
    private $widgets;

    public function __construct()
    {
        $this->widgets = new ArrayCollection;
    }

    public function addWidget($widget)
    {
        if (!$this->has->widgets($widget)) {
            $this->widgets->add($widget);
        }

        return $this;
    }

    private hasWidget($widget)
    {
        return $this->widgets->has($widget);
    }

    public function getWidgets()
    {
        return $this->widgets;
    }
}

这样您可以根据需要添加任意数量的小部件,而无需真正触摸公共包。