2010-07-15 2 views
3

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

Любые мысли? Заранее спасибо!

ответ

0

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

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

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

+2

* И на самом деле то, что вы говорите, нарушит наилучшую практику шаблона проектирования MVC. * Все зависит от того, какая «версия» MVC вы придерживаетесь. Есть по крайней мере 3 разных «варианта» ... Говорят, контроллер переводит модель в представление. Один говорит, что представление втягивает модель в себя. И еще один говорит, что контроллер подталкивает данные в представление (поэтому модель на 100% отделена от представления без зависимостей). Хотя я согласен с вами в том, что самое главное - быть последовательным, это не ломает MVC, чтобы заводить вещи в другом порядке. MVC - это разделение, а не отношение ... – ircmaxell

+0

@ircmaxell: Интересно, что существует три версии этого, я говорил о шаблоне CI. Было бы здорово, если бы вы могли опубликовать ссылку, где обсуждаются эти три версии, спасибо :) – Sarfraz

0

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

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

0

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

С помощью ссылки URI routing вы можете сопоставить URL-адрес с другим контроллером, поэтому вам не требуется «контроллер для каждого вида». Я всегда создаю контроллер под названием «ajax» для обработки этих запросов.

Основной Аякса вызов с JQuery может быть что-то вроде этого

$('#prod_img').load("http://domain.com/ajax/get_img", {'color': 'blue', 'url_title': 'bla' }) 
3

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

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

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

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

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

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

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

И, наконец, CI не обеспечивает строгое разделение MVC. Вы можете взаимодействовать с базой данных и эхом HTML изнутри контроллера, а CI не будет жаловаться. Тем не менее, это разделение и делегирование ответственности соблюдается, поскольку логическое разделение обязанностей делает код более легким для чтения и помогает вам следовать принципу DRY в вашей кодировке.

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

0

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

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

+0

Кажется, что coolgeek уже сказал вам об этом, но я не прочитал его полный ответ сначала. Шахта все равно короче (но лучше) :) –

0

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

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

Смежные вопросы