PHP 路由器

1.5 2023-09-29 19:36 UTC

This package is auto-updated.

Last update: 2024-09-29 22:16:17 UTC


README

安装

$ composer require obscure-code/router

基本使用

创建路由器类

use ObscureCode\Router as AbstractRouter;

class Router extends AbstractRouter {
    public function patternDefault(string $path): void
    {
        $this->load('header');
        $this->load($path);
        $this->load('footer');
    }

    public function patternBlank(string $path): void
    {
        $this->load($path);
    }

    public function patternError(string $path): void
    {
        http_response_code(404);
        $this->load('header');
        $this->load('error');
        $this->load('footer');
    }
};

创建配置

$config = [
    "index" => [
        "pattern" => "default",
    ],
    "ajax" => [
        "pattern" => "blank",
    ],    
    "directory" => [
        "index" => [
            "pattern" => "default",
        ],
    ],
    "error" => [
        "pattern" => "error",
    ],
];

使用根目录和配置创建路由器实例

$router = new Router(
    __DIR__ . '/include',
    $config,
);

示例

// Call /include/index.php by default
$router->call('/');

// Call /include/directory/index.php
$router->call('/directory/index');

// If /include/a/b.php route exists, ['c', 'd', 'e'] will passed in $params
// If only /include/a.php exists, ['b', 'c', 'd', 'e'] will passed in $params
$router->call('/a/b/c/d/e');

// ['data'] will passed in $data
$router->call('/index', ['data']);

您也可以在 load 方法中传递数据

public function patternDefault(string $path): void
{
    $someClass = new SomeClass();

    $this->load('header');
    $this->load($path, ['someClass' => $someClass]);
    $this->load('footer');
}

如果配置中没有找到路由,将抛出 NotFoundException。因此,您可以使用路由器如下

use ObscureCode\Exceptions\NotFoundException;

try {
    ob_start();
    $router->call($route);
} catch (NotFoundException $exception) {
    ob_clean();
    $router->call('error');
} catch (SomeOtherException $exception) {
    // do something
} finally {
    ob_end_flush();
}

如果配置中存在路由,但模式或文件不存在,将抛出 LogicException

您可以在 这里 看到一个样板应用的示例。

本地开发

docker build --tag router .
docker run --detach -v "$(pwd):/app" --name=router router
docker exec -it router /bin/bash

composer install
composer tests
composer cs
composer stan
composer psalm