共享模板内的自定义路由

时间:2014-12-12 14:49:52

标签: symfony model-view-controller twig template-engine

假设我有两个控制器可以使用同一个实体,并使用相同的模板集。每个模板都应生成按钮/表单/链接,其中包含生成此模板的控制器操作的URL。所以基本上,模板中唯一不同的是生成的URL。

您可以将问题想象为具有newActioneditAction的管理员CRUD控制器,它使用相同的模板,但表单操作必须不同。不过,我的情况比这更复杂。

我考虑过:

  • 从控制器设置路线,但感觉就像很多代码不合适。
  • 不同的模板集。看起来像反DRY和许多重用的代码。
  • 使用模板继承,其中基本模板是包含所有HTML的模板,子模板只包含链接,但感觉真的很糟糕。

有解决这个问题的聪明方法吗?

编辑:我的问题是没有生成CRUD。这是一个"最佳实践"题。

我在实现类似eshop购物车的东西时遇到了这个问题,其中包含大量的javascript逻辑。它出现两次:在网站和iframe中,由其他一些设备(iPad和东西)使用。两个购物车必须看起来相同,但由于逻辑不同,链接必须导致不同的URL。

我现在最终做的是拥有2个模板

包含所有标记的那个 cart.html.twig:

{% set edit_cart_item = path('edit_cart_item') %}
{% set remove_cart_item = path('remove_cart_item') %}
...html...
<a href="{{ edit_cart_item }}">Edit item</a>
...more html...

iframe中的用法, public_cart.html.twig:

{% extends 'MyCartBundle::cart.html.twig' %}
{% set edit_cart_item = path('public_edit_cart_item') %}
{% set remove_cart_item = path('public_remove_cart_item') %}

在所有花哨的OOP原则中问题是否有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

真的没有'聪明'的方法。为什么不直接使用指定的Doctrine命令为它生成它,然后从那里开始呢? http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html

php app/console generate:doctrine:crud有各种选项

这将以“适当”的方式为您提供坚实的基础,然后您可以执行自定义。

修改

阅读完更新的帖子后,我会看一下:http://symfony.com/doc/current/book/forms.html#changing-the-action-and-method-of-a-form

因此,如果您愿意,可以通过将选项传递到表单,然后通过setAction()设置目标来处理要显示的表单的逻辑:

$form = $this->createFormBuilder($task)
    ->setAction($this->generateUrl('target_route'))
;

通过设计,Symfony为您提供了很多灵活性。可以在此处找到有关表单最佳实践的良好参考:http://symfony.com/doc/current/best_practices/forms.html

我也认为你在做什么就好了。当我有表单的复杂情况时,我喜欢为表单本身创建一个Twig模板,然后将其包含在我的其他模板中。在该模板中,如果您愿意,可以将目标路径传递给它,然后您只需要一个表单模板。