快捷搜索:  汽车  科技

php框架设计入门(搭建个人使用PHP框架)

php框架设计入门(搭建个人使用PHP框架)由此,引入路由组件成功。​​​​注:如果想扩展更多的使用方法,请访问文章开始处的github地址,查看更多使用方法。<?php /** * Created by PhpStorm. * User: Administrator * Date: 2021/6/13 * Time: 15:58 */ // 不分组格式 return [ ['GET' '/api/hello' [\App\Controller\TestController::class 'index']] ];<?php /** * Created by PhpStorm. * User: Administrator * Date: 2021/6/13 * Time: 15:58 */ // 分组格式 return [ 'pr

GitHub地址:https://github.com/nikic/FastRoute/tree/v1.3.0

引入nikic/fast-route包

# 本次引入的是1.3.0版本的composer包 composer require nikic/fast-route v1.3.0编写路由配置加载方法

<?php /** * Created by PhpStorm. * User: Administrator * Date: 2021/6/14 * Time: 0:35 */ namespace App\Lib; use App\Exception\MethodNotAllowedException; use App\Exception\RouteNotFoundException; use FastRoute\Dispatcher; use FastRoute\RouteCollector; use function FastRoute\simpleDispatcher; class Route { public static function load() { // 获取已配置的路由列表 $routeFiles = glob(ROUTE_PATH.DIRECTORY_SEPARATOR.'*.php'); foreach ($routeFiles as $file) { $routeFileList[] = require_once($file); } // 加载所有路由文件配置的路由 $dispatcher = self::make_dispatcher($routeFileList); // Fetch method and URI from somewhere $httpMethod = $_SERVER['REQUEST_METHOD']; $uri = $_SERVER['REQUEST_URI']; // Strip query string (?foo=bar) and decode URI if (false !== $pos = strpos($uri '?')) { $uri = substr($uri 0 $pos); } $uri = rawurldecode($uri); // 路由调度 $routeInfo = $dispatcher->dispatch($httpMethod $uri); switch ($routeInfo[0]) { case Dispatcher::NOT_FOUND: // 找不到请求方法 // ... 404 Not Found throw new RouteNotFoundException("请求方法不存在:{$uri}"); break; case Dispatcher::METHOD_NOT_ALLOWED: // 请求类型错误 $allowedMethods = $routeInfo[1]; // ... 405 Method Not Allowed throw new MethodNotAllowedException("请求类型错误({$httpMethod}) 当前方法允许请求类型({$allowedMethods[0]})"); break; case Dispatcher::FOUND: // 找到请求方法:调用方法即可 $handler = $routeInfo[1]; $vars = $routeInfo[2]; call_user_func([new $handler[0] $handler[1]] $vars); break; } } private static function make_dispatcher($routeFileList) { return simpleDispatcher(function(RouteCollector $router) use($routeFileList) { foreach ($routeFileList as $routeFile) { if (isset($routeFile['prefix'])) { $routers = $routeFile[0]; $router->addGroup($routeFile['prefix'] function(RouteCollector $router) use($routers) { if ($routers) { foreach ($routers as $routeItem) { $router->addRoute(strtoupper($routeItem[0]) $routeItem[1] $routeItem[2]); } unset($routeItem); } }); } else { if ($routeFile) { foreach ($routeFile as $routeItem) { $router->addRoute(strtoupper($routeItem[0]) $routeItem[1] $routeItem[2]); } unset($routeItem); } } } unset($routeFile); }); } }

涉及到的exception类写法

<?php /** * Created by PhpStorm. * User: Administrator * Date: 2021/6/14 * Time: 0:05 */ namespace App\Exception; use Throwable; class MethodNotAllowedException extends \Exception { public function __construct($message = "" $code = 0 Throwable $previous = null) { parent::__construct($message $code $previous); } }

创建编写功能路由文件,(演示:route/web.php、route/api.php)

php框架设计入门(搭建个人使用PHP框架)(1)

文件的编写格式(可以对Route文件的make_dispatcher方法实现自定义)

<?php /** * Created by PhpStorm. * User: Administrator * Date: 2021/6/13 * Time: 15:58 */ // 不分组格式 return [ ['GET' '/api/hello' [\App\Controller\TestController::class 'index']] ];

<?php /** * Created by PhpStorm. * User: Administrator * Date: 2021/6/13 * Time: 15:58 */ // 分组格式 return [ 'prefix' => '/' [ ['get' 'users' [\App\Controller\TestController::class 'index']] ] ];测试

测试控制器

<?php /** * Created by PhpStorm. * User: Administrator * Date: 2021/6/13 * Time: 16:04 */ namespace App\Controller; class TestController extends Controller { public function index() { echo 1111; } }

路由访问

php框架设计入门(搭建个人使用PHP框架)(2)

php框架设计入门(搭建个人使用PHP框架)(3)

由此,引入路由组件成功。​​​​
注:如果想扩展更多的使用方法,请访问文章开始处的github地址,查看更多使用方法。

猜您喜欢: