【问题标题】:symfony 3 unable to set session variablesymfony 3 无法设置会话变量
【发布时间】:2017-06-10 21:46:01
【问题描述】:

我是 Symfony 的新手,这让我很难设置会话。

我不确定会话设置应该是什么,所以我尝试创建一个单独的类来处理所有与会话相关的功能。

我知道 $request 对象包含所有会话信息,但是在控制器中访问它使我无法理解。

另一方面,我可以访问它,甚至可以在 Twig 上更改它,但我理解这不是处理这个问题的正确方法。

事实上,它会抛出一个错误

在 null 上调用成员函数 set()

关于

$session->set('cart_ads', 10);

SessionManagerController.php 文件中的行。所以看起来它没有创建设置为 null 的 $session 变量。

这是设置:

在app_dev.php上,即前端控制器。

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Debug\Debug;
use Symfony\Component\HttpFoundation\Session\Session;
use AppBundle\Controller\SessionManagerController;


/** @var \Composer\Autoload\ClassLoader $loader */
$loader = require __DIR__.'/../app/autoload.php';
Debug::enable();

$kernel = new AppKernel('dev', true);
//$kernel->loadClassCache();
$request = Request::createFromGlobals();
SessionManagerController::sessionAction($request);//error here***
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

SessionManagerController.php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class SessionManagerController extends Controller
{

    public function sessionAction(Request $request)
    {
        $session = $request->getSession();
        $session->set( 'cart_ads', 10 ); //error here***

    } 
}

【问题讨论】:

  • 您尝试从 app.php 调用 sessionAction 毫无意义。在常规控制器操作中,您可以访问会话。 symfony.com/doc/current/controller.html#managing-the-session
  • “我知道 $request 对象包含所有会话信息,但在控制器中访问它让我无法理解”是什么意思。 ?
  • @Cerad,实际上我正在使用 Symfony 3.2.8,所以 SessionInterface 不可用。我确实尝试过注入 Request $request,但它抛出了一个错误,说我没有提供 $request 的实例。最后它按照 Rendy Eko Prastiyo 的回答工作,但我想在控制器内完成。
  • 我怀疑您正在尝试将您以前的 php 会话经验应用到 Symfony 框架?在尝试改变它的工作方式之前,通常最好尝试学习框架的现状。我看不到您的会话管理器代码的用例,当然也没有理由从 app.php 调用它。如果您尝试在每个请求上执行代码,那么可以查看内核侦听器。我认为在您实施更多操作之后,您可能会对 Symfony 中如何使用会话有更好的了解。祝你好运。

标签: php symfony session


【解决方案1】:

您请求的session$request 中不可用,因为您在调用$kernel->handle($request) 之前先调用了SessionManagerController::sessionAction($request);。 Symfony 在调用$kernel->handle($request) 时将session 附加到request

$kernel = new AppKernel('dev', true);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);

// this method has to be called after you call $kernel->handle($request)
// so you will have session object attached to $request
SessionManagerController::sessionAction($request);

$response->send();
$kernel->terminate($request, $response);

【讨论】:

  • 这行得通,谢谢。任何想法为什么它不能在控制器中工作?
  • 因为您的controllerkernel handle 应用程序之前被调用。 handle 方法是Symfony 的核心。如果你想进一步了解handle方法的神奇之处,可以学习here。如果你想在main controller之外修改你的会话,可以使用Kernel Events
猜你喜欢
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2018-01-07
  • 2012-02-05
  • 2017-07-21
  • 2014-04-03
相关资源
最近更新 更多