Этим летом я установил две разные системы 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
– это детали реализации, неизвестные клиентскому коду.