小状元/srouter

简单的PHP路由类。

2.1.0 2018-12-19 11:16 UTC

This package is auto-updated.

Last update: 2024-09-20 01:27:54 UTC


README

Srouter是一个简单、开源的PHP路由器。它非常小巧(约150行代码),速度快,并且拥有一些优秀的注释源代码。这个类允许你将其直接扔进你的项目中,并立即开始使用。

安装

如果你有Composer,只需将Srouter作为项目依赖项包含在你的composer.json文件中。如果没有,只需下载.ZIP文件并将其解压到你的项目目录中。

require: {
    "xiaozhuangyuan/srouter": "dev-master"
}

示例

首先,使用Srouter命名空间

use \Xiaozhuangyuan\Srouter\Srouter;

Srouter不是一个对象,因此你可以直接对该类进行操作。以下是一个简单的Hello World示例

Srouter::get('/', function() {
  echo 'Hello world!';
});

Srouter::dispatch();

Srouter还支持lambda URI,例如

Srouter::get('/(:any)', function($slug) {
  echo 'The slug is: ' . $slug;
});

Srouter::dispatch();

你还可以在Srouter中为HTTP方法发起请求,因此你也可以这样做

Srouter::get('/', function() {
  echo 'I'm a GET request!';
});

Srouter::post('/', function() {
  echo 'I'm a POST request!';
});

Srouter::map(['get','post'],'/', function() {
  echo 'I can be both a GET and a POST request!';
});

Srouter::any('/', function() {
  echo 'I can be any request!';
});

Srouter::dispatch();

最后,如果没有为某个位置定义路由,你可以让Srouter运行一个自定义回调,如下所示

Srouter::error(function() {
  echo '404 :: Not Found';
});

如果你没有指定错误回调,Srouter将直接输出404

为了让服务器知道URI没有指向实际的文件,你可能需要使用以下示例配置文件之一。

示例:将请求传递到控制器而不是闭包

可以传递命名空间路径到控制器,而不是闭包

在这个演示中,假设我有一个名为controllers的文件夹,里面有一个Test.php文件

index.php

require('vendor/autoload.php');

use Xiaozhuangyuan\Srouter\Srouter;

Srouter::get('/', 'controllers\Test@index');
Srouter::get('page', 'controllers\Test@page');
Srouter::get('view/(:num)', 'controllers\Test@view');

Srouter::dispatch();

Test.php

<?php
namespace controllers;

class Test {

    public function index()
    {
        echo 'home';
    }

    public function page()
    {
        echo 'page';
    }

    public function view($id)
    {
        echo $id;
    }

}

高级使用

index.php

require('vendor/autoload.php');

use Xiaozhuangyuan\Srouter\Router;

$router = new Router();

$router->group('/v1', function () use ($router) {

    $router->group('', function () use($router) {
        $router->get('', 'app\controllers\Demo@index', ['Check']);
    });

    $router->any('/nasad', 'app\controllers\Demo@index');

    $router->map(['get', 'post'], '/page', 'app\controllers\Demo@page');

    $router->get('/view/(:num)', 'app\controllers\Demo@view');

    $router->get('/pi', 'app\controllers\Demo@pi');

    $router->get('/db', 'app\controllers\Demo@db');

    $router->get('/log', 'app\controllers\Demo@log');

    $router->get('/cache', 'app\controllers\Demo@cache');

    $router->group('/user', function ($router) {
        $router->get('/info', 'app\controllers\Demo@index');

        $router->group('/user122', function ($router) {
            $router->get('/info', 'app\controllers\Demo@index');
        }, ['PK']);
    }, ['Check']);

    $router->get('/qwwasas', 'app\controllers\Sms@qwqw');

}, ['Auth']);

$router->dispatch();

Test.php

<?php
namespace app\controllers;

class Test {

    public function index()
    {
        echo 'home';
    }

    public function page()
    {
        echo 'page';
    }

    public function view($id)
    {
        echo $id;
    }

}

中间件

Auth.php

<?php
namespace app\middleware;
use Xiaozhuangyuan\Srouter\Middleware;

class Auth implements Middleware
{
    public function handle()
    {

        return true;

    }
}

这是通过composer安装Srouter的示例。

composer.json

{
   "require": {
        "xiaozhuangyuan/srouter": "dev-master"
    },
    "autoload": {
        "psr-4": {
            "" : ""
        }
    }
}

.htaccess(Apache)

Options +FollowSymlinks -Multiviews
RewriteEngine On

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^.*$ index.php [L]

Nginx

location / {
    if (!-e $request_filename) {
        rewrite  ^.*$  /index.php last;
        break;
    }
}