假设我有两个控制器可以使用同一个实体,并使用相同的模板集。每个模板都应生成按钮/表单/链接,其中包含生成此模板的控制器操作的URL。所以基本上,模板中唯一不同的是生成的URL。
您可以将问题想象为具有newAction
和editAction
的管理员CRUD控制器,它使用相同的模板,但表单操作必须不同。不过,我的情况比这更复杂。
我考虑过:
有解决这个问题的聪明方法吗?
编辑:我的问题是没有生成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原则中问题是否有更好的解决方案?
答案 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模板,然后将其包含在我的其他模板中。在该模板中,如果您愿意,可以将目标路径传递给它,然后您只需要一个表单模板。