TOP

一次框架性能的比较,引起了我对搭建web框架的兴趣(三)
2019-12-18 11:19:20 】 浏览:375次 本网站的内容取自网络,仅供学习参考之用,绝无侵犯任何人知识产权之意。如有侵犯请您及时与本人取得联系,万分感谢。
Tags:一次 框架 性能 比较 引起 搭建 web 兴趣

DIR__.'/vendor/autoload.php'; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Loader\YamlFileLoader; use Symfony\Component\Config\FileLocator; use Symfony\Component\Routing\RequestContext; # add use Symfony\Component\Routing\Matcher\UrlMatcher; # add $request = Request::createFromGlobals(); $fileLoader = new YamlFileLoader(new FileLocator(array(__DIR__))); $collection = $fileLoader->load('routes/web.yaml'); #解析url $context = new RequestContext(); # add $context->fromRequest($request); # add #初始化UrlMatcher $matcher = new UrlMatcher($collection, $context); # add #url和路由配置映射 $route = $matcher->match($request->getPathInfo()) # add $name = $request->get('name', 'World'); $response = new Response(); $response->setContent('<b>Hello '.$name.'</b>'); $response->send();

继续分析。

$context = new RequestContext();
$context->fromRequest($request);

context对象主要就是对url进行解析。现在的域名:http://dev.phoenix.goods/dashboard

6

既然解析出url的参数,就要用解析出的参数和配置中的路由做精准关联了,初始化matcher,传入路由配置和url对象。

7

得到url和配置中的路由的映射。

$route = $matcher->match($request->getPathInfo());

8

五、控制器处理相应功能(C)

在路由处理中,框架已经得到了路由和控制器的关联关系。下面就要执行相应的控制器(上面的_controller值)。

首先,在phoenix项目下,创建app/Http/Controllers/DashboardController.php(仿造Laravel的目录结构)。

# DashboardController.php
namespace App\Http\Controllers; # 注意这里App命名空间,自己定义,并没有注册到autoload

class DashboardController{

    public function index()
    {
        echo 'Hello SexyPhoenix';
    }
}

App命名空间是框架定义的,需要注册后,才能用,打开项目的composer.json文件。

# composer.json

"autoload": {
    "psr-4": {
        "App\\": "app/"
    }
}
composer dump-autoload # 更新命名空间

到这里,控制器的准备工作就做完了,接下来的问题就是如果利用得到的路由和控制器的映射关系去执行控制器,也就是下面的代码。

App\Http\Controllers\DashboardController::index

其实也很简单,就是用"::"分隔,得到两个值,一个是类名,一个是方法名,再用php的call_user_func去执行。

但自己去写可能过去粗暴,可用性低,在执行前,要先判断DashboardController类是否存在,index方法是否存在,index方法的权限,是否是公共方法,以及各种参数等等,

自己去写的话,会很麻烦,为了方便,继续用symfony的组件。

composer require symfony/http-kernel

http-kernel组件,是框架的内核,很重要的组件,它提供了各种钩子,及其方便框架扩展,也提供了控制器及其参数的“解析器”(这里需要了解下php的反射机制)。

更新index.php代码。

# index.php
......
use Symfony\Component\HttpKernel\Controller\ControllerResolver; # add
use Symfony\Component\HttpKernel\Controller\ArgumentResolver; # add

......

$route = $matcher->match($request->getPathInfo());
$request->attributes->add($route); # add 将路由映射关系写入request对象的附加属性中。

$controller = (new ControllerResolver())->getController($request); # add 处理控制器
$arguments = (new ArgumentResolver())->getArguments($request, $controller); # add 处理方法的参数

$response = call_user_func_array($controller, $arguments);

$response->send();

更新DashboardController.php代码。

namespace App\Http\Controllers;

use Symfony\Component\HttpFoundation\Request; # add
use Symfony\Component\HttpFoundation\Response;# add

class DashboardController{

    public function index(Request $request)
    {   
        $name = $request->get('name', 'world'); # add

        return new Response('Hello '.$name); # add
    }
}

用http-kernel好处就是可以处理各种问题,比如Request作为参数注入。

访问 http://dev.phoenix.goods/dashboard?name=SexyPhoenix, 得到 Hello SexyPhoenix。

请关注公众号获取更多资料


一次框架性能的比较,引起了我对搭建web框架的兴趣(三) https://www.cppentry.com/bencandy.php?fid=97&id=272915

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计模式随笔 下一篇k8s~跨namespace的service相互访问

评论

验 证 码:
表  情:
内  容: