Система маршрутизации PHP - PullRequest
1 голос
/ 28 июня 2011

Я пытаюсь создать систему маршрутизации на основе аннотаций (что-то вроде Recess Framework ).

<?php

class MyController extends ActionController {

    /** !Route GET /hello/$firstname/$lastname **/
    public function helloAction($firstname, $lastname) {
        echo('Hello '.$firstname.' '.$lastname);
    }
}

?>

Если я перейду к http://domain.com/hello/James/Bond, я получу

Hello James Bond

Итак, у меня два вопроса:

1) Это хорошая идея? Плюсы и минусы централизованной системы маршрутизации (например, Zend Framework). Возможно, я не вижу проблем, которые могут возникнуть позже с этой техникой маршрутизации.

2) Как проверить наличие дублирующих маршрутов, если в маршрутах есть регулярное выражение

<?php

class MyController extends ActionController {

    /** 
     *!Route GET /test/$id = {
     *    id: [a-z0-9]
     *}
     **/
    public function testAction($id) {
        echo($id);
    }

    /** 
     *!Route GET /test/$id = {
     *    id: [0-9a-z]
     *}
     **/
    public function otherTestAction($id) {
        echo($id);
    }
}

?>

Я получаю два маршрута: /test/[a-z0-9]/ и /test/[0-9a-z]/, и если я иду на http://domain.com/test/a12/, оба маршрута действительны.

Спасибо:)

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

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

Это выглядит примерно так:

<?php   
class MyController extends ActionController {

    /**
       @Route(get=/hello/$firstname/$lastname)
       @OtherVal(var1=2,var2=foo)
       @OtherVal2
    **/
    public function helloAction($firstname, $lastname) {
        echo('Hello '.$firstname.' '.$lastname);
    }
}
?>

И анализируйте ваши аннотациисо следующим регулярным выражением:

@(?P<annotation>[A-Za-z0-9_]*)(\((?P<params>[^\)]*))?

И, конечно, кэшируйте их, где это возможно, чтобы избежать повторного анализа.

1 голос
/ 28 июня 2011

Минусы:

  • Может быть сложно вести обзор сопоставлений URL-адресов всех методов на вашем сервере.
  • Чтобы изменить URL-адрес, необходимо изменить исходный код, отображение не отделено от приложения.

Если сигнатура и сопоставление метода всегда связаны с примером, вы можете использовать отражение для извлечения сопоставления, где helloAction выбирается как / hello и каждый аргумент метода является подкаталог этого в порядке, как они определены.

Тогда аннотации не нужно будет дублировать URL, только тот факт, что метод является конечной точкой, что-то вроде этого:

<?php
    class MyController extends ActionController {

        /** !endpoint(method=GET) **/
        public function helloAction($firstname, $lastname) {
            echo('Hello '.$firstname.' '.$lastname);
        }
}
0 голосов
/ 28 июня 2011

Это хорошая идея, , пока вы кешируете скомпилированные маршруты в рабочей среде . С анализом ваших файлов при маршрутизации связана стоимость, поэтому вы должны избегать этого, когда не разрабатываете.

Что касается проверки на дубликаты, не проверяйте, сравнивая декларацию. Просто проверьте при маршрутизации. Если два правила совпадают, бросьте DuplicateRouteException. Таким образом, при маршрутизации http://domain.com/test/a12/ вы увидите, что оба маршрута действительны, и выдадите исключение.

0 голосов
/ 28 июня 2011
  1. Я думаю, что это хорошая идея / Код развязки и точка входа, кажется, используются повсеместночто соответствует победам.

...