在自定义组件中使用会话组件

时间:2013-08-06 21:37:44

标签: cakephp cakephp-2.0 cakephp-2.3

我正在尝试在自定义组件(CakePHP 2.3)中使用Session组件,但是当我调用Session组件函数时,我得到:致命错误:在... \ app中的非对象上调用成员函数read() 7号线上的\ Controller \ Component \ CartComponent.php

我的CartComponent看起来像这样:

<?php
App::uses('Component', 'Controller');
class CartComponent extends Component {
    public $components = array('Session');

    function hasItems() {
        $cart = $this->Session->read('Cart');
        return $cart != null && count($cart) > 0;
    }

}
?>

我在控制器中使用它:

<?php
class OrdersController extends AppController {
    public $name = 'Orders';
    public $components = array('Cart', 'Email');

    function beforeFilter() {
        parent::beforeFilter();
        if ($this->Cart->hasItems()) {
            $this->Auth->allow('add_item', 'remove_item', 'cart');
        } else {
            $this->Auth->allow('add_item', 'remove_item', 'cart', 'make');
        }
    }
}
?>

3 个答案:

答案 0 :(得分:7)

在我尝试使用

的自定义组件中使用会话
public $components = array('Session');

然后使用

调用它
$this->Session->read('Cart');

但我无法使用它而我开始使用

CakeSession::read('Cart')

现在它的作品希望它会用于你注意我用的蛋糕php版本&gt; 2

答案 1 :(得分:3)

如果要在组件使用中使用会话 -

$test = CakeSession::read('user'); 

print_r($test);

答案 2 :(得分:0)

你应该使用如下

    class YourComponent extends Component {
     public function initialize(Controller $controller){
      $this->controller = $controller;
      if (!isset($this->controller->presetVars)) {
         $this->controller->presetVars = true;
      }

    $model = $this->controller->modelClass;
    if (!empty($settings['model'])) {
        $model = $settings['model'];
    }

    if ($this->controller->presetVars === true) {
        // auto-set the presetVars based on search definitions in model
        $this->controller->presetVars = array();
        $filterArgs = array();
        if (!empty($this->controller->$model->filterArgs)) {
            $filterArgs = $this->controller->$model->filterArgs;
        }

        foreach ($filterArgs as $key => $arg) {
            if ($args = $this->_parseFromModel($arg, $key)) {
                $this->controller->presetVars[] = $args;
            }
        }
    }
    foreach ($this->controller->presetVars as $key => $field) {
        if ($field === true) {
            if (isset($this->controller->$model->filterArgs[$key])) {
                $field = $this->_parseFromModel($this->controller->$model->filterArgs[$key], $key);
            } else {
                $field = array('type' => 'value');
            }
        }
        if (!isset($field['field'])) {
            $field['field'] = $key;
        }
        $this->controller->presetVars[$key] = $field;

   }
    /* now you can use Component existing in your Component :) */
    public function sayHello(){
     $this->controller->Session->setFlash(__('Hello you'));
    }

    }