我有一个Project
实体,它有一个定义许多路由的控制器:
projects/1 projects/1/foo projects/1/bar
我需要一项服务来提供当前项目。用例是我在需要知道当前项目的基础树枝模板中有依赖项。即在当前控制器所服务的模板上下文之外的下拉项目选择器。
我已经尝试创建一个服务来获取路线信息$container->get('router.request_context');
,但是,它只提供了一条路径。如果不需要,我不想解析路径字符串。
什么是最合适的方法?
如果我理解正确,您的问题的解决方案是渲染/嵌入控制器。当然,除了当前模板之外,它是使用一些自定义逻辑呈现 html 部分的最简单但以某种方式可接受的解决方案。
您可以阅读有关渲染/嵌入控制器的信息。
一些片段...
定义controller:action
(显然我的例子中的逻辑非常简单):
/**
* Generate select input field.
*
* @Route("/widget", name="project_widget")
* @Method("GET")
*/
public function widgetAction()
{
$repo = $this->getDoctrine()
->getManager()
->getRepository('AppBundle:Project');
// #NOTICE: Wee need master request info, because our widget
// is rendered and called as subrequest.
$masterRequest = $this->get('request_stack')->getMasterRequest();
// #NOTICE: You need second parameter as default value in case there is no id in masterRequest route.
$currentProjectId = $masterRequest->get('id', 0);
$currentProject = $repo->find($currentProjectId);
$projects = $repo->findAll();
return $this->render('project/widget.html.twig', [
'currentProject' => $currentProject,
'projects' => $projects,
]);
}
然后你需要project/widget.html.twig
为它创建模板:
<div class="widget_project_selection">
{% if projects is not empty %}
<select name="widget_project_selection" id="widget_project_selection">
<option value="">None</option>
{% for project in projects %}
<option value="{{ project.id }}"
{# #NOTICE: If this is current project, select it #}
{{- currentProject and project.id == currentProject.id
? 'selected="selected"'
: '' -}}
>
{{- project.title -}}
</option>
{% endfor %}
</select>
{% else %}
<span>{{ 'Sadly, no projects yet :('|trans }}</span>
{% endif %}
</div>
最后(但并非最不重要)将其渲染在以下位置base.html.twig
:
{{- render(controller('AppBundle:Project:widget')) -}}
我为您创建了一个Github 存储库作为参考。这是一个具有类似设置的小型 Symfony 应用程序。如果您愿意,您甚至可以运行它,不要忘记依赖项和数据库更新。入口点是/app_dev.php/project/
看看widgetAction,widget模板和用法示例在base.html.twig
。
编辑:但这还不是全部。你说你需要服务。如果由于某种原因呈现/嵌入控制器不适合您,或者您真的想使用Service
(如Dependency Container
),您可以扩展 Twig并使用services的全部功能。
我还实现了一个 Twig 过滤器作为示例,向您展示了这里和这里的 Twig Extensions 的真正威力(在模板中使用)。
查看Twig 扩展和扩展 Twig以获取有关 Twig 扩展的更多信息。
还要检查service.yml
服务和扩展定义——如果你没有使用 Symfony3.3+,将会有一些额外的工作要做——直接定义服务和扩展。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句