За время использования YII2 вывод ссылок на ту или иную страницу привязанную к модели у меня прогрессировал дважды.
На примере записи в блоге продемонстрирую как бы это выглядело у меня:
Стадия 1. Создание и вывод ссылки в представлении:
// В коде представления use yii\helpers\Url; ... echo Url::to ( [ 'blog/view' , 'alt' => $blog->alt , 'category_alt' => $blog->category->alt ] );
Плюсы:
- Создание ссылки только тогда когда она требуется на вывод
- Из первого пункта вытекает что обращение к другой модели (категории блогов) производится только когда это надо
Минус:
- Если поменяется принцип формирования ссылок на запись переписывать предстоит во всех местах где она выводится
Пытаясь избавиться от минуса я перешёл к следующей стадии...
Стадия 2. Создание ссылки в моделе и вывод через его свойство:
// В коде модели use yii\helpers\Url; ... public $url; ... public function afterFind ( ) { ... $this->url = Url::to ( [ 'blog/view' , 'alt' => $this->alt , 'category_alt' => $this->category->alt ] ); ... } // В коде представления echo $blog->url;
Плюсы:
- Легко исправить принцип формирования ссылки на запись
- Минимализм при использовании в представлениях
Минус:
- Ссылка формируется сразу после определения модели (когда она найдена) и поэтому не важно будет ли она выводится на странице, но запрос к посторонней моделе (категории блогов) будет производиться
Стадия 3 (текущая). Создание ссылки в моделе и вывод через его метод:
// В коде модели use yii\helpers\Url; ... private $_url; ... public function getUrl ( ) { if ( is_null ( $this->_url ) ) $this->_url = Url::to ( [ 'blog/view' , 'alt' => $this->alt , 'category_alt' => $this->category->alt ] ); return $this->_url; } // В коде представления echo $blog->url;
Плюсы:
- Легко исправить принцип формирования ссылки на запись
- Минимализм при использовании в представлениях
- Ссылка формируется при первичном обращении на вывод и записывается в свойство, что позволяет при повторном вызове сразу выводить её из свойства, а не формировать заново
Я вполне не исключаю, что стадия 3 не финальная в моих поисках оптимизации данного процесса, также возможно что какие-то мои решения в принципе могут показаться кому-то не логичными.