我有一个标准的Observer设置,该模块不做任何其他事情。如果我更改了正在侦听controller_action_predispatch
的事件,则Observer会正常激活。使用controller_action_predispatch_checkout_index_index
而没有其他更改,它不会。
我正在查看M2分析器的输出;我可以看到两个事件都被解雇了。我唯一的线索是在同一事件上有另一个观察者(来自不同的模块)。我已经查看了这个观察者的来源,它似乎没有做任何重要的事情。 profiler screenshot
我还使用标准Psr\Log\LoggerInterface
实例来检查Observer是否可以触发。
供应商/模块的/ etc / 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_checkout_index_index">
<observer name="vendor_module_requirelogin"
instance="Vendor\Module\Observer\RequireLogin" />
</event>
</config>
供应商/模块/观察员/ RequireLogin.php
namespace Vendor\Module\Observer;
use Magento\Customer\Model\Session;
use Magento\Framework\App\ResponseFactory;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\UrlInterface;
class RequireLogin implements ObserverInterface
{
protected $responseFactory;
protected $session;
protected $url;
public function __construct(
ResponseFactory $responseFactory,
UrlInterface $url,
Session $session
) {
$this->responseFactory = $responseFactory;
$this->url = $url;
$this->session = $session;
}
public function execute(Observer $observer)
{
if (!$this->session->isLoggedIn()) {
$url = $this->url->getUrl('customer/account/login');
return $this->responseFactory->create()
->setRedirect($url)
->sendResponse();
}
}
}