Могу ли я использовать аннотацию маршрута Symfony в не Symfony проекте - PullRequest
1 голос
/ 08 января 2020

Я уже пробовал кое-что здесь 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

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Когда я распечатываю массив $ маршруты, он дает мне этот вывод, индексную функцию TestController, но как там будет go? Есть ли какой-то особый метод для этого?

Array
(
    [index] => Symfony\Component\Routing\Route Object
        (
            [path:Symfony\Component\Routing\Route:private] => /
            [host:Symfony\Component\Routing\Route:private] => 
            [schemes:Symfony\Component\Routing\Route:private] => Array
                (
                )

            [methods:Symfony\Component\Routing\Route:private] => Array
                (
                )

            [defaults:Symfony\Component\Routing\Route:private] => Array
                (
                    [_controller] => App\Controller\TestController::index
                )

            [requirements:Symfony\Component\Routing\Route:private] => Array
                (
                )

            [options:Symfony\Component\Routing\Route:private] => Array
                (
                    [compiler_class] => Symfony\Component\Routing\RouteCompiler
                )

            [condition:Symfony\Component\Routing\Route:private] => 
            [compiled:Symfony\Component\Routing\Route:private] => 
        )

)
0 голосов
/ 08 января 2020

Мне было немного любопытно посмотреть, что именно нужно для работы такого рода в 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 framework. Сам класс просто заботится об установке атрибута маршрута _controller. Возможно, стоит скопировать класс в собственное приложение и, таким образом, устранить необходимость перетаскивания полного пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...