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

Этим летом я установил две разные системы 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 для каждого основногозадача.Вместо этого каждый класс «контроллера», который будет использоваться в системе, зарегистрирован на 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: header('Location: index.php?controller=DetailsEditor&image_id=456').

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

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

Спасибо.

Ответы [ 4 ]

4 голосов
/ 21 августа 2010

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

4 голосов
/ 21 августа 2010

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

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

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

3 голосов
/ 21 августа 2010

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

1 голос
/ 22 августа 2010

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

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

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

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

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

...