Просмотр поста

.
Delphinum

Чтоб было немного понятнее, как это чудо работает, разберу следующее. К примеру нам надо обработать следующие роуты:
/article - список статей
/article/view - статья
POST /article - создать статью
PUT /article/id - редактировать статью
DELETE /article/id - удалить статью

В первую очередь важно понять, что функция route это "фабрика", а не процедура. Она использует ваши правила роутинга и создает роутер, который эти правила применяет:

$router = route(
  ... // Правила роутинга
);

// Выполнение роутинга
$router(
  ... // Все параметры роутера передаются напрямую в правила роутинга
);


Второе важное замечание, правила роутинга делятся на "условия" и "контроллеры". Условия определяют, в верном ли направлении движется роутинг, а контроллеры обрабатывают запрос:
$router = route(
  route(
    preg_match('~^/article/view~', $path) == 1, // Условие
    function(){  // Контроллер                                                               
      return 'Статья';                                                    
    }
  ),
  ... // Следующие варианты роутинга
);

В качестве условия может выступать функция, а не логическое выражение, что делает решение еще более гибким:
$router = route(
  route(
    function(){
      return preg_match('~^/article/view~', $path) == 1; // Условие
    },
    function(){  // Контроллер                                                               
      return 'Статья';                                                    
    }
  ),
  ... // Следующие варианты роутинга
);

Вложенные условия позволяют разделить роутер:
$router = route(
  ... // Роутинг статьи
  // Следующий вариант роутинга
  route(                                                                        
    preg_match('~^/article~', $_SERVER['REQUEST_URI']) == 1,                                      
    // Вложенный роутинг  
    route(                                                                      
      $_SERVER['REQUEST_METHOD'] == 'POST',                                                        
      function(){                                                               
        return 'Создание статьи';                                                
      }                                                                         
    ),                                                                             
    route(                                                                      
      $_SERVER['REQUEST_METHOD'] == 'GET',                                                         
      function(){                                                               
        return 'Список статей';                                                  
      }                                                                         
    ),
    ...                                                                           
  )                                                                             
);