【发布时间】: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容器管理?
【问题讨论】:
-
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/…。我不知道任何其他资源;)
标签: php templates symfony view widget