【问题标题】:Symfony: Request $request object not working in particular functionSymfony:请求 $request 对象在特定功能中不起作用
【发布时间】:2017-09-28 23:30:28
【问题描述】:

我是 Symfony 的初学者,在这个问题上浪费了很多时间。

我正在尝试从同一类的另一个函数调用函数isLoggedIn。在isLoggedIn 函数中,我需要获取/检查会话变量并返回该变量的值。但是 Request $request 对象在 isLoggedIn 函数中无法访问,而 Request 对象在同一类的其他函数中运行良好。

我的代码:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use AppBundle\Entity\Users;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        $Authuser = $this->isLoggedIn();

        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
            'Authuser' => $Authuser
        ]);
    }

    public function isLoggedIn(Request $request) ////GETTING ERROR IN THIS LINE////
    {
        $session = $request->getSession();

        if($session->get('Authuser')!=null) $Authuser = $session->get('Authuser');
        else $Authuser = null;

        return $Authuser;
    }

    /**
     * @Route("/logout", name="logout")
     */
    public function logoutAction(Request $request)
    {
        $session = $request->getSession();
        $session->remove('user_id');
        return $this->redirectToRoute('homepage');
    }
}

?>

我得到的确切错误:

未捕获的 PHP 异常 Symfony\Component\Debug\Exception\ContextErrorException:“可捕获 致命错误:参数 1 传递给 AppBundle\Controller\DefaultController::isLoggedIn() 必须是 Symfony\Component\HttpFoundation\Request 的实例,没有给出, 叫进来 /Applications/MAMP/htdocs/srfood/src/AppBundle/Controller/DefaultController.php 在第 21 行并定义”

我已经搜索了很多但没有得到解决方案,而且我需要知道根据 Symfony 的 isLoggedIn 函数与同一类的其他函数有什么不同,因为我尝试向函数添加路由,添加 Action 后缀等等等等,这样它的行为就像其他函数一样,但我就是不明白这个函数对于 symfony 有什么不同?!谢谢!

PS- 我使用的是 Symfony 3.3。

【问题讨论】:

  • $Authuser = $this->isLoggedIn($request);应该可以解决问题,尽管使用 Symfony 安全包可能会更好。控制器动作起作用的原因是框架花费了额外的精力来分析动作并注入像 $request 对象这样的依赖项。不处理名称不佳的 isLoggedIn 等常规方法。
  • @Cerad 谢谢!是的,它做到了这一点并以这种方式工作。但是,如果有人不使用 Symfony 安全包,是否有任何适当的解决方案?我是一个初学者,虽然我尝试了很多,但安全包飞过我的头,无法正确理解它的用法,因此使用传统方式。
  • 你的方法会奏效。安全捆绑包很复杂,但如果您按照文档中的示例进行操作,它还算不错。特别是如果您最终想要使用角色等。

标签: php symfony symfony-3.3


【解决方案1】:

您不能在控制器中为非操作函数声明请求参数。 尝试在带有 $request 参数的操作中调用 isLoggedIn,而不在函数定义中声明它。

希望对你有帮助。

【讨论】:

  • 谢谢,虽然我通过@Cerad 在他的评论中建议的技巧解决了这个问题,即在函数调用时传递 $request,如$Authuser = $this-&gt;isLoggedIn($request); ,它完成了这项工作。
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2013-08-31
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多