Я изменяю обязательные аргументы для метода __construct () класса Controller. После добавления аргументов в конструктор класса не будет загружена страница, использующая этот контроллер.
Это приложение, для которого мало документации, и я только недавно был нанят для работы над ним. Я опытный разработчик, но меня бросили в проект Symfony, с которым я никогда не работал.
Моя проблема, проще говоря, заключается в том, что мне нужно использовать параметр конфигурации, который изначально загружен из конфигурации контейнера Docker, в класс Symfony. Ведущие разработчики настаивают на том, чтобы эта конфигурация была внедрена в класс. Хорошо, хорошо.
Но когда я добавляю дополнительные аргументы к методу __construct (), я начинаю получать ошибки, которых я тоже ожидал. Но я понятия не имею, где искать вызов вызова?
Вот начало определения класса, которое показывает метод конструкции с тремя новыми аргументами, прикрепленными к концу:
class DocTreeController extends AbstractController
{
use CommandDispatcherTrait;
private const ETAG_SEED = '1';
/**
* @var ClientInterface
*/
private $guzzleJsonClient;
private $caseNetworkSecret;
private $caseNetworkScope;
private $caseTokenServer;
/**
* @var PdoAdapter
*/
private $externalDocCache;
public function __construct(ClientInterface $guzzleJsonClient, PdoAdapter $externalDocCache, ?string $caseNetworkSecret, ?string $caseNetworkScope, ?string $caseTokenServer)
{
$this->guzzleJsonClient = $guzzleJsonClient;
$this->externalDocCache = $externalDocCache;
$this->caseNetworkSecret = $caseNetworkSecret;
$this->caseTokenServer = $caseTokenServer;
$this->caseNetworkScope = $caseNetworkScope;
}
Вот сокращенная версия функции индекса в соответствии с маршрутами, примененными к ней в комментариях:
/**
* @Route("/doc/{slug}.{_format}", name="doc_tree_view", methods={"GET"}, defaults={"_format"="html", "lsItemId"=null})
* @Route("/doc/{slug}/av.{_format}", name="doc_tree_view_av", methods={"GET"}, defaults={"_format"="html", "lsItemId"=null})
* @Route("/doc/{slug}/lv.{_format}", name="doc_tree_view_log", methods={"GET"}, defaults={"_format"="html", "lsItemId"=null})
* @Route("/doc/{slug}/{assocGroup}.{_format}", name="doc_tree_view_ag", methods={"GET"}, defaults={"_format"="html", "lsItemId"=null})
* @Entity("lsDoc", expr="repository.findOneBySlug(slug)")
* @Template()
*/
public function viewAction(LsDoc $lsDoc, AuthorizationCheckerInterface $authChecker, ?UserInterface $user = null, $_format = 'html', $lsItemId = null, $assocGroup = null)
{
$em = $this->getDoctrine()->getManager();
....
return $ret;
}
И, основываясь на некотором супер-неэффективном спотыкании в документации Symfony, вот запись, которую я попытался сделать в файле services.yaml, думая, что это должен быть какой-то сервис:
# Doc Controller
App\Controller\Framework\DocTreeController:
class: App\Controller\Framework\DocTreeController
arguments:
$guzzleJsonClient: '@csa_guzzle.client.json'
$externalDocCache: '@salt.cache.external_docs'
$caseNetworkSecret: '%case_network_secret%'
$caseNetworkScope: '%case_network_scope%'
$caseTokenServer: '%case_token_server%'
Когда я даже иду в индекс, я получаю следующее сообщение об ошибке:
[2019-05-24 20:00:37] request.CRITICAL: Uncaught PHP Exception ArgumentCountError: "Too few arguments to function App\Controller\Framework\DocTreeController::__construct(), 2 passed in /var/www/html/var/cache/prod/ContainerAcbnxwG/getDocTreeControllerService.php on line 14 and exactly 5 expected" at /var/www/html/src/Controller/Framework/DocTreeController.php line 58 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Too few arguments to function App\\Controller\\Framework\\DocTreeController::__construct(), 2 passed in /var/www/html/var/cache/prod/ContainerAcbnxwG/getDocTreeControllerService.php on line 14 and exactly 5 expected at /var/www/html/src/Controller/Framework/DocTreeController.php:58)"} []
Что меня расстраивает, так это то, что сообщение об ошибке указывает на то, что кажется динамически генерируемым файлом кэша, а не фактическим документом в платформе.
Цените любую помощь, люди здесь достаточно хороши, чтобы уйти!