Вопрос по компонентам
Вопрос по компонентам
Подскажите, пожалуйста, компоненты (Yii::$app->myComponent) в Yii2 подгружаются, как Singleton? То есть я могу там при переходе от страницы к странице менять и хранить параметры? Спасибо.
Re: Вопрос по компонентам
Подгружаются как синглтон. Но переход от страницы к странице - это разные запуски скрипта. Синглтон хранится в течение одного запуска. Это в принципе основа PHP даже, а не Yii. Чтоб хранить данные при переходе от страницы к странице обычно используют сессии.
Re: Вопрос по компонентам
у меня как раз и загвоздка в том, что данные записываются в сессию и дальше работают хорошо. Но на первой странице сессия не работает, потому что в ней еще нет записи (или она старая). И вот перед рендером всей страницы хочу параметр записать хотя бы в компонент (чтоб его начать уже использовать на странице). Пойдет такой подход или кривой?
Re: Вопрос по компонентам
Если быстро и костыльно, то можно в 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();
Re: Вопрос по компонентам
Nex-Otaku, спасибо, выглядит интересно..
Решил все-таки отдельный компонент сделать, все равно данные с помощью него будут вытастикаваться для использования на страницах.
В кастомном UrlManager:
И вытаскиваю для употребления в коде:
Решил все-таки отдельный компонент сделать, все равно данные с помощью него будут вытастикаваться для использования на страницах.
Код: Выделить всё
/**
* @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;
}
Код: Выделить всё
/**
* @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;
}