TOP

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

ate ]; return $this->render('dashboard.php', $data); }

访问页面,正常显示。

八、剥离核心代码

框架的基本架构已经搭建完成,但此时的核心代码都写在了index.php里面,另写项目的话,无法复用此架构,接下来剥离出核心代码。

在phoenix项目下创建Core文件夹,继续创建Phoenix.php文件,移入核心代码并优化。

# Phoenix.php

namespace Core; #注意此命名空间需要注册

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;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;

class Phoenix {

    public $request;

    public $routeMap;

    public function handle(Request $request)
    {
        $this->request = $request;

        try {

            //url map
            $this->getRouteMap();

            $this->setRequestRoute();

            $controller = (new ControllerResolver())->getController($request);
            $arguments = (new ArgumentResolver())->getArguments($request, $controller);

            return call_user_func_array($controller, $arguments);   

        } catch(\Exception $e) {

            return new Response('File Not Found', 404);
        }
    }

    public function setRequestRoute()
    {
        $this->request->attributes->add($this->routeMap->match($this->request->getPathInfo()));
    }

    public function getRouteMap()
    {    
        $this->routeMap = new UrlMatcher(
            $this->getCollection(), 
            (new RequestContext())->fromRequest($this->request)
        );
    }

    public function getCollection()
    {
        return (
            new YamlFileLoader(
               new FileLocator(array(getcwd()))
            )
        )->load('routes/web.yaml');
    }
}

更新index.php代码。

ini_set('display_errors', 1);
error_reporting(-1);

require_once __DIR__.'/vendor/autoload.php';

$kernel = new Core\Phoenix();

$response = $kernel->handle(
    Symfony\Component\HttpFoundation\Request::createFromGlobals()
);

$response->send();

注册Core命名空间,打开composer.json文件。

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

刷新页面,显示正常。

九、优化框架

在前面用到HttpKernel组件时,为什么介绍它是框架的内核呢?

因为HttpKernel里面有个很重要的概念,派遣事件,给注册过的不同监听器监听

是用Mediator模式设计的,这种模式带来的好处,就是使框架的扩展性得到极大的提高。

在请求到响应之前设计了八种钩子,方便后期扩展,详情看下面的链接。

KernelEvents钩子介绍

同时,也可以用另一种监听事件的方式,通过一个event subscriber(事件订阅器),向派遣器精确通报它要订阅哪些事件。下面对路由优化时,会用到这。

EventDispatcher组件使用说明

HttpKernel组件的功能仅止于此吗? 当然不,它里面有一个很重要的类“HttpKernel类”,将框架的核心Core/Phoenix.php的程序都实现了

只要phoenix框架核心类Phoenix继承HttpKernel,并调用它的构造方法就行了。

下面来改造Core/Phoenix.php代码。

# Phoenix.php
namespace Core;

use Symfony\Component\HttpFoundation\RequestStack; # add
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;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\EventDispatcher\EventDispatcher; # add
use Symfony\Component\HttpKernel\HttpKernel; # add 
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentReso  
		

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


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

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

评论

验 证 码:
表  情:
内  容: