当前位置:首页 > PHP

php路由实现

2026-02-14 22:58:14PHP

路由的基本概念

路由(Routing)在PHP中指的是将HTTP请求映射到特定的处理逻辑或控制器方法的过程。现代PHP框架(如Laravel、Symfony)通常内置路由功能,但也可以手动实现。

原生PHP实现路由

通过解析URL和请求方法,手动分发请求到对应的处理逻辑。

// 获取当前请求的URI和请求方法
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$requestMethod = $_SERVER['REQUEST_METHOD'];

// 定义路由表
$routes = [
    'GET' => [
        '/' => 'homeController',
        '/about' => 'aboutController'
    ],
    'POST' => [
        '/submit' => 'submitController'
    ]
];

// 路由匹配
if (isset($routes[$requestMethod][$requestUri])) {
    call_user_func($routes[$requestMethod][$requestUri]);
} else {
    header("HTTP/1.0 404 Not Found");
    echo '404 Not Found';
}

使用FastRoute库

FastRoute是一个轻量级的路由库,适合在非框架项目中使用。

require 'vendor/autoload.php';

$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/', 'homeController');
    $r->addRoute('GET', '/about', 'aboutController');
    $r->addRoute('POST', '/submit', 'submitController');
});

$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];

$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        header("HTTP/1.0 404 Not Found");
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        header("HTTP/1.0 405 Method Not Allowed");
        break;
    case FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        call_user_func($handler, $vars);
        break;
}

Laravel框架的路由示例

Laravel提供了简洁的路由定义方式,支持多种HTTP方法、路由参数和中间件。

// web.php
Route::get('/', function () {
    return view('welcome');
});

Route::get('/about', 'AboutController@index');

Route::post('/submit', 'SubmitController@store');

// 带参数的路由
Route::get('/user/{id}', function ($id) {
    return 'User '.$id;
});

// 路由分组和中间件
Route::middleware(['auth'])->group(function () {
    Route::get('/profile', 'ProfileController@index');
    Route::get('/settings', 'SettingsController@index');
});

Symfony框架的路由示例

Symfony使用注解或YAML/XML文件定义路由。

// src/Controller/DefaultController.php
use Symfony\Component\Routing\Annotation\Route;

class DefaultController
{
    /
     * @Route("/", name="home")
     */
    public function index()
    {
        // ...
    }

    /
     * @Route("/about", name="about")
     */
    public function about()
    {
        // ...
    }
}

路由缓存优化

对于生产环境,路由缓存可以提升性能。Laravel和Symfony都支持路由缓存。

# Laravel路由缓存
php artisan route:cache

# Symfony路由缓存
php bin/console cache:clear

动态路由参数处理

动态路由参数可以通过正则表达式约束或类型提示。

// Laravel带约束的路由
Route::get('/user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

// Symfony类型提示路由
/
 * @Route("/user/{id<\d+>}", name="user_show")
 */
public function show(int $id)
{
    // ...
}

RESTful资源路由

Laravel的资源路由可以快速生成CRUD路由。

Route::resource('posts', 'PostController');

这将自动生成以下路由:

php路由实现

  • GET /posts -> index
  • GET /posts/create -> create
  • POST /posts -> store
  • GET /posts/{post} -> show
  • GET /posts/{post}/edit -> edit
  • PUT/PATCH /posts/{post} -> update
  • DELETE /posts/{post} -> destroy

标签: 路由php
分享给朋友:

相关文章

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…

php实现注册登陆

php实现注册登陆

PHP 注册功能实现 创建数据库表结构(MySQL示例): CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…