Использование компонента сеанса в пользовательском компоненте

Я пытаюсь использовать компонент Session в пользовательском компоненте (CakePHP 2.3), но когда я вызываю функции компонента Session, я получаю: Неустранимая ошибка: вызов функции-члена read() для необъекта в... \ app \ Controller \ Компонент \CartComponent.php в строке 7

Мой 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 ответа

Для использования сессии внутри пользовательского компонента, который я пытался с

public $components = array('Session');

а затем вызвал его с помощью

$this->Session->read('Cart');

но я не могу использовать его, и я начинаю использовать

CakeSession::read('Cart')

Теперь это работает. Надеюсь, что это будет использовано для вас.

Если вы хотите использовать сессию в вашем компоненте

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

print_r($test);

Вы должны использовать как ниже

    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'));
    }

    }
Другие вопросы по тегам