Sylius: дополнительный шаг проверки отсутствует слушатель - PullRequest
0 голосов
/ 11 февраля 2020

Я хочу добавить шаг оформления заказа в процесс оформления покупки. Это работает в том смысле, что когда я нахожусь в обзоре корзины и нажимаю кнопку «Оформить заказ», отображается мой добавленный шаг. Но когда я нажимаю «Далее», я получаю сообщение об ошибке «Невозможно сгенерировать URL для названного маршрута« sylius_order_index », так как такой маршрут не существует».

То, что я сделал до сих пор (сейчас, чтобы избежать отвлечения, я назвал свой этап проверки «test»):

config / packages / _sylius.yaml:

winzou_state_machine:
    sylius_order_checkout:
        states:
            test_selected: ~ 
        transitions:     
            select_test:
                from: [cart, test_selected, addressed, shipping_selected, shipping_skipped, payment_selected, payment_skipped]
                to: test_selected
            address:
                from: [cart, test_selected, addressed, shipping_selected, shipping_skipped, payment_selected, payment_skipped]
                to: addressed
            select_shipping:
                from: [addressed, test_selected, shipping_selected, payment_selected, payment_skipped]
                to: shipping_selected
            select_payment:
                from: [payment_selected, test_selected, shipping_skipped, shipping_selected]
                to: payment_selected           
        callbacks:
            after:
                sylius_process_cart:
                    on: ["select_shipping", "address", "select_payment", "skip_shipping", "skip_payment", "select_test"]
                    do: ["@sylius.order_processing.order_processor", "process"]
                    args: ["object"]

sylius_shop:
    product_grid:
        include_all_descendants: true
    checkout_resolver:
        route_map:
            cart:
                route: sylius_shop_checkout_test
            test_selected:
                route: sylius_shop_checkout_address

route / Checkout / checkout.yml:

sylius_shop_checkout_start:
    path: /
    methods: [GET]
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: sylius_shop_checkout_test

sylius_shop_checkout_test:
    path: /test
    methods: [GET, PUT]
    defaults:
        _controller: sylius.controller.order:updateAction
        _sylius:
            event: test
            flash: false
            template: "Checkout/Test/test.html.twig"
            form:
                type: App\Form\TestType
            repository:
                method: findCartForAddressing
                arguments:
                    - "expr:service('sylius.context.cart').getCart().getId()"
            state_machine:
                graph: sylius_order_checkout
                transition: select_test
#after this all other states as they are in native Sylius in this file. The original checkout.yml is completely overridden with this one.

Я следовал за компилятором в MY в отличие от шагов проверки NATIVE, и разница в том, что в

Bundle / Controller / ResourceController. php строка 311:

    $postEventResponse = $postEvent->getResponse();
    if (null !== $postEventResponse) {
        return $postEventResponse;
    }

Объект Response является нулевым (таким образом, if не попадает в, и компилятор продолжает генерировать произвольное / вводящее в заблуждение сообщение об ошибке, упомянутое выше). Итак, я заметил, что это происходит потому, что в

symfony / event-dispatcher / EventDispatcher. php строка 72:

if ($listeners) {
    $this->callListeners($listeners, $eventName, $event);
}

$ listeners в моем случае пустой массив, тогда как для всех остальных нативных На шаге sylius подписан как минимум 1 слушатель. Я просто не знаю, где это добавить. Кто-нибудь может указать мне, где / как это делается?

1 Ответ

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

Я решил это сам. Все, чего не хватало, было в services.yaml:

app.request.matcher:
    class: Symfony\Component\HttpFoundation\RequestMatcher

sylius.listener.checkout_redirect:
    class: Sylius\Bundle\CoreBundle\Checkout\CheckoutRedirectListener
    tags:
        - { name: 'kernel.event_listener', event: 'sylius.order.post_address',  method: 'handleCheckoutRedirect'}
        - { name: 'kernel.event_listener', event: 'sylius.order.post_select_shipping',  method: 'handleCheckoutRedirect'}
        - { name: 'kernel.event_listener', event: 'sylius.order.post_payment',  method: 'handleCheckoutRedirect'}
        - { name: 'kernel.event_listener', event: 'sylius.order.post_test',  method: 'handleCheckoutRedirect'}
    arguments:
        - '@request_stack'
        - '@sylius.router.checkout_state'
        - '@app.request.matcher'
...