cakephp会话
我是Cakephp的初学者,我在会话方面有一个很大的问题 到底发生了什么 我开始使用ajax调用php文件(控制器)初始化会话cakephp会话,php,session,cakephp,Php,Session,Cakephp,我是Cakephp的初学者,我在会话方面有一个很大的问题 到底发生了什么 我开始使用ajax调用php文件(控制器)初始化会话 这是来自ajax->url:http://domain.com/things/view/0的url 我还尝试在没有ajax的情况下调用以下url: http://domain.com/things/view/1 在这两种情况下,会话都是不满足的。 下面是我用来初始化会话的控制器 class ThingsController extends AppController {
这是来自ajax->url:http://domain.com/things/view/0的url 我还尝试在没有ajax的情况下调用以下url: http://domain.com/things/view/1 在这两种情况下,会话都是不满足的。 下面是我用来初始化会话的控制器
class ThingsController extends AppController {
var $name = 'Things';
var $components = array('Session');
var $helpers = array('Html', 'Javascript', 'Ajax');
var $uses = null;
function index() {
// preload dynamic data
$this->set('data1', 'content will update here');
$this->set('data2', 'here too');
$this->render('neat');
}
function view($id, $idd) {
if ($idd == 0) {
$this->Session->write('language', 'ro');
} else {
$this->Session->write('language', 'en');
}
if (is_numeric($id)) {
if ($id == 0) {
$this->Session->write('language', 'ro');
} else {
$this->Session->write('language', 'en');
}
}
$this->render('neat');
} //view()
} //ThingsController
如您所见,如果SESSION['language']==0为ro,则其他为en
使用的根规则是:
Router::connect('/things/:id/*', array('controller' => 'things', 'action' => 'view',
'things'), array('pass' => 'id'));
但在没有这条规则的情况下也有效:)
现在进入关于会话工作的页面:http://domain.com/despre-noi
我使用了这个rooter:
Router::connect('/despre-noi/*', array('controller' => 'about', 'action' => 'display', 'about'));
这个控制器呢
function display() {
if (isset($_SESSION["language"])) {
$language = $_SESSION["language"];
$this->Session->write('language', $_SESSION["language"]);
} else {
$this->Session->write('language', 'ro');
$language = "ro";
}
include('views/pages/'.$language.'.ctp');
$this->layout = 'default';
$this->About->id = 1;
$this->set('post1', $this - > About - > read());
}
但在页面合作伙伴:http://domain.com/parteneri
我使用这个rooter的地方:
Router::connect('/parteneri/*', array('controller' => 'partner', 'action' => 'display', 'partner'));
以及以下控制器:
function display() {
if (isset($_SESSION["language"])) {
$language = $_SESSION["language"];
$this->Session->write('language', $_SESSION["language"]);
} else {
$this->Session->write('language', 'ro');
$language = "ro";
}
include('views/pages/'.$language.'.ctp');
$this->layout = 'default';
$this->set('posts', $this - > Partner - > find('all'));
}
它不起作用
这两个页面与我在合作伙伴页面中使用的$This->set('posts')、$This->partner->find('all')的差异非常相似
然后在视图中使用foreach()
我列出了项目,并在页面中阅读了一行
$this->About->id = 1;
$this->set('post1', $this->About->read());
这可能是问题所在…这两个函数read()和find()…还是只是巧合
提前感谢首先确保您有:
Configure::write('Session.save', 'php');
在app/config/core.php
文件中。的提供了一些关于如何配置和使用会话组件的好例子
此外,如果要使用会话(即会话
组件),最好放:
var $components = array('Session');
在AppController
中。通过这种方式,每个控制器都可以使用该组件
Second,如果您使用CakePHP的会话类来编写会话数据,则不应直接访问该数据(即通过调用$\u Session['language']
)。这是一种糟糕的做法,因为如果您决定使用'database'
作为会话存储,或者如果CakePHP决定对会话数据进行加密,那么您的代码就会中断,您也不知道为什么
简而言之,请在你的代码中使用$this->Session->read('language')
(另外,看看前面提到的,它也提供了一些好的背景)
此外,由于您希望实现国际化,在根据我的评论中的粘贴修复控制器后,您必须通过阅读来查看本地化的简单方法。有一种方法可以更轻松地完成工作,并将视图中的表示逻辑与表示内容分离,但这是一种简单的方法还有一个问题要问;)谢谢你的回答。在core.php中,我有Configure::write('Session.save','my_Session');我创建了文件my_sessions,并将所有内容放入其中,就像books示例中一样。一开始我用php保存它,就像你说的那样。不管怎么说,我也打过电话,就像你建议我的那样,但还是没什么。。。会话的行为就像我在其他域中一样,当然它对此一无所知。。我在core.php中也有这个linex:Configure::write('Security.level','low');Configure::write('Session.checkAgent',false);我认为问题出在路由器上,我更改了以下路由器路由器::connect('/parteneri/*',array('controller'=>'partner','action'=>'display','partner');要加载about页面,为此我将路由器更改为router::connect('/parteneri/*',array('controller'=>'about','action'=>'display','about');它工作正常,在正确初始化会话的情况下加载关于页面。因此,唯一的问题应该是在partner controller中(partner和about控制器都在问题的主体中)…但这是一个错误,我还想提到的是about controller:print\r($\u session)中的输出会话;它输出数组([Config]=>Array([userAgent]=>bacc67458f6a4db196762e81c0d9c341[time]=>1303984020[timeout]=>10[language]=>en),但如果我在partner controller中输出它,它将输出数组()。所以它忘记了关于这个会话的一切…:(关于我的问题,我只能说这些。谢谢你的问题只是为了确定:你的
PartnerController
类中有var$components=array('session');
吗?我更新了答案,告诉你如何始终使用会话
组件(在AppController
中声明使用)