2015-10-20 5 views
0

Мне нужна небольшая помощь относительно дизайна MVC. Большинство руководств MVC и CODEIGNITER выполняют проверку ввода в контроллере. Это хорошая практика?
Предположим, что мы реализуем REST или SOAP API, тогда у нас будут разные контроллеры, и для всех этих контроллеров мне нужно будет реплицировать мой код. Позже, если какое-либо правило валидации будет изменено, оно будет зацикливаться на всех контроллерах. Должна ли не вся проверка быть внутри модели вместо контроллера?
Еще одна вещь, которую я хотел бы задать. Поскольку я стараюсь максимально сглазить свои функции, я получаю отношение один к одному между функциями модели и контроллером. Это нормально, или я делаю что-то неправильно?Проверка ввода в MVC

ответ

0
  1. Что касается делать проверки ввода в контроллер Отв. Да, это общепринятая практика в большинстве MVC. Однако в течение последних нескольких лет из-за появления AJAX-фреймворков и более широкого использования JavaScript многие проверки пользовательского интерфейса выполняются в самом пользовательском интерфейсе (так называемые клиентские проверки). Они обычно отображаются в виде предупреждающих ящиков javascript и не позволяют пользователю идти вперед, если он не исправляет эти ошибки. Таким образом, я бы сказал, что помощники Controllers/View являются де-факто местами, где выполняются проверки, но вы должны рассматривать проверки на стороне клиента везде, где это возможно. Это также экономит ваши поездки на сервер.

  2. Если вы предоставляете такие же функции, как SOAP/REST Ans. Теперь вы можете аннотировать те же методы контроллера, чтобы заставить их работать в качестве конечных точек веб-службы. Таким образом, ваши контроллеры могут обслуживать как веб-запросы, так и запросы SOAP/REST. Но одно примечание о предостережении - ваша фасоль/бобы формы должны быть очень хорошо спроектированы. Я видел код, в котором объекты модели спящего режима используются в качестве объектов для поддержки формы. Это делает сложным, когда вы создаете WSDL из объектов поддержки формы, поскольку объекты модели hibernate могут иметь много связанных объектов, а один заканчивается очень сложными структурами xml в запросе/ответе. Но все же, если вы создаете свои бэк-компоненты как мелкозернистые, т. Е. Не имея сложных объектов, то вам следует удобно использовать существующие методы контроллера/контроллера в качестве конечных точек веб-службы для SOAP/REST.

  3. Что касается валидации внутри слоя модели Ans. Вы можете использовать это правило большого пальца, чтобы определить, где разместить который Validations -
    • Бизнес валидация должно произойти в модели/услуги
    • сложные клиентские валидаций, которые не представляется возможным в стороне клиента, должно произойти в контроллерах/просмотреть хелперов
    • валидаций UI (форматирование/пустые чеки) должен происходить с помощью стороны клиента/JavaScript валидаций
  4. в отношении 12:59 соотношения между функциями контроллера и моделью/услугами ANS. Все нормально. Просто помните, что один метод контроллера говорит о соответствующем методе модели. И если для обслуживания запроса требуется несколько моделей, то этот метод модели должен действовать как агрегатор информации из нескольких моделей, то есть контроллер должен связаться со своей основной моделью, а основная модель должна связаться с другими моделями.
+0

У меня есть ваша точка зрения, но у меня мало путаницы. Можем ли мы полагаться на проверку на стороне клиента? Клиент всегда может пройти проверку, отключив javascript или играя с заголовками HTTP-запросов. Если модель называет другую модель, то не является ли нарушение SOC, поскольку сближение модели уменьшается? Можете ли вы предоставить мне ссылку или пример, описывающий подводные камни, позволяющие диспетчеру поговорить с несколькими моделями. Извините за задание слишком много вопросов. –

+0

Да, вы можете положиться на проверки на стороне клиента. В основном вы отправляете свою форму только после прохождения всех проверок на стороне клиента. Если вы посмотрите на все основные веб-сайты, они в значительной степени полагаются на javascript. И только некоторые из них имеют версии, отличные от javascript. Что касается модельной модели вызова, то ее общепринятой практикой является сервис-сервис для бизнес-логики. Я не имею в виду DAO, призывающий DAO. DAO следует исключительно вызывать из своих соответствующих услуг. Наконец, я работал во многих веб-проектах, и мои ответы основаны на этом. У меня нет списка справочных сайтов. –

+0

@KrrishRaj Проверка на стороне клиента можно опираться, но не может и, вероятно, не должна полностью исключать необходимость проверки подлинности на заднем плане. Модель для вызова модели, ИМО, явно нарушит SOC. С другой стороны, использование контроллером нескольких моделей показало бы мне, как вы создаете SOC. CodeIgniter позволит вам загружать модели внутри другой модели. Ловушка, с которой вы могли бы легко справиться, связана с проблемой зависимости. В частности, круговые ссылки - все, что легко построить. – DFriend

0

Это хорошая практика? По моему опыту да.

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

Грубый псевдо-codeish «Dashboard» контроллер может выглядеть следующим образом:

class Dashboard extends CI_Controller { 
    public function __construct(){ 
    parent :: __construct(); 
    $this->load->helper(array('form', 'url')); 
    $this->load->library('form_validation'); 
    $this->load->model('somemodel_model'); 
    } 
    public function index(){ 
    //displays a task selection page with links to various tasks 
    } 
    public function admins(){ 
    //some kind of interface to display and edit admin level users 
    } 
    public function users(){ 
    //CRUD for dashboard users 
    } 
} 

С помощью этого контроллера страница выбора задачи открыта с baseurl/dashboard, стр Adminstrator с baseurl/dashboard/admins и пользовательским CRUD с baseurl/dashboard/users. Поскольку каждый из них имеет один и тот же класс, код, необходимый для всех/многие из этих страниц (например, проверка), может быть реализован в конструкторе и/или с частными методами. Вы, наверное, уже все это знаете. Имейте в виду, что ответчики AJAX также могут находиться в контроллере, используя ту же технику.

Что касается соблюдения правил валидации DRY и облегчения работы, необходимой для изменений правил, CI может хранить наборы правил в файле конфигурации для удобства повторного использования в нескольких ситуациях. Read about it.