renttek / magento2-virtual-controllers
一个模块,允许开发者创建 Magento 2 中的虚拟控制器
Requires
- php: ~7.1
- ext-dom: *
- magento/framework: >=100.0
- magento/module-url-rewrite: >=100.0
Requires (Dev)
- phpmd/phpmd: ~2.6
- phpstan/phpstan: ^0.12.8
- phpunit/phpunit: ~6.2.0
- squizlabs/php_codesniffer: ~3.2
README
允许创建具有“虚拟控制器”的路由
什么是虚拟控制器?虚拟控制器是一个路径 + 可选的布局处理器,将被设置。有了它,就可以创建自定义路由,在其中可以放置自定义块。 (在 Magento 2 中,这目前只能通过创建 route.xml 和一个虚拟控制器操作来实现,该操作返回 \Magento\Framework\View\Result\Page))
比较
以下是创建自定义路由(例如/example/page/view)的 Magento 2 中所需的最小代码比较(假设已有一个名为 My_Module 的模块)
纯 Magento 2
<module_dir>/etc/frontend/routes.xml
<?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="example" frontName="example"> <module name="My_Module"/> </route> </router> </config>
<module_dir>/Controllers/Page/View.php
<?php namespace Mapa\Content\Controller\Page; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Magento\Framework\View\Result\PageFactory; class View extends Action { private $resultPageFactory; public function __construct(Context $context, PageFactory $resultPageFactory) { parent::__construct($context); $this->resultPageFactory = $resultPageFactory; } public function execute() { return $this->resultPageFactory->create(); } }
使用此模块
<module_dir>/etc/virtual_controllers.xml
<?xml version="1.0"?> <controllers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Renttek_VirtualControllers:etc/virtual_controllers.xsd"> <controller path="example/page/view" /> </controllers>
特性
处理器
除了创建自定义路由的简化过程之外,每个路由都会设置一些布局处理器
- "default"
- "virtual_controller"
- 给定的路径,但所有除
[a-z_]
之外的字符都将被下划线替换。(例如example/page/view
=>example_page_view
)
生成的处理器也可以在 XML 配置中手动设置,如下所示
<module_dir>/etc/virtual_controllers.xml
<?xml version="1.0"?> <controllers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Renttek_VirtualControllers:etc/virtual_controllers.xsd"> <controller path="example/page/view" handle="my_custom" /> </controllers>
可以通过将配置中的 disabled=true
设置为禁用路由
<?xml version="1.0"?> <controllers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Renttek_VirtualControllers:etc/virtual_controllers.xsd"> <controller path="example/page/view" disabled="true" /> </controllers>
转发
另一个特性是可以创建不创建控制器的转发。如果您想显示页面上的另一个 URL,则需要转发。(例如 'my/shoppingcart' => 'checkout/cart')
<?xml version="1.0"?> <controllers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Renttek_VirtualControllers:etc/virtual_controllers.xsd"> <forward path="my/shoppingcart" module="checkout" controller="cart" action="index"/> </controllers>
在 V1 中,如果未指定,则 controller
和 action
属性默认为 'index'。在 V2 中并非如此!
转发是 可以 调用的 URL/路径,它不会以任何方式扩展/操作 URL 生成。
所有路由都通过路径属性合并,因此可以禁用来自其他模块的路由。