plumbus/router

此软件包最新版本(0.1.5)没有可用的许可信息。

Plumbus最简单的路由器

0.1.5 2016-04-27 14:47 UTC

This package is auto-updated.

Last update: 2024-09-19 15:47:54 UTC


README

轻量级且快速的PHP请求路由

用途是什么?

这是一个简单的路由器,用于将URL中的某些路径与某些值匹配。例如,我们需要将路径 /news/100/edit 与 "news_edit" 匹配,这是配置控制器中请求页面的键。路由器使用“路由表”——一个数组,其键表示URL的一部分,并可能包含值。

  • 空值 - 正是这个页面,
  • %s - 任何字符串
  • %d - 任何数字
  • 任何字符串 - 正是这个字符串。

在此期间,数组中的值是字符串或回调函数,它们在路由解析成功时会被调用。为了将URL请求的部分转换为变量,可以在路由键旁边使用等号指定变量名 - 例如,'%s=some_variable' 表示这个URL部分是任何字符串,并且应该作为名为 some_variable 的变量可用。

安装

要安装,请使用composer的配置 - 在 composer.json 文件的require部分中添加


Для проверки работоспособности, можно запустить unit-тестирование командой
```
# vendor/phpunit/phpunit/phpunit --color src/
PHPUnit 4.8.21-5-gacbb9e4 by Sebastian Bergmann and contributors.

.......

Time: 598 ms, Memory: 4.00Mb

OK (7 tests, 22 assertions)
```

### Использование  ###

#### Пример 1 ####

В Этом примере мы задаем 2 роутинга - для методов PUT и DELETE.
Затем выполняем роутинг 2 раза - для обоих методов.
Нектороые части пути содержат некоторые значения после %s или %d - значит, они попадут
как переменные в массив variables и будут содержать конкретные значения.

```
   $router = new Router();

   $router->setTrailingSlashBehavior(
       Router::TRAILING_SLASH_BEHAVIOR_IGNORE
   );
   /**
    * set routing for rule "DELETE"
    */
   $router->setRoutingMap(
       [
           'item' => [
               '%s=var1' => [
                   '%s=var2' => 'DELETE_ITEM',
               ]
           ]
       ],
       'DELETE'
   );

   /**
    * set routing for rule "PUT"
    */
   $router->setRoutingMap(
       [
           'item' => [
               '%s' => [
                   '%d=myCustomVariable3' => 'PUT_ITEM',
               ]
           ]
       ],
       'PUT'
   );

   /**
    * resolve map by DELETE rule
    */
   $variables = [];
   $this->assertEquals('DELETE_ITEM', $router->route('/item/value1/value2', 'DELETE', $variables));

   /**
    * resolve map by PUT rule
    */
   $this->assertEquals('PUT_ITEM', $router->route('/item/loasdll/100000', 'PUT', $variables));

   /**
    * checking variables
    */
   $this->assertEquals('value1', $variables['var1']);
   $this->assertEquals('value2', $variables['var2']);
   $this->assertEquals('100000', $variables['myCustomVariable3']);
```

#### Пример 2 ####

Живой пример - есть контроллер для отрисовки поста автора и такой роутинг к нему:
```
    $router = new Router();
    $router->setTrailingSlashBehavior(
        Router::TRAILING_SLASH_BEHAVIOR_IGNORE
    );
    /**
     * set routing for rule "GET"
     */
    $router->setRoutingMap(
        [
            'author' => [
                '%s=authorName' => [
                    '%d=postId' => 'author_post',
                ]
            ]
        ],
        'GET'
    );
    $variables = [];
    $controllerName = $router->route('/author/tema/100500', 'GET', $variables);
    echo 'controller:' . $controllerName . "\nvariables:\n";
    print_r($variables);
```

Вывод:

```
    controller:author_post
    variables:
    Array
    (
        [authorName] => tema
        [postId] => 100500
    )
```

#### Пример 3 ####

Добавление правил роутинга с помощью массивов или строк:
```
    $router = new Router();

    $router->addRoutingRule(['%s=var1' => ['%d=var2' => 'varvar']]);
    $variables = [];
    $this->assertEquals('varvar', $router->route('/bla/100500', $variables));
    $this->assertEquals('bla', $variables['var1']);
    $this->assertEquals('100500', $variables['var2']);

    $router->addRoutingRule('/%s/%s/%s', 'some_page1');
    $this->assertEquals('some_page1', $router->route('/bla/bla/bla'));
```

### ПОМОЩЬ И ПОДДЕРЖКА ###
you can send any questions to amuhc@yandex.ru