Symfony路由器呼叫控制器

时间:2018-03-07 13:17:36

标签: symfony

我正在编写自己的项目,并希望使用一些Symfony组件。 我正在为我的项目实现Sf Router,我不明白如何在路由器中调用控制器。

前者我有一个班级:

<?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;
    }
}

我在routes.yml中有一些已定义的路线,所以如果我尝试去注册路线match(),方法会向我返回如下数组:

[
  "_controller" => "Controller\\MyController::testAction"
  "_route" => "test"
]

那么,我现在如何调用匹配URL的控制器?我读了一份文档,但无法理解我该怎么做。

3 个答案:

答案 0 :(得分:4)

这可能是一个更为复杂的问题。

最简单的方法是简单地爆炸_controller字符串,新控制器并调用操作。

// Untested but I think the syntax is correct
$matched = $router->match();
$parts = explode(':',$matched['_controller']);
$controller = new $parts[0]();
$controller->$parts[2]();

当然要添加大量错误检查。

我说它可能更复杂的原因是你可以做的事实上更多。看一下HTTP组件。 HttpKernel :: handle($ request)使用ControllerResolver类创建控制器以及ArgumentResolver来处理许多控制器的参数。有趣的东西。

Create Your Own Framework是一个很好的资源。

相当新的Symfony Flex方法为您提供了一个值得研究的骨架框架。

答案 1 :(得分:0)

我的解决方案是下一个:

  1. 稍微更改一下我的routes.yml参数:没有类名只包含斜杠
  2. 使用call_user_func_array($this->controller, $this->parameters)

答案 2 :(得分:0)

HTTP内核处理到控制器的路由调用。您可以找到完整的文档here

控制器解析器和参数解析器将帮助您轻松地匹配到控制器方法的路由。这是一种简单而强大的方法,它可以使路由器在原有项目上启动并运行,而不必调用完全成熟的框架。

  

再三考虑:我们的框架比以往任何时候都更强大,更灵活,并且仍然只有不到50行代码。

$format

`