#php #model-view-controller #zend-framework #zend-route
#php #модель-представление-контроллер #zend-framework #zend-route
Вопрос:
Представьте, что у вас есть следующий сценарий:
В вашем приложении у вас есть несколько моделей, которые можно «прокомментировать». Комментарии отображаются идентичным образом и, следовательно, могут использовать один и тот же шаблон. В представлении виджета комментариев по умолчанию отображаются два самых последних комментария со ссылкой для загрузки оставшихся X комментариев.
У виджета также есть форма (т.Е. текстовая область, которая отправляется при вводе) для добавления нового комментария к модели.
Учитывая вышеуказанное требование, где разумное место для генерации ссылок, необходимых форме и ссылке загрузки для выполнения своей работы?
Должны ли ссылки генерироваться в представлении, которое вызывает шаблон, вместе с Commentable
моделью? т.е.
<?php
echo $this->partial('path/to/template/comments.phtml', array (
'add-link' => $this->url($params, $routeName),
'load-link' => $this->url($params, $routeName),
'comments' => $this->model->getComments()
);
Допустимо ли вообще запрашивать Commentable
эти ссылки? Т.е. в comments.phtml
-template:
<div class="comments">
<div class="loadLink">
<a href="<?php echo $this->comments->getLoadLink() ?>">
<?php echo sprintf('Show all %d comments', count($this->comments)); ?>
</a>
</div>
<div class="container">
<?php
foreach ($this->comments->getFirst(2) as $comment) {
echo $this->partial('comment.phtml', array('comment' => $comment);
}
?>
</div>
<div class="addComment">
<form action="<?php echo $this->comments->getAddLink() ?>" method="post">
<div>
<textarea class="autogrow" name="comment"
placeholder="Write a new comment" rows="1" cols="80">
</textarea>
</div>
</form>
</div>
</div>
Поскольку MVC утверждает, что представление может взаимодействовать с контроллерами, рассматривается ли генерация маршрута как способ «общения» с контроллером, даже если он не делает это объектно-объектным способом?
Ответ №1:
В приложении MVC вы никогда не должны просить модель создать ссылку. Вам следует добавить какой-нибудь вспомогательный вид, который может использовать модель для создания этих ссылок.
Комментарии:
1. Да, это то, что я делаю в данный момент. Однако он полагается на
get_class($model)
вызов защищенного метода в помощнике представления для генерации ссылок для этой конкретной модели, и это просто ощущается.. грязный и связанный. =)2. В случае, если вы сделаете это в модели, модель будет связана, если вы создадите URL-адреса в контроллере и установите некоторое свойство в модели, контроллеры будут связаны. Когда дело доходит до сопряжения, всегда задавайте себе вопрос: какой код проще всего заменить другим поведением — и для меня view helper — идеальный кандидат