Symfony 方式的小部件

Posted

技术标签:

【中文标题】Symfony 方式的小部件【英文标题】:Widgets the Symfony way 【发布时间】:2014-02-21 21:20:12 【问题描述】:

什么是创建可重用小部件的“Symfony 方式”?

我所说的小部件是指具有在 php 中定义的行为和可以在不同页面上呈现的相关模板(控制器操作)的对象。

例如标签云小部件:

// TagCloudWidget.php

class TagCloudWidget 

    /** @var PDO */
    private $connection;

    public function __construct(PDO $connection)
    
        $this->connection = $connection;
    

    public function render()
    
        $tags = $this->connection->query("SELECT * FROM tags ORDER BY name");
        $tags->setFetchMode(PDO::FETCH_CLASS, "Tag");
        include __DIR__ . "/TagCloudWidget.html.php";
    



// TagCloudWidget.html.php

<div class="tag-cloud">
    <?php foreach ($tags as $tag)  ?>
        <span class="tag" style="font-size: <?php echo $tag->importance; ?>px;"><?php echo $tag->name; ?></span>
    <?php  ?>
</div>

在 Symfony 中最好的方法是什么?如何让widget的依赖由DI容器管理?

【问题讨论】:

树枝扩展:symfony.com/doc/current/cookbook/templating/twig_extension.html Twig 扩展可能是简化模板中小部件实例化的方法 - % widget TagCloud %。但是,它不能解决任何其他问题(依赖关系、使用小部件构建应用程序的最佳实践等)。 看看这个github.com/sonata-project/SonataBlockBundle。总体思路是创建一个返回关联 html 的服务,因此您可以在任何需要的地方重用该服务(控制器、如果您将其声明为 twig 服务的 twig 等)。在我的公司,我们决定为自己创建一个块系统,其中所有块都实现相同的接口并拥有自己的标签。但那首奏鸣曲也不错。 @marjoramfx sonata-project.org/bundles/block/master/doc/index.html 的文档非常简洁。你有其他资源的链接吗? @JakubKulhan 这是官方网站:sonata-project.org/bundles/block/master/doc/reference/…。我不知道任何其他资源;) 【参考方案1】:

你可以在树枝中使用:

 render (controller("AcmeDemoBundle:Default:widget")) 

在控制器中你实现了一个 Action 方法。这个控制器不需要定义路由,但它必须渲染一个视图。

public function widgetAction()

    ...
    return array();

中呈现视图
Acme/DemoBundle/Resources/views/Default/widget.html.twig

当然,这有一个缺点,因为我相信当 Symfony 渲染主控制器的视图时,他必须对小部件的操作发出另一个内部请求。 通过这种方式,您可以将此操作用作任何其他操作,您可以访问任何服务、数据库,例如 Symfony 1.4 中的组件。

【讨论】:

利用控制器来实现这个功能对我来说似乎不合适。例如在 Nette 中,有控件 github.com/nette/examples/blob/master/Fifteen/app/components/… + github.com/nette/examples/blob/master/Fifteen/app/components/… 可以很容易地添加到控制器/演示者 github.com/nette/examples/blob/master/Fifteen/app/presenters/… 然后渲染 github.com/nette/examples/blob/master/Fifteen/app/templates/… Symfony 中没有这样的东西吗? 据我所知,在 Symfony 中,这与您所说的最相似。

以上是关于Symfony 方式的小部件的主要内容,如果未能解决你的问题,请参考以下文章

来自所需小部件的带有星星的 symfony 表单标签

在 Flutter 中的小部件之间传递数据的最佳方式

如何以编程方式将 UI 添加到基于 Qtvtkwidget 的小部件?

dojo中以编程方式与以声明方式创建的小部件之间的区别?

如何打开启动器的小部件选择器?

何时必须调用以编程方式实例化的小部件的 startup() 方法?