Интерфейсный маршрут 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, который может получить доступ к этому маршруту??
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.");
}
}
}
Если вы используете M 2.3, то легко используйте это. Ваш контроллер должен реализовывать следующий интерфейс:
Magento\Фреймворк\Приложение\Действие\httppostactionинтерфейс
Проверьте модуль контактов после действия, как он используется
Если вы собираетесь использовать этот маршрут для 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
Возможно, это не самое подходящее решение, но я думаю, что это сделает свою работу.
В версиях 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...
}