簡體   English   中英

我可以在非 Symfony 項目中使用 Symfony 的路由注釋嗎

[英]Can i use Symfony's Route Annotation in Non-Symfony Project

我已經在這里嘗試過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

我有點好奇,想知道這種東西在 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 路由屬性。 將類克隆到您自己的應用程序中可能是值得的,從而消除拖入完整包的需要。

如果有人碰巧偶然發現了這個答案,這里是一個完整的工作示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM