cakephp会话

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 {

我是Cakephp的初学者,我在会话方面有一个很大的问题

到底发生了什么

我开始使用ajax调用php文件(控制器)初始化会话
这是来自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
中声明使用)