使用Composer从零开发一个简单的restful框架(07)-控制器
控制器基类
新建core/Controller.php
,内容如下
<?php
namespace core;
class Controller {
public function __construct(string $method, Request $request, Response $response) {
$this->{$method}($request, $response);
}
}
编辑core/Router.php
,修改dispatch
方法
private function dispatch(Route $route, string $method, string $uri, Request $request, Response $response): void {
$group = $route->getGroup();
// 分组不会有命名参数, 不包含直接返回
if (!str_starts_with($uri, $group)) return;
$uri = substr($uri, strlen($group));
slash_add_head($uri);
$routes = $route->getRoutes();
foreach ($routes as $item) {
if ($item instanceof RouteItem) {
if ($method == $item->method && $uri == $item->uri) {
// 全匹配路由
$this->start($item, $request, $response);
return;
} else if ($method == $item->method && preg_match_all('(:\w+)', $item->uri, $names)) {
// 参数路由
$pattern = preg_replace('(:\w+)', '(\w+)', $item->uri);
if (preg_match('#^' . $pattern . '$#', $uri, $matches)) {
$params = $this->mergeParams($names[0], $matches);
$request->setParams($params);
$this->start($item, $request, $response);
return;
}
}
} else {
$this->dispatch($item, $method, $uri, $request, $response);
}
}
}
private function start(RouteItem $item, Request $request, Response $response): void {
if ($item->cb instanceof \Closure) {
($item->cb)($request, $response);
} else {
[$controller, $method] = explode('@', $item->cb);
$module = APP_CONTROLLER_NAMESPACE . "\\$controller";
new $module($method, $request, $response);
}
}
应用程序添加控制器
新建 app/controller/User.php
,内容如下
<?php
namespace app\controller;
use core\Controller;
use core\Request;
use core\Response;
class User extends Controller {
public function login(Request $request, Response $response): void {
$response->text('from /user/login');
}
public function logout(Request $request, Response $response): void {
$response->text('from /user/logout');
}
}
新建route/user.php
,内容如下
<?php
use core\Router;
/** @var Router $router */
$router->group('user', function(Router $router) {
$router->get('login', 'User@login');
$router->get('logout', 'User@logout');
});
测试
浏览器分别访问 phpapi.com/user/login 和 phpapi.com/user/logout
本作品采用《CC 协议》,转载必须注明作者和本文链接