我试图实现一个允许用户从小部件列表中进行选择的功能。这些小部件后面有类,它们将根据给定的选项获取和显示数据。我想知道什么是渲染这个列表的symfony方式?
假设我的文件结构如下:
vendor/
namespace/
widget1/
Namespace/
Widget1/
Controler/
Form/
NamespaceWidget1.php
widget2/
Namespace/
Widget2/
Controler/
Form/
NamespaceWidget2.php
目前,我的项目中有一个包,它有一个跟踪所有小部件及其类的实体。我想知道的是,如果这是最好的方式,或者我应该使用像composer这样的文件系统,并创建类似widget.json的东西,它将存储与实体相同的信息?
答案 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;
}
}
这样您可以根据需要添加任意数量的小部件,而无需真正触摸公共包。