Задать вопрос
MegaMufa
@MegaMufa

Нормально ли в Yii хранить url-адреса в моделях?

Доброе утро.

Есть система на Yii. Для верстки шаблонизаторы не используются. Делаю стандартным Yii-шным способом: через \CController::render() подключается файл с html разметкой, в которую вставляются данные чрез <?php echo ''; ?>

В представление передается модель AR, чьи свойства и подставляются. Удобнее, чем в контроллере формировать массив параметров и передавать его. Модели построены так, что в представлении не вызывается ни один ее метод, кроме гетеров.

Система использует ЧПУ. Поэтому адреса ссылок вписываются не напрямую, а вормируются через \Yii::app()->createUrl();. Но в таком случае при смене адреса старницы, надо искать во всех представлениях эту ссылку и менять ее.

Я вот думаю сделать в модели методы, которые будут возвращать соответствующие ссылки. И тогда вместо такого кода в представлении:
<a href="<?php echo \Yii::app()->createUrl('users/Settings',['userId'=>$user->id]); ?>">settings</a>

я в модели описываю метод:
public funtion getSettingsLink() 
{
  return \Yii::app()->createUrl('users/settings',['userId'=>$this->id]); 
}

а в представлении:
<a href=<?php echo $user->settingsLink; ?>">settings</a>


Такой вариант мне видится логичным т.к. формирование ссылок инкапсулируется внутри объекта. Но смущает тот факт, что модель содержи методы зависящие от url (грубо говоря работает с представлением).

Подскажите, стоит ли использовать данных подход. Или есть другие пути решения этой задачи?
  • Вопрос задан
  • 3188 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
EnChikiben
@EnChikiben
В yii ЧПУ можно настроить в конфиге, и если захотели другой адрес то менять там, а контроллер не трогать, а в представлении можно так писать:
echo CHtml::link('settings',array('users/settings','userId'=>$user->id));
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
в моделях нормально хранить URI, url должен генерить маршрутизатор.
Ответ написан
Комментировать
@goodnickoff
В вашем случае скорее всего это не верно. Если вы измените контроллер, и вместо users/settings ссылка превратится в member/settings, то получение из модели users ссылки для membrs выглядит не красиво. То же самое касается экшина. Если вместо users/settings ссылка изменится на users/account то получение ее через $user->settingsLink; то же выглядит не логично. Я бы посоветовал вам уделить больше внимания проектированию что бы в последствии кардинально не менять контроллеры и экшины.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы