Интерфейсный маршрут Magento 2 разрешает только метод POST


Я использую magento 2.2.5 и создал внешний маршрут следующим образом:

<?xml version="1.0"?> 
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="spin" frontName="spin">
            <module name="Neverending_Story" />
        </route>
    </router>
</config>

Как я могу разрешить только запрос метода POST, который может получить доступ к этому маршруту??

Author: blue, 2019-07-15

4 answers

Объект запроса Magento имеет функцию

$this->getRequest()->getMethod() которые предоставляют имя метода запроса для объекта запроса. Таким образом, используя это getMethod(), вы можете запретить вашему маршруту отправлять все другие запросы.

Создайте наблюдателя на событии

controller_action_predispatch_spin

И на этом наблюдателе, если вы обнаружите, что метод запроса $observer->getEvent()->getRequest()->getMethod(), затем отключите все страницы этого маршрута <route id="spin" frontName="spin">

Вызов наблюдателя из events.xml

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
     <event name="controller_action_predispatch_spin">
        <observer instance="StackExchange\Magento\Observer\Frontend\CheckAndPrevent" 
                  name="prevent_all_method"/>
    </event>
</config>

Код наблюдателя:

<?php


namespace StackExchange\Magento\Observer\Frontend;


class CheckAndPrevent implements \Magento\Framework\Event\ObserverInterface
{



    public function execute(\Magento\Framework\Event\Observer $observer)
    {
       //$eventParameters = ['controller_action' => $this, 'request' => $request];
        $request = $observer->getEvent()->getRequest();
        $requestMethod = strtolower($request->getMethod());

        if($requestMethod !== 'put'){

           // echo $requestMethod;
            // Throw an exception for prevent the accesss
            throw new \Exception("Cannot access."); 


        }

    }

}
 1
Author: Amit Bera, 2019-07-15 07:56:39

Если вы используете M 2.3, то легко используйте это. Ваш контроллер должен реализовывать следующий интерфейс:

Magento\Фреймворк\Приложение\Действие\httppostactionинтерфейс

Проверьте модуль контактов после действия, как он используется

 2
Author: Sohel Rana, 2019-07-15 04:20:58

Если вы собираетесь использовать этот маршрут для API, такого как конечная точка, я бы предложил использовать webapi.xml параметры конфигурации вместо этого. Зарегистрируйте маршрут в качестве конечной точки API REST.

Вы можете сделать это, как показано ниже:

Webapi.xml

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route method="POST" url="/V1/spin">
        <service class="YourVendor\YourModule\Controller\Index\Index" method="execute"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

Затем ваша конечная точка СООБЩЕНИЯ: yourdomain.com/rest/V1/spin

Возможно, это не самое подходящее решение, но я думаю, что это сделает свою работу.

 1
Author: fmsthird, 2019-07-15 05:08:09

В версиях Magento я не думаю, что есть способ настроить это на уровне определения маршрута. Как объяснил Сохель в своем ответе, это можно обеспечить в Magento>=2.3 на уровне контроллера.

Однако вы можете убедиться, является ли метод POST объектом запроса или нет. Вы можете проверить это с помощью метода execute(), как показано ниже:

public function execute()
{
    $isPostRequest = !empty($this->getRequest()->getPostValue());

    if (!$isPostRequest) {
        // Not a POST request; logic to show some error
    }

    // Do relevant stuff here...
}
 1
Author: Rajeev K Tomy, 2019-07-15 05:30:23