2015-03-09 2 views
1

У меня этот класс маршрутизатора, но я не уверен, какой шаблон он должен принадлежать. Кажется, это facade или шаблон посредника для меня. Как вы думаете?Является ли маршрутизатор фасадным рисунком?

class Router 
{ 
... 
} 

использование,

$router = new Router(); 

$router->get('/', function() { ... }); 
$router->get('foo/', function() { ... }); 
$router->post('foo/', function() { ... }); 

Но, кажется, что он говорит, что маршрутизатор является анти-модель, как некоторые из commets предложить в этом question. если маршрутизатор нарушает шаблоны, то какие решения?

ответ

1

Маршрутизатор не является самим шаблоном, его просто инструментом, который просто соответствует строкам URI с известными шаблонами reg-ex. И как только совпадение найдено, тогда создание экземпляра контроллера должно быть обработано другим инструментом, который известен как Диспетчер. Таким образом, существует четкое разделение между обязанностями, соблюдая при этом Принцип единой ответственности.

Сам маршрутизатор не нарушает какой-либо известный шаблон. Только вы можете нарушить их при написании класса маршрутизатора.

Чтобы запустить приложение, вам также необходимо реализовать такие функции, как автозагрузчик класса Front Controller, Dispatcher и PSR-0.

Что касается фасадов, то реализация вашего маршрутизатора не имеет к этому никакого отношения. Потому что фасады не предназначены для таких вещей. Тейлор называет классы фасадов, которые предоставляют услуги, это не реализация фасадного рисунка.

Фасад сам по себе является просто оболочкой, которая должна иметь один интерфейс для разных сред. Например, очень популярный пример реализации фасадов в JavaScript

function click(elem, event, callback){ 
    if (elem.addEventListener != undefined){ 
    return elem.addEventListener(..); 
    } else if (elem.attachEvent != undefined) { 
    return elem.attachEvent(..); 
    } else { 
    return elem.onclick = callback; 
    } 
} 

Или, может быть, что может быть что-то вроде этого:

// For old PHP versions 
if (!function_exists('file_get_contents')){ 
    function file_get_contents(){ 
    // ... 
    } 
} 

Это то, что фасады все.

И, наконец, чтобы ответить на ваш вопрос, Я бы сказал, что вы должны перестать думать о том, как написать идеальный код, если вы не знаете, как работает маршрутизатор. Вам лучше начать писать то, что работает, а затем начать думать об улучшениях. В результате вы можете получить хороший и рабочий код.

+0

благодарит за ответ. но «Только вы можете нарушить их при написании класса маршрутизатора». Почему бы не сделать маршрутизатор классом? это должна быть только функция? – oasis

+0

Когда я написал это предложение, я имел в виду, что многие разработчики злоупотребляют реализацией маршрута, вкладывая в него все. Их маршрутизатор слишком много знает об этом, так что вы можете увидеть реализацию диспетчера и фронт-контроллера там в одном классе. – Yang

Смежные вопросы