Автомонтирование в Symfony
Только начинаю изучать Symfony, не могу справиться с проблемой. Хочу попробовать автомонтирование, но Symfony выдаёт ошибку о том, что класс не существует.
HelloController (\src\Controller\HelloController.php):
<?php
namespace App\Controller;
use App\GreetingGenerator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class HelloController extends AbstractController
{
/**
* @Route ("/hello/{name}")
*/
public function index($name, GreetingGenerator $greeting)
{
$info = $greeting->getRandomGreeting($name);
return $this->render('index.html.twig',
[
'info' => $info
]);
}
}
GreetingGenerator (\src\GreetingGenerator.php):
<?
namespace App;
class GreetingGenerator
{
public function getRandomGreeting($name)
{
$greetings = ['Hi', 'Hello', 'Hey'];
return $greetings[random_int(0,count($greetings) - 1)].', '.$name;
}
}
Полностью сообщение об ошибке выглядит так: Cannot resolve argument $greeting of "App\Controller\HelloController::index()": Cannot determine controller argument for "App\Controller\HelloController::index()": the $greeting argument is type-hinted with the non-existent class or interface: "App\GreetingGenerator".
Использовал команду php bin/console debug:autowiring --all, которая сообщила мне следующее: The following classes & interfaces can be used as type-hints when autowiring:
App\Controller\DefaultController
App\Controller\HelloController
App\GreetingGenerator
App\Kernel (kernel)
Как я понимаю, это означает, что я могу использовать для автомонтирования свой класс.
Подскажите, пожалуйста, в чём может быть проблема.
Ответы (2 шт):
Есть три варианта:
Перенесите это в параметры контроллера и далее присвойте свойству класса (самый простой, всё будет сделано автоматически).
Если хотите оставить в текущей реализации, то вам нужно определить ваш сервис в services.yaml и явно указать его как аргумент метода контроллера (контроллер необходимо будет тоже зарегистрировать как сервис).
Напишите и зарегистрируйте новый ArgumentResolver.
Всё дело было в shot tag php. Нужно было использовать обычный тэг. Я использую для тестирования встроенный сервер symfony, который запускаю с помощью symfony:start. Видимо, в настройках сервера отключен флаг short_open_tag.