【问题标题】:Different Variables/Functions for one twig.html一个 twig.html 的不同变量/函数
【发布时间】:2022-01-09 10:43:01
【问题描述】:

自从 3 周以来,我尝试使用 symfony 框架学习 php。 我想构建一个可以跟踪我的扩展的应用程序。

我取得了不错的进展,但由于 2 天以来我有一点逻辑问题,所以也许有人可以在这里帮助我。

我想做一个仪表板。(项目的主要方面)用户可以在那里监控支出。 这行得通。现在我还想在仪表板上有一个表格,这样用户就可以添加新的支出。我已经实现了一个表单,但有一条额外的路线。所以在我的 ExpenditureController 我有 functions dashboardfunction addExpenditure 生成不同的 twig.html 模板。

因此用户可以使用 ...budgetapp/expenditure/dashboard 监控他的支出 他可以用 ...budgetapp/expenditure/addexpenditure 添加新的 Expenditure

我的仪表板功能

    #[Route('/dashboard/', name: 'dashboard')]
public function dashboard(ExpenditureRepository $ar)
   {
    $user = $this->getUser();
    $expenditures = $ar-> findexpendituresOfUser($user);

    return $this->render('expenditure/dashboard.html.twig', [
    'expenditures' => $expenditures,
       ]);
}

支出/dashboard.html.twig 在表格中显示当前用户的支出

我的 addExpenditure-Function 公共函数 addExpenditure (ManagerRegistry $doctrine, Request $request){

    $em = $doctrine->getManager();
    $expenditure = new Expenditure();
    $form = $this->createForm(ExpenditureType::class, $Expenditure);
    $form->handleRequest($request);

    if($form->isSubmitted()){
    $em->persist($expenditure);
    $em->flush();
    }

    return $this->render('expenditure/addexpenditure.html.twig', [
        'addexpenditureForm' => $form->createView()
    ]);
}

支出/addexpenditure.html.twig 如下所示:

{% block body %}
<div class="container">
{{form(eintragenForm)}}
</div>
{% endblock %}

我的问题/思维错误: 如何将表单实现到仪表板?因此,我当然可以从 addexpenditure 函数中获取代码,并将其 1:1 放入仪表板功能中。但我不认为这是正确的方法?我还尝试在官方Embedding Controllers Documentation of Symfony 中包含模板片段,但这也不起作用。 所以有人可以帮助我建议您在项目中如何处理这个问题?

最好的问候 马库斯

【问题讨论】:

    标签: php forms symfony twig dashboard


    【解决方案1】:

    有两种可能的解决方案:将 viewadd 逻辑放在一个控制器的操作中,或者将它们分开。由于您可能进行了一些验证,因此在一个操作中同时添加和查看代码是合理的(否则,您将不得不通过会话传递错误,这不是很漂亮)。所以基本上,您的仪表板/添加操作将如下所示:

    #[Route('/dashboard/', name: 'dashboard')]
    public function dashboard(Request $request, ExpenditureRepository $ar, ManagerRegistry $doctrine)
    {
        $expenditure = new Expenditure();
        $form = $this->createForm(ExpenditureType::class, $expenditure);
    
        if ($request->isMethod('POST')) {
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $em = $doctrine->getManager();
                $em->persist($expenditure);
                $em->flush();
    
                return $this->redirectToRoute('dashboard');
            }
        }
    
        $user = $this->getUser();
        $expenditures = $ar-> findexpendituresOfUser($user);
    
        return $this->render(
            'expenditure/dashboard.html.twig',
            [
                'expenditures' => $expenditures,
                'addexpenditureForm' => $form->createView(),
            ]
        );
    }
    

    这里发生了什么:

    • 首先检查是否使用了 POST http 方法,如果是 - 这意味着 该表格已提交,您可以处理它。 还有一个不检查请求方法的替代解决方案,请参阅 cmets 了解更多信息。
    • 如果这是一个 GET 请求,只显示普通仪表板
    • 如果表单已提交且有效 - 保存数据并重定向到 同一页。否则,您需要清空所有提交的数据 从表格等(这不是正确的做法)
    • 如果表单无效,不重定向,只渲染页面 正常,所有错误都会显示出来。

    最后,您当然必须像以前那样在dashboard.html.twig 上呈现表单:{{form(eintragenForm)}}

    【讨论】:

    • 您关于不使用嵌入式控制器的开场白不仅不准确,而且有些误导。调试工具栏不使用嵌入式控制器。在许多用例中,嵌入式控制器是有意义的。包括重新使用相同的表单/控制器组合。我并不是说你的其余答案是错误的。我承认我厌倦了阅读原始问题并且不知道要问什么。您提出的解决方案可能是理想的。
    • 我认为用if ($request-&gt;isMethod('POST'))检查你是否有一个POST请求来知道是否提交了表单是多余的,因为你已经用$form-&gt;isSubmitted()检查了它。
    • @Skunka 是的,你是对的。我只是不喜欢调用 handleRequest ,除非我确定这是一个发布请求。基本上,你可以一直调用handleRequest,只检查isSubmitted()而不是isMethod('POST')
    • @Cerad 好吧,我同意你的观点,这更像是个人品味。我个人不喜欢使用此功能来避免处理主/子请求逻辑等。而且它对于高负载系统也很重要,因为处理子请求需要更多时间。但为了简化答案,我删除了该声明,谢谢。
    • 非常感谢,尤其是哈斯特!我将添加和查看逻辑放在控制器的相同操作中。这工作正常。我有最后一个问题,只是为了理解一切正确。将不同的逻辑放在一个动作中是“正常的”吗?另一种方式(对于特殊/其他应用领域)是嵌入式控制器?因为我认为当我将添加和查看逻辑放入其中时,我的控制器操作仪表板结构不合理。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2012-08-21
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多