Этим летом я установил две разные системы PHP. Каждый использует два разных метода:
Метод № 1: один файл PHP на задачу
Этот метод требует, чтобы файл PHP
создавался для каждой основной задачи. Например, мой скрипт загрузки будет доступен через http: //www.domain.com/upload.php
. В upload.php
создаются экземпляр класса «контроллер» и «представление». Например, 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, вам необходимо передать имя класса контроллера вместе с URL: заголовок ('Location: index.php? Controller = DetailsEditor & image_id = 456')
.
Пока мне не очень нравится тот факт, что мне нужно включить имя контроллера в URL. Я чувствую, что это подвергает слишком много моей базовой системы конечному пользователю. Но, Мне нравится тот факт, что я могу зарегистрировать все классы контроллеров на одной странице. В основном, я не знаю, безопасно ли выставлять имя контроллера. Еще одно неудобство заключается в том, что, если я хочу вызвать скрипт через POST-запросы, мне нужно включить скрытый ввод, который указывает требуемый класс контроллера (например,
).
Я надеюсь, этого достаточно, чтобы продолжить. Я просто нервничаю из-за того, что второй метод на самом деле не будет мне полезен в ближайшие месяцы. У меня скоро появится небольшое окно для выбора того или другого.
Спасибо.
Не так быстро. Подход с одним файлом PHP на действие может быть быстрее и лучше. Это зависит от того, как вы все устроили.
Веб-сервер направит HTTP-запрос правильному обработчику в зависимости от имени файла. Зачем изобретать это заново?
В большинстве случаев все, что вам нужно для «обработчика», это:
Php include «everything.php»;
// поработай немного
// Вернуть браузер к URL-адресу "просмотра" или отобразить сообщение об ошибке.
, что не менее кратко.
Обработка с помощью маршрутизатора более эффективна, потому что у вас есть только одно место для изменения, если вы будете вынуждены изменить структуру файла / каталога в будущем, и если какие-либо сотрудники придут, гораздо легче понять, как система работает, если каждая загрузка выполняется только одним «маршрутизатором / алгоритмом»
Только мое мнение
PS представьте, если вам придется изменить структуру каталога, вам придется переписать кучу включений, ведь пора потребляет много времени, может давать ошибки и требует времени :)
Если вы используете второй вариант, вам следует использовать переписывание URL, чтобы преобразовать URL в хороший, человекочитаемый формат. Этот способ обеспечивает гибкость и мощь - определенно, это то, что нужно. Этот метод обычно называют фронт-контроллером.
Фронт-контроллер удобен тем, что вы избегаете всех этих простых файлов сценариев, а также дает вам гораздо больше гибкости. В этом методе вам не нужно указывать имя контроллера в 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
являются деталями реализации. код клиента неизвестен.