基於symfony框架HttpKernel元件實現框架進一步的優化
阿新 • • 發佈:2020-12-17
書接上文:https://blog.csdn.net/weixin_40292098/article/details/111041735
目錄
1.利用例項化實現
1.1 修改controller
<?php namespace App\controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class MyController { /** * @param int $id * @param Request $requset * @return Response */ public function index($id = 0,Request $requset){ $re = $requset->attributes->get('id',0); return new Response('ID = ' . $id . '<br> re_id = '.$re); } }
1.2 修改入口檔案
<?php //載入composer include __DIR__ . DIRECTORY_SEPARATOR . "vendor" . DIRECTORY_SEPARATOR . "autoload.php"; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\Matcher\UrlMatcher; use Symfony\Component\HttpFoundation\Request; use \Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Controller\ControllerResolver; use Symfony\Component\HttpKernel\Controller\ArgumentResolver; use Symfony\Component\Routing\Exception\ResourceNotFoundException; //新增自動載入 function loadClass($class_name){ $fan_gang = stripos($class_name,'\\'); $is_app = substr($class_name,0,$fan_gang); //載入應用目錄 if($is_app === 'App'){ include __DIR__.DIRECTORY_SEPARATOR. $class_name.'.php'; } return; } spl_autoload_register("loadClass"); //定義路由 $route = new Route('/home/{id}', array( 'id' => null, '_controller' => 'App\controller\MyController::index', )); //var_dump($route);die; $request = Request::createFromGlobals(); //dd($request); //載入路由 $routes = new RouteCollection(); $routes->add('route_name',$route); $context = new RequestContext(); $matcher = new UrlMatcher($routes,$context); #######new################## //修改路由解析 $controllerResolver = new ControllerResolver(); $arguments = new ArgumentResolver(); try { $request->attributes->add($matcher->match($request->getPathInfo())); /** * 獲取控制器 * 利用 ControllerResolver 替換以下內容 * $controller = $info['controller']; * $class_action = stripos($controller,'::'); * $class = substr($controller,0,$class_action); * $action = substr($controller,$class_action+2); */ $controller = $controllerResolver->getController($request); // $class = new $controller[0](); // $action= $controller[1]; // var_dump($class->$action());die; // var_dump($controller);die(); /** * 獲取當前方法注入引數 */ $arguments = $arguments->getArguments($request, $controller); $response = call_user_func_array($controller, $arguments); }catch (ResourceNotFoundException $exception){ $response = new Response('Not Fount',404); }catch (Exception $e) { $response = new Response('An error occurred', 500); } $response->send();//釋出
1.3 請求
2.利用事件監聽實現
2.1修改入口檔案
<?php //載入composer include __DIR__ . DIRECTORY_SEPARATOR . "vendor" . DIRECTORY_SEPARATOR . "autoload.php"; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpKernel\Controller\ArgumentResolver; use Symfony\Component\HttpKernel\Controller\ControllerResolver; use Symfony\Component\HttpKernel\HttpKernel; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\Matcher\UrlMatcher; use Symfony\Component\Routing\RequestContext; use Symfony\Component\HttpKernel\EventListener\RouterListener; //新增自動載入 function loadClass($class_name){ $fan_gang = stripos($class_name,'\\'); $is_app = substr($class_name,0,$fan_gang); //載入應用目錄 if($is_app === 'App'){ include __DIR__.DIRECTORY_SEPARATOR. $class_name.'.php'; } return; } spl_autoload_register("loadClass"); $routes = new RouteCollection(); $routes->add('hello', new Route('/hello/{name}', [ '_controller' => function (Request $request) { return new Response( sprintf("Hello %s", $request->get('name')) ); } ] )); $request = Request::createFromGlobals(); $matcher = new UrlMatcher($routes, new RequestContext()); $dispatcher = new EventDispatcher(); //訂閱 $dispatcher->addSubscriber(new RouterListener($matcher, new RequestStack())); $controllerResolver = new ControllerResolver(); $argumentResolver = new ArgumentResolver(); $kernel = new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response);