一次框架性能的比较,引起了我对搭建web框架的兴趣 (6)

在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() // ); // } // 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'; $app = require_once __DIR__.'/core/container.php'; # add $response = $app->get('phoenix') # 通过别名获取 ->handle( Symfony\Component\HttpFoundation\Request::createFromGlobals() ); $response->send();

访问 ?name=SexyPhoenix, 显示正常。

到这里,框架的整个基本设计就结束了,之后需要什么功能,就可以自己用composer安装组件了,composer还是很好用的。

同学们如果有什么疑问的,欢迎在评论一起交流,ヾ(●´∀`●) 。

最后,附一份最终代码 phoenix web 架构。

参考Symfony官网 - 创建你自己的框架

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxwyx.html