我正在编写自己的项目并想使用一些 Symfony 组件。我正在为我的项目实施 Sf 路由器,但我不明白如何在路由器中调用控制器。
对于前我有一个类:
<?php
namespace App;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\HttpFoundation as Http;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
class AppRouter
{
public function match() {
$context = new RequestContext();
$request = Http\Request::createFromGlobals();
$context->fromRequest($request);
$matcher = new UrlMatcher($this->getRoutes(), $context);
return $matcher->matchRequest($request);
}
private function getRoutes() {
$fileLocator = new FileLocator([__DIR__ . '/../config']);
$loader = new YamlFileLoader($fileLocator);
$routes = $loader->load('routes.yml');
return $routes;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一些定义的路由,routes.yml
所以如果我尝试去注册路由match()
方法返回给我一个如下所示的数组:
[
"_controller" => "Controller\\MyController::testAction"
"_route" => "test"
]
Run Code Online (Sandbox Code Playgroud)
那么,我现在如何调用控制器来获取匹配的 URL?我正在阅读文档,但不明白我应该怎么做。
这是一个比它看起来更复杂的问题。
最简单的方法是简单地分解 _controller 字符串,新建控制器并调用操作。
// Untested but I think the syntax is correct
$matched = $router->match();
$parts = explode(':',$matched['_controller']);
$controller = new $parts[0]();
$controller->$parts[2]();
Run Code Online (Sandbox Code Playgroud)
当然,还有大量的错误检查需要添加。
我说它可能更复杂的原因是实际上你可以做的还有很多。看一下 HTTP 组件。HttpKernel::handle($request) 使用 ControllerResolver 类来创建控制器以及使用 ArgumentResolver 来处理控制器的许多参数。好玩的东西。
创建你自己的框架是一个很好的资源。
相当新的 Symfony Flex 方法为您提供了一个也值得研究的基本框架。
归档时间: |
|
查看次数: |
1865 次 |
最近记录: |