gpt4 book ai didi

php - 我怎样才能用PHP做一个路由器?

转载 作者:可可西里 更新时间:2023-11-01 14:01:00 25 4
gpt4 key购买 nike

我目前正在为我的一个项目开发路由器,我需要执行以下操作:

例如,假设我们有这样一组路由:

$routes = [
'blog/posts' => 'Path/To/Module/Blog@posts',
'blog/view/{params} => 'Path/To/Module/Blog@view',
'api/blog/create/{params}' => 'Path/To/Module/API/Blog@create'
];

然后,如果我们通过以下网址传递此 URL:http://localhost/blog/posts,它将调度 blog/posts 路由 - 没问题。

现在,当谈到需要参数的路由时,我所需要的只是一种实现传递参数能力的方法,(即 http://localhost/blog/posts/param1/param2/param3 以及在 api 前添加以创建 http://localhost/api/blog/create/ 以定位 API 调用的能力,但我很困惑。

最佳答案

这是一些基本的东西,目前路由可以有一个模式,如果应用程序路径以该模式开头,那么它就是一个匹配项。路径的其余部分变成了参数。

<?php
class Route
{
public $name;
public $pattern;
public $class;
public $method;
public $params;
}

class Router
{
public $routes;

public function __construct(array $routes)
{
$this->routes = $routes;
}

public function resolve($app_path)
{
$matched = false;
foreach($this->routes as $route) {
if(strpos($app_path, $route->pattern) === 0) {
$matched = true;
break;
}
}

if(! $matched) throw new Exception('Could not match route.');

$param_str = str_replace($route->pattern, '', $app_path);
$params = explode('/', trim($param_str, '/'));
$params = array_filter($params);

$match = clone($route);
$match->params = $params;

return $match;
}
}

class Controller
{
public function action()
{
var_dump(func_get_args());
}
}

$route = new Route;
$route->name = 'blog-posts';
$route->pattern = '/blog/posts/';
$route->class = 'Controller';
$route->method = 'action';

$router = new Router(array($route));
$match = $router->resolve('/blog/posts/foo/bar');

// Dispatch
if($match) {
call_user_func_array(array(new $match->class, $match->method), $match->params);
}

输出:

array (size=2)
0 => string 'foo' (length=3)
1 => string 'bar' (length=3)

关于php - 我怎样才能用PHP做一个路由器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35590193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com