Как организовать Ваши Контроллеры для получения лучшей структуры (MVC)

Что лучший способ состоит в том, чтобы организовать контроллеры. Позволяет говорят, что у меня есть пользовательский контроллер и действие регистра, должен я иметь process_registration действие также, где я проверяю и обрабатываю данные или просто делаю всю обработку в рамках самого действия регистра. Если у меня есть действие проверки/обработки для каждого действия, которое требует его (регистр, process_registration.. и т.д.)

Я также замечаю, что у большого количества людей есть модули и контроллеры только для проверки и обработки информации, (я предполагаю для хранения всей логики проверки и правил в одном месте, возможно?)

Я предполагаю, что мой вопрос, как далеко независимо вещи должны быть разделены? Этот вопрос идет для Моделей и Представлений также.

6
задан Strae 31 December 2009 в 18:12
поделиться

3 ответа

Обычно ваша валидация должна происходить в модели; в этом суть парадигмы MVC. Логика контроллера заключается в том, что между действиями пользователя происходит скачок, представления предназначены исключительно для представления, а бизнес-логика находится в моделях.

Некоторые фреймворки (CodeIgniter) сильно расходятся с намерением MVC, делая модели плоскими объектами, которые не имеют логики (валидации или другой), требуя от вас переместить вашу логику валидации в уровень контроллера, но в этот момент ваши "модели" не являются моделями вообще, а являются прославленными массивами.

Что касается двух действий "регистр" и "process_register", то мне кажется, что гораздо чище иметь одно действие, которое по-разному реагирует на сообщения и запросы. Я бы назвал это действие "create", чтобы все оставалось RESTful, и чтобы везде, где бы ваш фреймворк не определял маршруты для "/register" к "/user/create"

Пример псевдо-php:

<?php

class User_controller {
  // [GET|POST] /users/create
  function create() {
    $user = new User();
    $error = '';

    if (postback) {
      // form has been submitted.
      $user->name = $_POST['name'];
      $user->password = $_POST['pasword'];

      if (validate_user($user)) {
        $user->save();
        redirect("user/show/$user->id");
      }
      // user save failed, fall through to displaying the new user form
      // the user's name and password (and other fields) are now populated,
      // and will display
      $error = 'Account creation failed.';
    }

    // Render the view with the user and the error message (if any)
    render('views/users/create', $user, $error);
  }
}

?>
3
ответ дан 17 December 2019 в 07:05
поделиться

Полагаю, лучший совет, который я могу дать, основываясь на вашем вопросе, заключается в том, что вы захотите разделить ваши действия внутри контроллера до такой степени, что вы захотите сделать ваш сайт модульным. Вы также должны иметь в виду, что существуют расходы как на обработку, так и на SEO, если вы постоянно переходите от одного действия к другому, потому что действия должны быть связаны с уникальными URL-адресами.

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

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

.
0
ответ дан 17 December 2019 в 07:05
поделиться

Я считаю, что лучше всего сохранить валидацию и "обработку" в модели. Используйте контроллер только для управления отображением запроса на функцию модели.

Этот раздел из "Zend Framework: Surviving The Deep End" может быть хорошим чтением.

.
1
ответ дан 17 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

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