Как классы создаются маршрутизатором? - PullRequest
0 голосов
/ 24 мая 2019

Я изменяю обязательные аргументы для метода __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)"} []

Что меня расстраивает, так это то, что сообщение об ошибке указывает на то, что кажется динамически генерируемым файлом кэша, а не фактическим документом в платформе.

Цените любую помощь, люди здесь достаточно хороши, чтобы уйти!

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