В чем разница Route, Router, Request?

fawkes

Новичок
router - содержит массив роутов
request - по списку роутов вызывает необходимый метод класса

А route зачем?
 

fixxxer

К.О.
Партнер клуба
фреймворк какой мы должны сами догадаться?
 

fixxxer

К.О.
Партнер клуба
в целом - что угодно, в silex - то, что написано в документации по нему
 

Фанат

oncle terrible
Команда форума
вот это "выкрутились", наряду "но всё равно спасибо" всегда радует несказанно.
пожурил несмышлёнышей.
 

fawkes

Новичок
fixxxer, Фанат, Прощу прощения, если вы это посчитали неуважением.
 

AmdY

Пью пиво
Команда форума
request - это то, что тебе пришло от пользователя.
router - это шляпа которая преобразует данные из реквеста в нужный тебе вид-маршрут до коллбэка
дальше диспетчер дёргает это коллбэк с нужным реквестом и параметрами.

сейчас модно смешивать роутинг и диспетчеризацию
 

AmdY

Пью пиво
Команда форума
fawkes
угу, получается у коханы с роутом всё нормально, он мэпит урлы в обе стороны. вот реквест смесь диспетвера с каким-то носорогом, идеалогически невыдержено, но это не страшно. я как правило роутинг, димпетчер и реквест объединяю в один метод и не парусь по повоу идеалогии.

с теорией лучше к Zend Framework http://framework.zend.com/manual/1.12/ru/zend.controller.front.html , они пишут идеалогические верную систему, потому такая неудобная.
 

fixxxer

К.О.
Партнер клуба
AmdY
Я делаю чуточку иначе.

У меня любой контроллер умеет dispatch($action, $args); роутер же:

базовый - route(RequestInterface $Request, ControllerInterface $Controller) (метод вызывает $Controller->dispatch($action, $args),
вебовый - дополнительно умеет строить урлы.

Это позволяет легко делать вложенную диспетчеризацию с разными роутерами: например, есть FrontController с Map Router (карта prefix/regexp -> controller/action name), есть в карте маршрут /rpc/ -> 'RpcController', map router вызывает RpcController->dispatch, RpcController создает JsonRpcRouter и далее.

То есть, dispatch() контроллера сам решает, что делать, роутить дальше, или вызвать action.

Да, front controller от обычного контроллера отличается только наличием метода run(), все остальное то же самое.
 

AmdY

Пью пиво
Команда форума
а что имеено непонятно. весьма неплохой вариант
 

Vladex

Новичок
Да не могу понять.
Примера как такового нет.
Вот как тут отследить логику?
PHP:
$router->map('/', 'someController:indexAction', array('methods' => 'GET'));
$router->map('/users/123','users#create#123', array('methods' => 'POST', 'name' => 'users_create'));
$router->map('/users/:id/edit/', 'users#edit', array('methods' => 'GET', 'name' => 'users_edit', 'filters' => array('id' => '(\d+)')));
$router->map('/contact/',array('controller' => 'someController', 'action' => 'contactAction'), array('name' => 'contact'));
$router->map('/blog/:slug', array('c' => 'BlogController', 'a' => 'showAction'));
Что это такое?
PHP:
<pre><?php var_dump($route->getTarget()); ?></pre>
И для чего какой то генератор?
PHP:
<p><a href="<?php echo $router->generate('users_edit', array('id' => 5)); ?>"><?php echo $router->generate('users_edit', array('id' => 5)); ?></a></p>
 

AmdY

Пью пиво
Команда форума
PHP:
$router->map('/', 'someController:indexAction', array('methods' => 'GET')); // для запроса типа GET на / отработает someController:indexAction
$router->map('/users/123','users#create#123', array('methods' => 'POST', 'name' => 'users_create')); // это правило только для POST запроса вызовет в контроллере user метод create
$router->map('/users/:id/edit/', 'users#edit', array('methods' => 'GET', 'name' => 'users_edit', 'filters' => array('id' => '(\d+)')));
$router->map('/contact/',array('controller' => 'someController', 'action' => 'contactAction'), array('name' => 'contact'));
$router->map('/blog/:slug', array('c' => 'BlogController', 'a' => 'showAction')); // c и a - это вероятно короткая запись controller, action
PHP:
<pre><?php var_dump($route->getTarget()); ?></pre>
хз, вероятнее всего он отдаёт сработавший роут или кэллбэк для него
PHP:
<p><a href="<?php echo $router->generate('users_edit', array('id' => 5)); ?>"><?php echo $router->generate('users_edit', array('id' => 5)); ?></a></p>
это сгенерирует урл согласно правилу для роута с именем users_edit
в нашем случае это $router->map('/users/:id/edit/', 'users#edit', array('methods' => 'GET', 'name' => 'users_edit', 'filters' => array('id' => '(\d+)')));
и урл получится /user/5/edit

p.s. Я не читал доку, но класс неплохо сделан и можно обо всём догадаться по апи
 

Vladex

Новичок
Я так понимаю с помощью
PHP:
$router->map();
можно задавать любой вариант URL.
Главное какое действие будет при этом происходить, верно?
Url к примеру
www.site.com/name/vasya/pupkin/
www.site.com/vasya/name/pupkin/
www.site.com/vasya_pupkin/
www.site.com/familiya/
Главное что это запустит нужный контроллер и вызовет нужное действие.
А генерация ссылок в каких случаях требуется?
 

AmdY

Пью пиво
Команда форума
А генерация ссылок в каких случаях требуется?
у тебя было www.site.com/name/vasya/pupkin/ $router->map('/:first/:second/:third', 'users#edit', array('methods' => 'GET', 'name' => 'users_edit'));
ты хочешь www.site.com/vasya/name/pupkin/ $router->map('/:second/:first/:third', 'users#edit', array('methods' => 'GET', 'name' => 'users_edit'));
поменял роут и у тебя на всём сайте будут правильные урлы
 

Vladex

Новичок
Хорошо, идем дальше.
По части примера выше:
Вот например сформировал я маршрут
$router->map('/users/:id/edit/', 'users#edit', array('methods' => 'GET', 'name' => 'users_edit', 'filters' => array('id' => '(\d+)')));
Имею ссылку вида /users/5/edit/
Поменял
$router->map('/users/edit/:id/', 'users#edit', array('methods' => 'GET', 'name' => 'users_edit', 'filters' => array('id' => '(\d+)')));
Имею ссылку вида /users/edit/5/
Но, а как мне эти параметры использовать?
Как построить оболочку контроллеров.
 
Сверху