При розробці веб-додатків на базі фреймворку Sylius часто виникає потреба адаптувати стандартну логіку до специфічних потреб бізнесу. Одним із поширених випадків є необхідність додавання нових залежностей у контролери, що успадковуються від вбудованих класів Sylius. В цій статті ми розглянемо, як правильно додати додаткові аргументи в конструктор успадкованого контролера, а також як уникнути типових помилок, які можуть виникнути під час цього процесу.
При створенні нового класу, який успадковується від \Sylius\Bundle\ResourceBundle\Controller\ResourceController
, і необхідності додавання додаткових аргументів до конструктора, розробник може зіткнутися з помилкою “Too few arguments to function”. Це відбувається через те, що система очікує отримати всі аргументи, які вимагаються як для батьківського конструктора, так і для новододаних залежностей.
Для вирішення цієї проблеми важливо забезпечити правильну передачу всіх необхідних аргументів у конструктор батьківського класу, а також ініціалізувати нові залежності в конструкторі дочірнього класу. Наведемо приклад коду, який демонструє правильний підхід:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
public function __construct( MetadataInterface $metadata, RequestConfigurationFactoryInterface $requestConfigurationFactory, ?ViewHandlerInterface $viewHandler, RepositoryInterface $repository, FactoryInterface $factory, NewResourceFactoryInterface $newResourceFactory, ObjectManager $manager, SingleResourceProviderInterface $singleResourceProvider, ResourcesCollectionProviderInterface $resourcesFinder, ResourceFormFactoryInterface $resourceFormFactory, RedirectHandlerInterface $redirectHandler, FlashHelperInterface $flashHelper, AuthorizationCheckerInterface $authorizationChecker, EventDispatcherInterface $eventDispatcher, ?StateMachineInterface $stateMachine, ResourceUpdateHandlerInterface $resourceUpdateHandler, ResourceDeleteHandlerInterface $resourceDeleteHandler, Sender $sender, ChannelContextInterface $channelContext, LocaleContextInterface $localeContext ) { parent::__construct( $metadata, $requestConfigurationFactory, $viewHandler, $repository, $factory, $newResourceFactory, $manager, $singleResourceProvider, $resourcesFinder, $resourceFormFactory, $redirectHandler, $flashHelper, $authorizationChecker, $eventDispatcher, $stateMachine, $resourceUpdateHandler, $resourceDeleteHandler ); $this->sender = $sender; $this->channelContext = $channelContext; $this->localeContext = $localeContext; } |
В цьому прикладі демонструється, як додаткові залежності (Sender
, ChannelContextInterface
, LocaleContextInterface
) ініціалізуються в конструкторі дочірнього класу та передаються до конструктора батьківського класу. Важливо пам’ятати, що всі залежності, які очікуються батьківським конструктором, мають бути передані в точному порядку.
Після внесення змін у конструктор класу контролера, необхідно також врахувати конфігурацію у файлі _sylius.yaml
та routes.yaml
. У цих файлах конфігурації визначається, який контролер використовується для обробки певних запитів. Приклад конфігурації:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# _sylius.yaml sylius_customer: resources: customer: classes: model: App\Entity\Customer\Customer repository: App\Repository\CustomerRepository controller: App\Controller\Resource\ResourceController # routes.yaml sylius_admin_customer_create: path: /admin/customers/new methods: [GET,POST] defaults: _controller: sylius.controller.customer::createAction |
Переконайтеся, що у вас правильно налаштовані шляхи до контролера, щоб ваші зміни вступили в силу. В іншому випадку, Symfony може продовжувати використовувати стандартний контролер, ігноруючи ваші налаштування.