使用 Symfony 路由的 MVC 路由
MVC routing using Symfony routing
使用symfony/routing,需要为MVC应用实现路由。禁止使用整个 Symfony,只能使用库。
控制器 class:
namespace App\Controllers;
use App\Core\Controller;
class IndexController extends Controller {
public function IndexAction(){
$this->View->render('index');
}
}
查看class:
namespace App\Core;
namespace App\Core;
class View{
public function render($viewName) {
$viewAry = explode('/', $viewName);
$viewString = implode(DS, $viewAry);
if(file_exists('View/site' . $viewString . '.php')) {
require 'View/site' . $viewString . '.php';
} else {
die('The view \"' . $viewName . '\" does not exist.');
}
}
}
和Index.php本身,一切都从这里开始:
use App\Controllers\IndexController;
use App\Core\Routing;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
use App\Core\Application;
use Symfony\Component\Routing\Router;
require __DIR__ . '/vendor/autoload.php';
$collection = new RouteCollection();
$collection->add('index', new Route('/', array(
'_controller' => [IndexController::class, 'IndexAction']
)));
return $collection;
通过邮递员请求应用程序的结果,我什么也没得到,这是什么问题?
在您的前端控制器中,您只是在定义路由,但并未实际处理请求、将其与控制器匹配或调用它。
有一个关于这个主题的部分in the manual,它使用了更多的 symfony 组件,但可以提供帮助。
您必须直接从 PATH_INFO
确定请求的路由,而不是使用 HttpFoundation
组件,然后尝试将请求与路由匹配。
这是一个非常粗略的实现:
$collection = new RouteCollection();
$collection->add('index', new Route('/', array(
'_controller' => [IndexController::class, 'IndexAction']
)));
$matcher = new UrlMatcher($collection, new RequestContext());
// Matcher will throw an exception if no route found
$match = $matcher->match($_SERVER['PATH_INFO']);
// If the code reaches this point, a route was found, extract the corresponding controller
$controllerClass = $match['_controller'][0];
$controllerAction = $match['_controller'][1];
// Instance the controller
$controller = new $controllerClass();
// Execute it
call_user_func([$controller, $controllerAction]);
使用symfony/routing,需要为MVC应用实现路由。禁止使用整个 Symfony,只能使用库。 控制器 class:
namespace App\Controllers;
use App\Core\Controller;
class IndexController extends Controller {
public function IndexAction(){
$this->View->render('index');
}
}
查看class:
namespace App\Core;
namespace App\Core;
class View{
public function render($viewName) {
$viewAry = explode('/', $viewName);
$viewString = implode(DS, $viewAry);
if(file_exists('View/site' . $viewString . '.php')) {
require 'View/site' . $viewString . '.php';
} else {
die('The view \"' . $viewName . '\" does not exist.');
}
}
}
和Index.php本身,一切都从这里开始:
use App\Controllers\IndexController;
use App\Core\Routing;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
use App\Core\Application;
use Symfony\Component\Routing\Router;
require __DIR__ . '/vendor/autoload.php';
$collection = new RouteCollection();
$collection->add('index', new Route('/', array(
'_controller' => [IndexController::class, 'IndexAction']
)));
return $collection;
通过邮递员请求应用程序的结果,我什么也没得到,这是什么问题?
在您的前端控制器中,您只是在定义路由,但并未实际处理请求、将其与控制器匹配或调用它。
有一个关于这个主题的部分in the manual,它使用了更多的 symfony 组件,但可以提供帮助。
您必须直接从 PATH_INFO
确定请求的路由,而不是使用 HttpFoundation
组件,然后尝试将请求与路由匹配。
这是一个非常粗略的实现:
$collection = new RouteCollection();
$collection->add('index', new Route('/', array(
'_controller' => [IndexController::class, 'IndexAction']
)));
$matcher = new UrlMatcher($collection, new RequestContext());
// Matcher will throw an exception if no route found
$match = $matcher->match($_SERVER['PATH_INFO']);
// If the code reaches this point, a route was found, extract the corresponding controller
$controllerClass = $match['_controller'][0];
$controllerAction = $match['_controller'][1];
// Instance the controller
$controller = new $controllerClass();
// Execute it
call_user_func([$controller, $controllerAction]);