Вопрос по компонентам

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Вопрос по компонентам

Сообщение Йож »

Подскажите, пожалуйста, компоненты (Yii::$app->myComponent) в Yii2 подгружаются, как Singleton? То есть я могу там при переходе от страницы к странице менять и хранить параметры? Спасибо.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Вопрос по компонентам

Сообщение mkramer »

Йож писал(а): 2017.11.06, 11:59 Подскажите, пожалуйста, компоненты (Yii::$app->myComponent) в Yii2 подгружаются, как Singleton? То есть я могу там при переходе от страницы к странице менять и хранить параметры? Спасибо.
Подгружаются как синглтон. Но переход от страницы к странице - это разные запуски скрипта. Синглтон хранится в течение одного запуска. Это в принципе основа PHP даже, а не Yii. Чтоб хранить данные при переходе от страницы к странице обычно используют сессии.
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Вопрос по компонентам

Сообщение Йож »

у меня как раз и загвоздка в том, что данные записываются в сессию и дальше работают хорошо. Но на первой странице сессия не работает, потому что в ней еще нет записи (или она старая). И вот перед рендером всей страницы хочу параметр записать хотя бы в компонент (чтоб его начать уже использовать на странице). Пойдет такой подход или кривой?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Вопрос по компонентам

Сообщение Nex-Otaku »

Если быстро и костыльно, то можно в Yii::$app->params[] где-то (например, в бутстрапе) записать, потом читать оттуда.

Ну а в целом, всё зависит от того, что это за данные, относятся ли они к этому компоненту, и твой ли это компонент или "сторонний". Только тебе известны все нюансы, чтобы решить, уместно ли эти данные в нём хранить. Если уместно - храни в компоненте.

Если хочется красиво обернуть, и ни к чему конкретному не привязывать, то можно хелпер небольшой сделать.

Код: Выделить всё

class MyDataHelper {
    public static getMyData()
    {
        $data = self::getFromSession();
        if (empty($data)) {
            $data = self::newData();
            self::saveDataInSession($data);
        }
        return $data;
    }
    
    private static function getFromSession()
    {
        return ...; // Читаем из сессии.
    }
    
    private static function newData()
    {
        return ...; // Создаём данные "с нуля".
    }
    
    private static function saveDataInSession()
    {
        // Записываем данные в сессию.
        ...
    }
}
Потом в любом месте в коде:

Код: Выделить всё

$data = MyDataHelper::getMyData();
И он автоматически всё обработает.
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Вопрос по компонентам

Сообщение Йож »

Nex-Otaku, спасибо, выглядит интересно..

Решил все-таки отдельный компонент сделать, все равно данные с помощью него будут вытастикаваться для использования на страницах.

Код: Выделить всё

/**
     * @var string
     */
    protected $_dealer;
    
 /**
     * @inheritdoc
     */
     public function init()
    {
        $this->_dealer = $this->loadPersistedDealer();
        if (!$this->_dealer) {
            $this->_dealer = $this->getDefaultDealer();
        }
        parent::init();
    }

Код: Выделить всё

/**
     * @param string $dealer the dealer code to persist in session
     */
    public function persistDealer($dealer)
    {
        Yii::$app->session[$this->dealersessionKey] = $dealer;
        $this->_dealer = $dealer;
    }
В кастомном UrlManager:

Код: Выделить всё

 /**
     * @param string $dealer the dealer code to persist in component
     */
    protected function persistDealer($dealer)
    {
        return Yii::$app->dealer->persistDealer($dealer);
    }
И вытаскиваю для употребления в коде:

Код: Выделить всё

/**
     * @return string
     */
    public function getDealer()
    {
        return $this->_dealer;
    }
Ответить