書接上文: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 請求
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);