Каковы плюсы и минусы определения класса Controller через URL-адрес или наличие сценария для каждого контроллера?

Этим летом я установил две разные системы PHP. Каждый использует два разных метода:

Метод № 1: Один файл PHP на задание

Этот метод требует создания файла PHP для каждой важной задачи. Например, мой сценарий загрузки будет доступен через http://www.domain.com/upload.php . В upload.php создается и используется экземпляр класса «controller» и «view». Например, upload.php может выглядеть примерно так:

 <?php require_once PATH_LIBRARY . 'control/Uploader.class.php'; require_once PATH_LIBRARY . 'view/UploaderPage.class.php'; $uploader = new Uploader(); $uploader->setView(new UploaderPage()); $uploader->init(); ?> 

В приведенном выше сценарии, если бы я хотел вызвать другой скрипт, я бы просто перенаправил и добавил необходимые URL-кодированные переменные ( header('Location: edit_details.php?image_id=456'); ).

Метод №2: Основной файл index.php , обрабатывающий все запросы

Этот метод не требует создания файла PHP для каждой важной задачи. Вместо этого каждый класс «controller», который будет использоваться в системе, регистрируется на index.php с уникальным классом, который я называю Router . Маршрутизатор решает, является ли указанный Контроллер законным или незаконным и действует соответствующим образом (направляет браузер на правильный контроллер). Например, упрощенная версия скрипта index.php :

 <?php require_once 'bootstrap.inc'; require_once PATH_LIBRARY . 'router/Router.class.php'; $router = new Router(); $router->register('Uploader', PATH_LIBRARY . 'control/Uploader.class.php'); $router->register('DetailsEditor', PATH_LIBRARY . 'control/DetailsEditor.class.php'); $router->route(); ?> 

Таким образом, каждое действие происходит в index.php . Нет необходимости в большом количестве файлов, которые не делают ничего другого, которые создают экземпляр определенного класса представления и контроллера. НО, если вы хотите вызвать скрипт / класс A из сценария / класса B, вам необходимо передать имя класса контроллера вместе с header('Location: index.php?controller=DetailsEditor&image_id=456') URL: header('Location: index.php?controller=DetailsEditor&image_id=456') .

До сих пор мне не очень нравится, что мне нужно включить имя контроллера в URL. Я чувствую, что он предоставляет слишком большую часть моей базовой системы конечному пользователю. Но мне нравится, что я могу зарегистрировать все классы контроллеров на одной странице. В основном, я не знаю, безопасно ли выявлять имя контроллера. Еще одно раздражение заключается в том, что если я хочу вызвать скрипт через POST-запросы, я должен включить скрытый ввод, который задает требуемый класс контроллера (например, <input type="hidden" name="controller" value="DetailsEditor" /> ).

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

Спасибо.

Не так быстро. Подход с одним файлом PHP за действие может быть быстрее и лучше. Это зависит от того, как вы это настроите.

  • Веб-сервер отправит HTTP-запрос правильному обработчику на основе имени файла. Зачем изобретать это?

  • В большинстве случаев все, что вам нужно для «обработчика», это:

     <?php include "everything.php"; // do some work // Bounce the browser to a "view" url or display an error. 

    который, по крайней мере, является кратким.

Обработка с помощью маршрутизатора более эффективна, потому что у вас есть только одно место для изменения, если вы будете вынуждены изменить структуру файла / директории в будущем, и если какие-либо сотрудники придут, гораздо легче понять, как работает система, если каждый нагрузки выполняются только одним «маршрутизатором / алгоритмом»

Просто мое мнение

PS представьте, если вам нужно будет изменить структуру dir, вам придется переписать кучу включений, ведь это занимает много времени, и может порождать ошибки и требует времени 🙂

Если вы используете второй вариант, вы должны использовать переписывание URL-адресов, чтобы превратить URL-адреса в хороший, удобочитаемый формат. Таким образом, вы получаете гибкость и силу – определенно, путь. Этот метод обычно называют фронт-контроллером , кстати.

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

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

 header('Location: index.php?controller=DetailsEditor&image_id=456') 

ваше перенаправление будет выглядеть так:

 $router->redirect ($router->getUrl ('editimagedetails', array(456))); // example getUrl method signature is // string getUrl (string $viewOrActionName, array $params) 

Естественно, getUrl будет использоваться для создания ссылок и формирования URL-адресов действий.

Любые изменения (например, включение или выключение URL-перезаписи или переименование параметров строки запроса) включают только класс Router, поскольку имя DetailEditor и параметр строки запроса image_id – это детали реализации, неизвестные клиентскому коду.