Где лучше всего генерировать маршруты в MVC-приложении?

#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 — идеальный кандидат