[英]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.