Symfony 5 микро-приложение с MicroKernelTrait выдает ошибку «Контроллер не имеет установленного контейнера» - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь создать микро-приложение с Symfony 5, подход с одним файлом работает, но продвинутый пример с использованием Twig, et c. нет.

Я создал тестовый проект, следуя точному описанию, опубликованному здесь: https://symfony.com/doc/current/configuration/micro_kernel_trait.html, у меня такая же структура каталогов и такое же содержимое файла, как в примере:

enter image description here

Это индекс. php для запуска приложения:

// public/index.php
use App\Kernel;
use Doctrine\Common\Annotations\AnnotationRegistry;
use Symfony\Component\HttpFoundation\Request;

$loader = require __DIR__.'/../vendor/autoload.php';
// auto-load annotations
AnnotationRegistry::registerLoader([$loader, 'loadClass']);

$kernel = new Kernel('dev', true);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

И это MicroController с (пример) действие:

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class MicroController extends AbstractController
{
    /**
     * @Route("/random/{limit}")
     */
    public function randomNumber($limit)
    {
        $number = random_int(0, $limit);

        return $this->render('micro/random.html.twig', [
            'number' => $number,
        ]);
    }
}

Метод "configureContainer" в ядре. php вызывается и работает без ошибок:

protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
{
    $loader->load(__DIR__.'/../config/framework.yaml');

    // configure WebProfilerBundle only if the bundle is enabled
    if (isset($this->bundles['WebProfilerBundle'])) {
        $c->loadFromExtension('web_profiler', [
            'toolbar' => true,
            'intercept_redirects' => false,
        ]);
    }
}

, но проект по-прежнему не выполняется, вызывая действительный маршрут (например, "/ random / 10", как в примере) выдает мне ошибку: "" App \ Controller \ MicroController "не имеет установленного контейнера, вы забыли определить его как подписчик службы?"

my composer. json выглядит так:

"doctrine/annotations": "^1.8",
"symfony/config": "^5.0",
"symfony/dependency-injection": "^5.0",
"symfony/framework-bundle": "^5.0",
"symfony/http-foundation": "^5.0",
"symfony/http-kernel": "^5.0",
"symfony/routing": "^5.0",
"symfony/twig-bundle": "^5.0",
"symfony/web-profiler-bundle": "^5.0",
"symfony/yaml": "^5.0",

Чего мне не хватает? Любая подсказка приветствуется.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Найден: в указанном учебнике отсутствуют некоторые записи в файле конфигурации.

# config/framework.yaml
framework:
    secret: S0ME_SECRET
    profiler: { only_exceptions: false }

- исходный файл, добавьте его в файл, чтобы микро-приложение работало:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

вышеприведенная часть взята из обычных symfony -config-файлов и почему-то отсутствует в учебнике по микро-приложениям.

0 голосов
/ 28 марта 2020

В приложении \ Controller \ MicroController "нет набора контейнеров, вы забыли определить его как подписчика службы?"

Это говорит вам, MicroController нужно определить как услугу. Согласно документации , MicroController не должен расширять AbastracController.

При использовании контроллера, определенного как служба, вы все равно можете расширить базовый контроллер AbstractController и использовать его ярлыки. Но вам не нужно! Вы можете ничего не расширять и использовать внедрение зависимостей для доступа к различным службам. Подробнее

Таким образом, ваш контроллер должен быть определен следующим образом:

namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route;

class MicroController
{
    /**
     * @Route("/random/{limit}")
     */
     public function randomNumber($limit)
     {
        $number = random_int(0, $limit);

        return $this->render('micro/random.html.twig', [
            'number' => $number,
        ]);
     }
}
...