MVC Положить действие в наиболее подходящий правильный контроллер - PullRequest
3 голосов
/ 20 мая 2011

Мне просто интересно, каков наилучший практический подход для принятия решения о том, где создать действие / представление в определенных ситуациях.

Если Пользователь hasMany Видео

где лучшее место для создания действия / представления для показа видео пользователя?

Итак, на странице «Мои видео» на странице учетной записи пользователя вы

  1. просто создаете users / my_videos действие и просмотр.
  2. создание videos / my_videos действие и просмотр.
  3. или, скорее всего, у вас уже естьКонтроллер / Действие videos / index , которое будет иметь функцию поиска.Просто используйте эту передачу в идентификаторе пользователя.

Любые мысли / советы с благодарностью

Спасибо

Лев

Ответы [ 5 ]

3 голосов
/ 25 мая 2011

Один из возможных вариантов - сделать следующее:

Поскольку в видео, вероятно, содержится гораздо больше кода, чем в простом, который пользователь имеет, какие видео поиск должен выполнять действие со списком видео в VideosController.

В прошлых проектах (в CakePHP 1.3) я использовал префиксную маршрутизацию для решения некоторых из них.

В config / core.php убедитесь, что вы включили routing.prefixes для включения префикса 'user'.

<?php
    ... in routes.php ...
    Routing.prefixes = array( 'user' );
?>

В контроллере видео выполните действие со следующей подписью:

<?php
    ...
    public function user_index( $userID = null ){
        ...
    }
?>

и в представлениях, где вы ссылаетесь на список видео пользователей, вызов html :: link должен выглядеть примерно так:

<?php
    ...
    echo $this->Html->link( 'User\'s Videos', array(
        'controller' => 'videos',
        'action' => 'index',
        'prefix' => 'user',
        $this->Session->read( 'Auth.User.id' )
    ));
?>

Конечно, это предполагает, что вы используете здесь компонент Auth для отслеживания вошедшего в систему пользователя. Код помощника сеанса для чтения идентифицированного идентификатора пользователя может нуждаться в настройке.

Это позволяет вам: а) не беспокоиться о маршрутизации помимо включения префиксной маршрутизации и б) быстро даст вам красивые ссылки вроде этого - site.com / user / videos / index / 419

Соедините это с некоторой любовью к слизнякам (это лучшая ссылка для этого, которую я видел - поле слагов не требуется на слое БД - http://42pixels.com/blog/slugs-ugly-bugs-pretty-urls)

Вы можете даже легко получить URL-адреса, например: site.com / user / videos / index / eben-roux

и с небольшим изменением в app / config / rout.php вы можете удалить часть / index /, и результаты будут оптимизированы для SEO и пользователя в формате: site.com / пользователь / видео / Эбен-подливку

http://book.cakephp.org/view/945/Routes-Configuration

0 голосов
/ 24 мая 2011

Я не думаю, что есть решение «один для всех», но я бы попытался использовать подход, в котором вы бы определили, с каким основным объектом вы имеете дело, и добавление действия / представления к контроллеру этого объекта.

В вашем примере я бы сказал, что вашим основным объектом является видео, а требуемое действие - это список видео, отфильтрованных по определенному свойству (в данном случае идентификатор пользователя, но это вполне может быть категория, местоположение и т. д.).

Одна вещь, которую я бы не стал делать, это позволить вашему желаемому URL определить, в какой контроллер вы помещаете свои функции. URL-адреса тривиально меняются вместе с маршрутами.

0 голосов
/ 20 мая 2011

Мне нравится хранить вещи отдельно.

Что бы я сделал, это действие индексации в контроллере видео, передав идентификатор пользователя в качестве аргумента и затем отображая только видео текущего пользователя.

public function index($id = null){
   $this->paginate = array( 'conditions'=> array('Video.user_id' => $id));
   $this->set('videos', $this->paginate());

}
0 голосов
/ 24 мая 2011

Я предполагаю, что это зависит от ответственности, которую вы назначаете для контроллеров.

Я бы сказал, что что-то вроде Пользовательского или Видеоконтроллера должно касаться только этих сущностей.

Возможно, вы захотите рассмотреть что-то вроде UserDashboard (или что-то похожее, но с соответствующим названием), на что ссылается Dunhamzzz в комментариях. Это может объединить все функциональные возможности с точки зрения «входа». Аналогично будет работать меню баннера / ярлыка / действия.

Ваша UserDashboard будет использовать любой слой данных / репозиторий, необходимый для получения соответствующих данных (например, реализацию IVideoRepository или IVideoQuery).

Обычно, когда что-то не так, это не так. Попробуйте разделить его и посмотреть, как это работает. Вы всегда можете перестроить / рефакторинг снова позже.

Просто мысль.

0 голосов
/ 20 мая 2011

Как всегда с кодом, у вас есть две крайности:

1) Помещение всего в один контроллер

2) Каждое действие в отдельном контроллере

идеальный подход почти всегда будет где-то между ними, так как решить, что сгруппировано, а что разделено?

В MVC я склонен смотреть на виды и видеть общие черты: как вы указываете на пользователейесть ссылка на коллекцию видео в модели, но хотите ли вы оба набора данных в одном представлении?т.е. в этом примере вероятно ли, что вы окажетесь на странице, которая как управляет данными пользователя, так и отображает список видео?Если нет, то я бы предложил отдельные контроллеры.

Если любой из контроллеров был бы тогда чрезвычайно простым - например, один метод, то, возможно, стоит подумать об объединении двух.

...