Symfony3连接注释路由

时间:2016-04-15 12:06:31

标签: php annotations doctrine symfony

我在Symfony组件之上编写自己的PHP框架作为学习练习。我按照http://symfony.com/doc/current/create_framework/index.html上的教程创建了我的框架。

我现在想要使用注释将我的路线连接到我的控制器。我目前有以下代码来设置路由:

// Create the route collection
$routes = new RouteCollection();

$routes->add('home', new Route('/{slug}', [
    'slug' => '',
    '_controller' => 'Controllers\HomeController::index',
]));

// Create a context using the current request
$context = new RequestContext();
$context->fromRequest($request);

// Create the url matcher
$matcher = new UrlMatcher($routes, $context);

// Try to get a matching route for the request
$request->attributes->add($matcher->match($request->getPathInfo()));

我遇到了以下类来加载注释,但我不确定如何使用它:

https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php

如果有人可以提供帮助,我会很感激。

由于

1 个答案:

答案 0 :(得分:5)

我终于设法让这个工作了。首先,我将autoload.php文件包含在以下位置:

use Doctrine\Common\Annotations\AnnotationRegistry;

$loader = require __DIR__ . '/../vendor/autoload.php';

AnnotationRegistry::registerLoader([$loader, 'loadClass']);

然后我将路径收集位(在问题中)更改为:

$reader = new AnnotationReader();

$locator = new FileLocator();
$annotationLoader = new AnnotatedRouteControllerLoader($reader);

$loader = new AnnotationDirectoryLoader($locator, $annotationLoader);
$routes = $loader->load(__DIR__ . '/../Controllers'); // Path to the app's controllers

这里是AnnotatedRouteControllerLoader的代码:

class AnnotatedRouteControllerLoader extends AnnotationClassLoader {
    protected function configureRoute(Route $route, ReflectionClass $class, ReflectionMethod $method, $annot) {
        $route->setDefault('_controller', $class->getName() . '::' . $method->getName());
    }
}

这取自https://github.com/sensiolabs/SensioFrameworkExtraBundle/blob/master/Routing/AnnotatedRouteControllerLoader.php。您可能希望对其进行修改以支持其他注释。

我希望这会有所帮助。