获取/设置当前实体的服务

编码器1

我有一个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/

看看widgetActionwidget模板用法示例base.html.twig

编辑:但这还不是全部。你说你需要服务。如果由于某种原因呈现/嵌入控制器不适合您,或者您真的想使用Service(如Dependency Container),您可以扩展 Twig并使用services全部功能

我还实现了一个 Twig 过滤器作为示例,向您展示了这里这里的 Twig Extensions 的真正威力(在模板中使用)

查看Twig 扩展扩展 Twig以获取有关 Twig 扩展的更多信息。

还要检查service.yml服务和扩展定义——如果你没有使用 Symfony3.3+,将会有一些额外的工作要做——直接定义服务和扩展

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章