TOP

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

lver; use Symfony\Component\HttpKernel\EventListener\RouterListener; class Phoenix extends HttpKernel{ # 继承HttpKernel public function __construct() { $matcher = new UrlMatcher($this->getCollection(), new RequestContext()); $requestStack = new RequestStack(); $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new RouterListener($matcher, $requestStack)); # 订阅路由 # HttpKernel的构造函数,可以点下面的链接进去看看 parent::__construct( $dispatcher, new ControllerResolver(), $requestStack, new ArgumentResolver() ); } public function getCollection() { return ( new YamlFileLoader( new FileLocator(array(getcwd())) ) )->load('routes/web.yaml'); } }

HttpKernel类

index.php的代码不用变,HttpKernel类里面也有handle方法。建议同学们看看HttpKernel类的源码。

十、依赖注入(Dependency Injection)

Phoenix类继承了HttpKernel,是整个架构的核心,在框架里面定义了“路由监听”,但如果框架不仅仅要对路由进行监听,还要对response阶段进行监听呢?是不是继续修改Phoenix类呢?

这样的设计对于框架来说,是绝对不友好的。那有没有方法解决呢?

当然有,可以通过在外面注入对象,框架通过type检测,自动引入相关对象。

首先下载Symfony的DependencyInjection组件。

composer require symfony/dependency-injection

在core文件夹下创建container.php文件

# container.php
namespace Core;

use Symfony\Component\DependencyInjection;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;

$app = new ContainerBuilder();
$app->register('context', 'Symfony\Component\Routing\RequestContext');
$app->register('matcher', 'Symfony\Component\Routing\Matcher\UrlMatcher')
    ->setArguments(array(getCollection(), new Reference('context')));

$app->register('request_stack', 'Symfony\Component\HttpFoundation\RequestStack');
$app->register('controller_resolver', 'Symfony\Component\HttpKernel\Controller\ControllerResolver');
$app->register('argument_resolver', 'Symfony\Component\HttpKernel\Controller\ArgumentResolver');
    
$app->register('listener.router', 'Symfony\Component\HttpKernel\EventListener\RouterListener') # 路由监听
    ->setArguments(array(new Reference('matcher'), new Reference('request_stack')));

$app->register('dispatcher', 'Symfony\Component\EventDispatcher\EventDispatcher')
    ->addMethodCall('addSubscriber', array(new Reference('listener.router')));            

$app->register('phoenix', 'Core\Phoenix')
->setArguments(array(
    new Reference('dispatcher'),
    new Reference('controller_resolver'),
    new Reference('request_stack'),
    new Reference('argument_resolver'),
));


return $app;

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

别名和对象一一对应,后面可以通过别名获取对象。

去掉core/phoenix.php里面的代码。

namespace Core;

use Symfony\Component\HttpKernel\HttpKernel;

class Phoenix extends HttpKernel{

    // public function __construct()
    // {
    //     $matcher      = new UrlMatcher($this->getCollection(), new RequestContext());
    //     $requestStack = new RequestStack();

    //     $dispatcher   = new EventDispatcher();
    //     $dispatcher->addSubscriber(new RouterListener($matcher,  $requestStack));

    //     parent::__construct(

    //         $dispatcher,
    //         new ControllerResolver(),
    //         $requestStack,
    //         new ArgumentResolver  
		

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


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

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

评论

验 证 码:
表  情:
内  容: