code

项目地址:https://github.com/ayuayue/php-frame

制作一个PHP简易框架(一)–准备工作

制作一个PHP简易框架(二)– 引入容器

制作一个PHP简易框架(三)– 信息调试

制作一个PHP简易框架(四)– 路由系统

制作一个PHP简易框架(五)– 响应

制作一个PHP简易框架(六)– 视图模板

制作一个PHP简易框架(七)– 路由及路径优化

制作一个PHP简易框架(八)– 配置中心

制作一个PHP简易框架(九)– ORM

制作一个PHP简易框架(十)– Session and Cookie


路由系统

对于一个 web 服务来说,路由系统基本是所有 php 开发框架中十分基本也是必需的功能了。

安装

包地址:https://github.com/thephpleague/route, 该包的作者也是前面 container 包的作者。

1
2
3
composer require league/route
composer require laminas/laminas-diactoros
composer require laminas/laminas-httphandlerrunner

使用

安装完毕后进行测试。新建一个 route.php ,在 bootstrap/core/ 下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# bootstrap/core/route.php
<?php

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

$request = Laminas\Diactoros\ServerRequestFactory::fromGlobals(
    $_SERVER,
    $_GET,
    $_POST,
    $_COOKIE,
    $_FILES
);

$router = new League\Route\Router;

// map a route
$router->map('GET', '/', function (ServerRequestInterface $request): ResponseInterface {
    $response = new Laminas\Diactoros\Response;
    $response->getBody()->write('<h1>Hello, World!</h1>');
    return $response;
});

$response = $router->dispatch($request);

// send the response to the browser
(new Laminas\HttpHandlerRunner\Emitter\SapiEmitter)->emit($response);

可以看到 $request 变量中包含了一些全局变量,以后我们就可以直接从 $request 变量中,使用面向对象的方式查看请求的信息。

现在打开项目的首页,会返回一个 Hello World 在浏览器上。说明路由运行成功。

整合路由文件

新建一个 routes 目录,用来保存所有的路由文件,并创建 web.php 来保存 web 服务的路由。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# route/web.php
<?php

// map a route
$router->get('/', function ($request) {
    $response = new Laminas\Diactoros\Response;
    $response->getBody()->write('<h1>Hello, World!</h1>');
    return $response;
});
$router->get('/home', function ($request) {
    $response = new Laminas\Diactoros\Response;
    $response->getBody()->write('<h1>Hello, Home Page!</h1>');
    return $response;
});

修改原来的 route.php 文件,将所有定义的路由引入进去。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# bootstrap/core/route.php
<?php

include 'path/to/vendor/autoload.php';

$request = Laminas\Diactoros\ServerRequestFactory::fromGlobals(
    $_SERVER,
    $_GET,
    $_POST,
    $_COOKIE,
    $_FILES
);

$router = new League\Route\Router;

require_once __DIR__ . '/../../routes/web.php';

修改 index.php 将发送响应的逻辑放到最后。

1
2
3
4
5
6
7
8
9
# public/index.php
<?php

require_once __DIR__ . '/../bootstrap/app.php';

$response = $router->dispatch($request);

// send the response to the browser
(new Laminas\HttpHandlerRunner\Emitter\SapiEmitter)->emit($response);

打开首页输出 Hello, World! ,进入 /home 路由输出 Hello, Home Page! ,则说明路由映射成功。