Pull to refresh

Comments 5

А как будет выглядеть в этом мощном маршрутизаторе пример с переменными?
Как обрабатываются оверлап роутс?
Вопроса про переменные немного не понял,
А вот если роуты пересекаются, то берется наиболее подходящий вариант.

Например

my $app = builder {
    mount "/test/" => $app1;
    mount "/test/one" => $app2;
    mount "/test/two" => $app3;
    mount "/test/two/three" => $app4;
};



Маршрутизация будет выполняться следующим образом:

/test => $app1;
/test/hello => $app1
/test/one => $app2
/test/two => $app3
/test/three => $app1
/test/two/three => $app4
/test/two/four => $app3
Переменные — это когда /foo/$id будет вызывать app($id).
У вас роуты не пересекаются. Пересекаются это когда есть роуты типа:
/foo/bar
/foo/^b
В итоге /foo/boo всегда матчится во второй вариант, а /foo/bar может попадать в оба.
Пересекаются.

/test/two
/test/two/three

/test/two/three тоже может попадать в оба.

И они будут смотреть на одно и то же приложение, если убрать mount "/test/two/three" => $app4;

Эта штуковина, насколько мне известно, не поддерживает регулярные выражения.
Для того, чтобы оно зашло в определенную ветку маршрутизатора, должно быть полное совпадение.

Поддержки маппинга переменных из коробки нет. Но можно сделать при помощи middleware + typeglob, если надо.
А нет его потому, что автор Plack решил, что роутер будет отдавать приложение, а разбор параметров дело самого приложения. Есть методы для работы со строкой запроса, параметрами запроса и т.д.

Т.е. роутер просто дает возможность размещать по разным адресам разные приложения. Plack — фреймворк, который реализует PSGI спецификацию от автора спецификации.
Можно вообще угорать по чистому PSGI и горя не знать.

return sub {
    [200, [], ["Hello world"]];
};


Прелесть в том, что никто не мешает, при необходимости сделать свою реализацию роутера, например. И оно будет прекрасно работать с любым PSGI сервером. При правильной реализации, естественно. С моей точки зрения, этого функционала достаточно. А если недостаточно, можно его расширить в нужную сторону. Например, вот так:
Plack::Builder::Conditionals
Или взять что-то посерьезнее, Dancer, Mojo, Catalyst.
Прелесть в том, что никто не мешает, при необходимости сделать свою реализацию роутера, например.

Прелесть в том, что можно использовать множество уже готовых роутеров с поддержкой PSGI и со всеми плюшками, матчинга и так '/user/:id' и сяк '/blog/{year:[0-9]+}/{month:[0-9]{2}}'. Вот даже сравнительная табличка есть.

С другой стороны Plack позиционируется как инструмент для разработки веб-фреймворков. Для повседневной разработки удобнее использовать готовые фреймворки Dancer1/2, Mojolicious, Catalyst и сильно не заморачиваться. KISS.
Sign up to leave a comment.

Articles