Symfony 路由器呼叫控制器

Paw*_*kov 0 symfony

我正在编写自己的项目并想使用一些 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?我正在阅读文档,但不明白我应该怎么做。

Cer*_*rad 5

这是一个比它看起来更复杂的问题。

最简单的方法是简单地分解 _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 方法为您提供了一个也值得研究的基本框架。