Способ обойти контроллер в CodeIgniter? - PullRequest
3 голосов
/ 15 июля 2010

Я использую инфраструктуру CodeIgniter для PHP и наслаждаюсь ею, но я замечаю, что для каждого представления требуется контроллер.Мне интересно, есть ли способ вызвать конкретную модель из самого представления, а не маршрутизировать через контроллер.Я понимаю, что использование контроллера является наилучшей практикой в ​​большинстве случаев, особенно когда данные из модели необходимо каким-то образом изменить, но у меня есть случаи, когда мне просто нужно сделать строгий вывод данных в представление (которое загружаетсячерез ajax), и настройка контроллера для этого кажется излишней.

Есть мысли?Заранее спасибо!

Ответы [ 6 ]

3 голосов
/ 17 июля 2010

Вы в корне неправильно понимаете MVC, по крайней мере, как это реализовано в CI.

Все URL-адреса на вашем сайте (по крайней мере, те, которые используют инфраструктуру CI) отображаются на функции (методы) в контроллерах.

http://myCIsite.com/controller/method[/var1][/var2]...

Не имеет значения, доступен ли URL-адрес по обычному HTTP или через AJAX. Это всегда сопоставление один к одному. Из-за этого вы должны думать о комбинации контроллер / метод как о «веб-странице». Не думайте о представлении как о веб-странице.

Модели и представления подчинены контроллерам. Контроллер делегирует им конкретные обязанности - взаимодействие с базой данных для моделей и вывод страниц на представления.

Поскольку модели и представления служат только для выполнения делегированных обязанностей, их использование не требуется ни в одном конкретном контроллере / методе. Например, страницам справки обычно не нужно взаимодействовать с базой данных, поэтому не существует модели, используемой комбинацией контроллер / метод, которая обслуживает данную страницу справки. Аналогично, обработчики форм часто перенаправляют на другую страницу после завершения обработки. Таким образом, нет представления, соответствующего обработчику формы (но есть (вероятно) представление, вызываемое из контроллера / метода в перенаправленном на страницу).

Кроме того, модели и представления не обязательно соответствуют один на один с отдельными контроллерами / методами. Любая данная модель может быть загружена и использована из нескольких контроллеров. Аналогично, контроллер может иметь одно монолитное представление, которое используется всеми методами, или каждому методу может быть назначено свое собственное представление. (Или, как я только что сказал, данный контроллер / метод может вообще не использовать представление.)

Наконец, CI не требует строгого разделения MVC. Вы можете взаимодействовать с базой данных и выводить HTML-код изнутри контроллера, и CI не будет жаловаться. Тем не менее, за этим разделением и делегированием ответственности следуют, потому что логическое разделение обязанностей облегчает чтение кода и помогает вам следовать принципу СУХОЙ в своем кодировании.

Фундаментальное понимание состоит в том, что «веб-страница» соответствует контроллеру / методу. Представление и модель, когда они используются, обрабатывают делегированные обязанности для контроллера / метода.

0 голосов
/ 23 июля 2010

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

Но все же, если вы этого хотите, просто передайте $ this-> db из контроллера в представление и используйте его в представлении. Опять же, это НЕ хорошая практика.

0 голосов
/ 18 июля 2010

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

Но если вы действительно не хотите использовать MVC, возможно, Codeigniter не является для вас основой.

0 голосов
/ 16 июля 2010

Чтобы выполнить запрос через Ajax, вам все равно нужно указать URL / путь в вызове javascript.Вы не можете обойти тот факт, что функция контроллера должна «перехватить» этот вызов;Вы не можете отобразить URL-адрес непосредственно на модель.Все, что вам нужно, это 3-4 строки кода в вашем контроллере.

Через URI-маршрутизацию вы можете сопоставить URL-адрес с другим контроллером, так что вам не "нужен контроллер для каждогоПосмотреть".Я всегда создаю контроллер под названием «ajax» для обработки этих запросов.

Базовый вызов ajax с jquery может выглядеть примерно так:

$('#prod_img').load( "http://domain.com/ajax/get_img", {'color': 'blue', 'url_title': 'bla' } )
0 голосов
/ 16 июля 2010

Я немного сбит с толку относительно того, что именно вы пытаетесь достичь.Ценность контроллера, помимо того, что он является чистым способом обработки входящих запросов, состоит в том, чтобы управлять взаимодействием между моделями и представлениями и определять, какие представления загружать.Также вполне разумно загружать данные модели непосредственно из ваших представлений, но как вы попали к вашему представлению в первую очередь?

Я полагаю, мне просто трудно увидеть контекст здесь.*

0 голосов
/ 15 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...