天天看點

基于symfony架構HttpKernel元件實作架構進一步的優化1.利用執行個體化實作2.利用事件監聽實作

書接上文:https://blog.csdn.net/weixin_40292098/article/details/111041735

目錄

1.利用執行個體化實作

1.1 修改controller

1.2 修改入口檔案

1.3 請求

2.利用事件監聽實作

2.1修改入口檔案

2.2 請求

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 請求

基于symfony架構HttpKernel元件實作架構進一步的優化1.利用執行個體化實作2.利用事件監聽實作

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);

           

2.2 請求

基于symfony架構HttpKernel元件實作架構進一步的優化1.利用執行個體化實作2.利用事件監聽實作