使用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_contains($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/loginphpapi.com/user/logout

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!