1) Итак, главный вопрос: что-то не так выглядит?
Лично я вижу, что с ростом вашего сайта это становится все сложнее.Среда MVC, как меня учили, в значительной степени должна быть «Установи и забудь» - вы отделяете обработчик запросов (контроллер) от запросов к базе данных и бизнес-конец (модель) и от элементов отображения (представление).
[ Примечание: Вам могут понадобиться другие основные аспекты.Моя стандартная структура включает в себя некоторые основные элементы, которые переносят сеанс через различные части, а также обрабатывают фундаментальные аспекты работы сайта. Например, в то время как модели отвечают за правильные обращения к базе данных в соответствии с указаниями контроллера, есть ядрофункции в файле sql.class.php
, которые предоставляют мне стандартизированный набор методов для выполнения этих вызовов и доставки или кэширования результатов по мере необходимости.]
Ваш метод отправки находится на правильном пути с этим - вы извлекаетеиз URI имя контроллера (форумы, профили и т. д.).Вам нужна карта Ури?Я чувствую, что вы создаете ненужную ситуацию, в которой вы должны обновлять эту карту каждый раз, а не просто создавать новый контроллер, когда вам нужны новые функции, и регистрировать его в базе данных.Я не говорю, что вы не правы сами по себе, я просто не чувствую, что сделал бы это таким образом.
2) Есть ли лучший способ обнаружить, что находится в URIчем использовать регулярное выражение в массиве, как я это делаю, рассмотрите его на сайте с большим трафиком?
Контролируйте результат (не каламбур, так как здесь работает контроллер).Рассмотрите этот подход и посмотрите, как он работает для вас:
Ваш файл index.php (он же «Главный контроллер») захватывает URI и разбивает значения вдоль «/» на биты.бит [0] - это идентификатор контроллера - здесь написано «Я хочу использовать контроллер с именем bit [0] => значение».Это делается следующим образом:
require_once( dirname( __FILE__ )."/controllers/".$bit[0]."controller.php" );
Лично, будучи немного уродливым, когда дело доходит до структур каталогов, я использую бит [0], чтобы идентифицировать каталог, в котором находится controller.php, так как яможет иметь субконтроллеры.
Именно этот файл контроллера я использую для разбора других битов.Для этого я буду использовать пример:
Предположим, что бит [0] содержит значение «форумы».Я мог бы передать, если он установлен, бит [1] в оператор switch.По умолчанию я всегда хочу составить список, но я могу специально указать его для «list», «view» или «post» в битах [1].Это скажет мне в классе контроллера, какой метод вызывать.Затем метод скажет мне вызвать соответствующую модель «форумы», если мне нужно будет выполнять запросы и кэшировать, например, список форумов.
Посторонние «биты» могут делать одно из двух: они могут бытьПередать в метод простые аргументы относительно того, какие данные запрашивать у модели, или бит [1] может быть достаточно сложным, чтобы гарантировать субконтроллер, и последующие биты будут переданы этому контроллеру для определения соответствующего действия, как былосделано с контроллером форумов.
Regex, будучи медленным, следует избегать, когда это возможно.Так как у нас может быть URI /forums/view/102305
, мы можем предположить, что контроллер forums
будет передавать 102305
методу, связанному с аргументом view
(этот метод похож на private function displayPost( $id )
, где $id
равен 102305
).Регулярное выражение не требуется, поскольку мы можем просто разбить значения по общему ожидаемому разделителю.
3) Поскольку все это направляется через файл index.php с этим, как мне поступить с обработкой запросов AJAX?
Не очень сложно.Если контроллер установлен, скажем, на AJAX, вы можете перестроить URL и получить прямой доступ к нему.Вы можете написать исключения в файле .htaccess (RewriteRule ^(AJAX)($|/) - [L]
).Или (не идеальный, но хитрый способ) добавить ../
к вашему URI AJAX, чтобы вернуть URI обратно в root - он больше не пытается получить доступ к index.php
, поэтому правило перезаписи не применяется.
Редактировать
Давайтепредположим, что мы используем URI /forums/id-1234/page-4
для вашего примера. Опять же, давайте предположим, как я упомянул выше, что forums
относится к используемому контроллеру, а все остальные /
разделяют аргументы (что я люблю называть «детализацией»). Итак, в нашем файле контроллера форума (назовем его forumcontroller.php
, у нас может быть что-то вроде этого (очень упрощенного) конструктора:
// $registry is a class containing fundamental methods, and is meant to exemplify all
// classes tied to the main controller "index.php". Keep in mind, I'm assuming we've
// found the right controller by exploding the URI, and passed the remainder as bits
// to the constructor.
public function __construct( registry $registry ) {
$this->registry = $registry; //tying this controller to main controller.
// For ease and clarity, we're assuming there's no case in which you wouldn't have
// bits set. Error checking is easy.
$bits = $this->registry->getURLBits;
switch( $bits[0] ) {
case 'view': $this->showForumEntry( $bits[1], (isset( $bits[2] ) ? $bits[2] : '' ); break;
case 'edit': $this->editForumEntry( $bits[1] ); break;
case 'post': $this->postForumEntry(); break;
default: $this->listForumEntries(); break;
}
}
private function showForumEntry( $thread, $offset ) {
// Because you wanted to prepend id to the id element, we can use this for
// cheekiness in the query if our DB is well designed.
$data = explode('-', $thread);
// Select all from forums where id = 1234
$sql = "SELECT * FROM forums WHERE $data[0] = $data[1]";
if( $offset != '' ) {
$page = explode('-', $offset);
$offset = $page[1] * 25; // Or whatever your max per page is. Make it dynamic.
$max = $offset+25;
$sql .= " LIMIT $offset, $max";
}
// You see where I'm going with this...
}
Суть в том, что вы контролируете то, что передается и как это обрабатывается. Управляйте URI, и вы сможете упростить их обработку.
Редактировать 2
Прочитав еще раз, я думаю, что вам помогут несколько концепций, с которыми вам следует ознакомиться:
Просмотрите шаблон «Фабрика» здесь (мой реестр $, в своей основе, представляет собой набор фабрик):
http://php.net/manual/en/language.oop5.patterns.php
Хорошая графическая разбивка MVC:
http://best -practice-software-engineering.ifs.tuwien.ac.at / модели / изображения / mvc3.jpg
Подробнее о фабричных методах:
http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/
Еще одно замечание, и это личное наблюдение после работы с Joomla, Drupal, Wordpress и различными корпоративными решениями CMS и BBS - разрабатывайте исключительно с учетом ваших потребностей. Когда вы начинаете пытаться стать «чем-то для всех», вы в конечном итоге получаете множество ненужных наворотов, которые загружаются с каждой страницей и используются 1 раз из 100. MVC - это шаблон проектирования, и использование его в качестве шаблона покажет вам избавиться от лишнего во всех аспектах, включая URI. Обработка /controller/arg1-Identifier/arg2-offset
не требуется, и вы легко можете воспользоваться /controller/id/offset
(например, /forums/1234/4
). Если вы хотите сделать его более удобным для SEO, добавьте заголовок темы, а не тег, идентифицирующий идентификатор (например, /forums/1234-This-Is-A-Topic/4
).
Теперь давайте также отметим очевидное, что касается моего редактирования выше - это контроллер, предназначенный исключительно для элемента форума. Каждый элемент вашего сайта (то есть форумы, галереи, профили и т. Д.) Должен иметь свой собственный контроллер. Зачем? Потому что каждый делает совершенно разные вещи на своих страницах. Так что воспользуйтесь этим - вам не нужно использовать карту URI, если вы понимаете, что направляете к контроллеру, а контроллер передает полномочия модели и любым вспомогательным контроллерам, которые могут понадобиться.
Я очень надеюсь, что это поможет.