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

Этим летом я установил две разные системы 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-запросы, мне нужно включить скрытый ввод, который указывает требуемый класс контроллера (например, ).

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

Спасибо.

6
задан Mike Moore 21 August 2010 в 16:47
поделиться

4 ответа

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

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

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

     

    , что не менее кратко.

1
ответ дан 9 December 2019 в 20:38
поделиться

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

Только мое мнение

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

4
ответ дан 9 December 2019 в 20:38
поделиться

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

4
ответ дан 9 December 2019 в 20:38
поделиться

Фронт-контроллер удобен тем, что вы избегаете всех этих простых файлов сценариев, а также дает вам гораздо больше гибкости. В этом методе вам не нужно указывать имя контроллера в 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 являются деталями реализации. код клиента неизвестен.

3
ответ дан 9 December 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: