【问题标题】:Can i use Symfony's Route Annotation in Non-Symfony Project我可以在非 Symfony 项目中使用 Symfony 的 Route Annotation
【发布时间】:2020-01-07 23:22:27
【问题描述】:

我已经在这里尝试过https://symfony.com/doc/master/components/routing.html 但是我做不到。

<?php
use Doctrine\Common\Annotations\AnnotationReader;
use Symfony\Bundle\FrameworkBundle\Routing\AnnotatedRouteControllerLoader;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\AnnotationDirectoryLoader;
use Composer\Autoload\ClassLoader;
use Doctrine\Common\Annotations\AnnotationRegistry;

/** @var ClassLoader $loader */
$loader = require __DIR__.'/vendor/autoload.php';

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

$loader = new AnnotationDirectoryLoader(
    new FileLocator(__DIR__.'/app/Controller/'),
    new AnnotatedRouteControllerLoader(
        new AnnotationReader()
    )
);

$routes = $loader->load(__DIR__.'/app/Controller/');

当我这样做时,我会犯这些错误

Fatal error: Uncaught Error: Class 'Symfony\Component\Config\Loader\FileLoader' not found in C:\xampp\htdocs\MyFw\vendor\symfony\routing\Loader\AnnotationFileLoader.php:25 Stack trace: #0 C:\xampp\htdocs\MyFw\vendor\composer\ClassLoader.php(444): include() #1 C:\xampp\htdocs\MyFw\vendor\composer\ClassLoader.php(322): Composer\Autoload\includeFile('C:\\xampp\\htdocs...') #2 [internal function]: Composer\Autoload\ClassLoader->loadClass('Symfony\\Compone...') #3 C:\xampp\htdocs\MyFw\vendor\symfony\routing\Loader\AnnotationDirectoryLoader.php(23): spl_autoload_call('Symfony\\Compone...') #4 C:\xampp\htdocs\MyFw\vendor\composer\ClassLoader.php(444): include('C:\\xampp\\htdocs...') #5 C:\xampp\htdocs\MyFw\vendor\composer\ClassLoader.php(322): Composer\Autoload\includeFile('C:\\xampp\\htdocs...') #6 [internal function]: Composer\Autoload\ClassLoader->loadClass('Symfony\\Compone...') #7 C:\xampp\htdocs\MyFw\index.php(14): spl_autoload_call('Symfony\\Compone...') #8 {main} thrown in C:\xampp\htdocs\MyFw\vendor\symfony\routing\Loader\AnnotationFileLoader.php on line 25

【问题讨论】:

  • "composer require symfony/config" 应该可以帮助您克服错误。可能会遇到其他问题。

标签: php symfony routes annotations


【解决方案1】:

我有点好奇,想知道在 Symfony 5 下这种东西到底需要什么。

首先加载五个包:

composer require symfony/routing
composer require symfony/config
composer require symfony/framework-bundle
composer require doctrine/annotations
composer require doctrine/cache

然后您需要调整 composer.json 以自动加载您的应用程序类:

# composer.json
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }

当然还要运行“composer dump-autoload”。

然后我做了一个测试控制器:

# app/Controller/DefaultController.php
namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route;

class DefaultController
{
    /**
     * @Route("/",name="index")
     */
    public function index()
    {
    }
    /**
     * @Route("/hello",name="hello")
     */
    public function hello()
    {
    }
}

之后,问题中的加载代码按预期工作。所以这里就不重复了。

Symfony 仍然依赖 Doctrine 来做一些注释处理有点奇怪。重要的是要注意 AnnotationRegistry::registerLoader 方法已被贬值,因此当 Doctrine 最终更新到 3.x 时,必须对代码进行调整。或者可能会删除 Doctrine 注释依赖项。

另一件有点遗憾的是 AnnotatedRouteControllerLoader 类需要加载整个 Symfony 框架包。类本身只负责设置 _controller 路由属性。将类克隆到您自己的应用程序中可能是值得的,这样就无需拖入完整的包。

如果有人偶然发现了这个答案,这里是complete working example

【讨论】:

  • Github 中的好例子,对我有用,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2022-12-05
  • 2017-12-16
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多