为什么会话数据仅在CakePHP的控制器中可用?

Why is session data only available in the controller in CakePHP?

因此,我喜欢CakePHP并大量使用它。当2.0发布时,我很高兴看到AuthComponent可以作为一个静态类在整个应用程序中使用,这使很多事情变得更加容易-即,您不再需要将用户数据作为参数传递给模型方法。 >

最近在一个项目上,我已经意识到需要从模型访问SessionComponent的方法。具体来说,当用户登录时,将执行一些检查以查看该用户是否对该站点具有有效的订阅。这一切都在模型中完成。如果用户不再具有有效的订阅,则可能有几个原因。从模型返回false似乎是最容易的,同时设置一条Flash消息,给出订阅过期的原因。而不是返回像这样的数组:

1
array('status' => 0, 'message' => 'You\'re not welcome here anymore')

需要在控制器中进行解释。

还有几次我想处理模型中的会话,但这是我想到的例子。

因此,我想知道,我是否想访问模型中的SessionComponent吗?有这种需要时,我应该直接使用$ _SESSION吗?还是我做错了事-有更好的编码方法吗?


您可以随时使用

1
CakeSession::read()

您的应用程序中的任何位置。在模型中也是如此。
参见以前的文章,例如在cakephp 2

中读取行为内的会话变量

但请注意,如果可能,应尽量避免使用它。
模型应该尽可能地是无状态的-将它们与会话混合会变得越来越模糊。


将会话控制传递给模型违反了MVC。您应该使用模型来做出决策,并使用控制器将那些决策反映到应用程序中。在正确的MVC环境中,模型甚至都不知道您使用的会话要少得多。

此外,使用$ _SESSION var违反了框架封装。如果您发现需要这样做,是的,您在某个地方出错了。


根据CakePHP食谱:

Usage of the $_SESSION is generally avoided in CakePHP, and instead
usage of the Session classes is preferred.

有几种不同的配置可以存储会话数据f.ex。在数据库中。因此,通过使用CakeSession更改会话配置不会影响访问会话数据的每个位置。

我建议不要使用模型中的SessionComponent。更好地将参数与必要的数据传递给模型。看看了解模型-视图-控制器。


您可以使用Authcomponentsession

在模型中的会话中写入和读取数据

1
2
App::uses('AuthComponent', 'Controller/Component');
App::import('Component', 'Session');

,您可以使用以下功能写入和读取数据

1
2
CakeSession::write('Auth.User.id', '1');
debug(CakeSession::read());