Controller特别是 Module开发系列中的重要内容之一,以及PHP MVC Framework。它的功能是接收请求,处理和呈现页面。
在Magento2中,Controller在模块的Controller文件夹中有一个或多个文件,它包含包含execute()方法的类的动作。有2个不同的控制器,它们是前端控制器和后端控制器。它们通常类似于工作流程,但管理员控制器略有不同。管理控制器中有一个检查权限方法,它会调用form key。
控制器如何工作?
它接收来自最终用户(浏览器或comamnd行)的请求,例如:
http://example.com/route_name/controller/action
route_name
是在routes.xml中设置的唯一名称。controller
是Controller文件夹中的文件夹。action
是一个具有执行方法来处理请求的类。
Magento系统中最重要的一个是frontController(Magento\Framework\App\FrontController
),它总是接收请求然后路由控制器,动作由route_name
Let's举例说明路由请求:
foreach ($this->_routerList as $router) {
try {
$actionInstance = $router->match($request);
…
}
如果找到了控制器类的操作,execute()
则将运行方法。
如何创建控制器?
在Magento 2中创建控制器:
- 第1步:创建routes.xml文件
- 第2步:创建控制器文件
- 第3步:创建控制器布局文件
- 第4步:创建控制器块文件
- 第5步:创建控制器模板文件
- 第6步:刷新Magento缓存
- 第7步:运行测试新控制器
要创建控制器,我们需要在Controller
模块的文件夹中创建一个文件夹,并在其中声明一个动作类。例如,我们为模块创建一个index controller
和一个index
动作Mageplaza_HelloWorld
:
第1步:创建routes.xml文件。
文件: app/code/Mageplaza/HelloWorld/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 frontName="helloworld" id="helloworld">
<module name="Mageplaza_HelloWorld"/>
</route>
</router>
</config>
在之前的Magento 2中的如何创建模块中,我们创建了文件routes.xml。如果您创建了它,则可以忽略此步骤。
第2步:创建控制器文件
文件: app/code/Mageplaza/HelloWorld/Controller/Index/Index.php
<?php
namespace Mageplaza\HelloWorld\Controller\Index;
class Index extends \Magento\Framework\App\Action\Action
{
protected $_pageFactory;
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $pageFactory)
{
$this->_pageFactory = $pageFactory;
return parent::__construct($context);
}
public function execute()
{
return $this->_pageFactory->create();
}
}
如您所见,所有控制器必须是\Magento\Framework\App\Action\Action
具有调度方法的扩展类,该方法将execute()
在操作类中调用方法。在此execute()
方法中,我们将编写所有控制器逻辑,并将返回请求的响应。
第3步:创建布局文件
文件:
app/code/Mageplaza/HelloWorld/view/frontend/layout/helloworld_index_index.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<referenceContainer name="content">
<block class="Mageplaza\HelloWorld\Block\Index" name="helloworld_index_index" template="Mageplaza_HelloWorld::index.phtml" />
</referenceContainer>
</page>
第4步:创建阻止文件
文件: app/code/Mageplaza/HelloWorld/Block/Index.php
<?php
namespace Mageplaza\HelloWorld\Block;
class Index extends \Magento\Framework\View\Element\Template
{
}
第5步:创建模板文件
文件: app/code/Mageplaza/HelloWorld/view/frontend/templates/index.phtml
<h2>Welcome to Mageplaza.com</h2>
我们可以在本主题中了解更多视图:布局,块,模板。
第6步:刷新Magento缓存
如何在这里刷新Magento缓存
第7步:运行测试
让我们打开浏览器并导航到
http://<yourhost.com>/helloworld/index/index
要么
http://<yourhost.com>/helloworld/
权限 - ACL
管理控制器中有一个检查权限方法。我们来举个例子:
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Magento_AdminNotification::show_list');
}
它将检查当前用户是否有权访问此操作,了解更多管理ACL访问控制列表
Magento 2 Controller中的其他方法
_forward()和_redirect()动作。
\Magento\Framework\App\Action\Action
课程为我们提供了两个重要的方法:_forward
和_redirect
。
前进方法
_forward()
protected函数将编辑请求以将其传输到另一个controller/action
类。这不会更改请求网址。例如,我们有2个Action Forward和Hello World,如下所示:
namespace Mageplaza\HelloWorld\Controller\Test;
class Forward extends \Magento\Framework\App\Action\Action
{
public function execute()
{
$this->_forward('hello');
}
}
如果你提出请求http://example.com/route_name/test/forward
,这里的结果将在屏幕上显示。
Hello World! Welcome to Mageplaza.com
您还可以在转发时更改控制器,模块和设置参数的参数。请检查_forward()
功能以获取更多信息:
protected function _forward($action, $controller = null, $module = null, array $params = null)
{
$request = $this->getRequest();
$request->initForward();
if (isset($params)) {
$request->setParams($params);
}
if (isset($controller)) {
$request->setControllerName($controller);
// Module should only be reset if controller has been specified
if (isset($module)) {
$request->setModuleName($module);
}
}
$request->setActionName($action);
$request->setDispatched(false);
}
重定向方法
此方法将转移到另一个controller/action
类,并更改响应标头和请求URL。在上面的例子中,如果我们用_forward()
这个_redirect()
方法替换方法:
$this->_redirect('*/*/hello');
然后在从url访问后http://example.com/route_name/test/forward
,url将更改为http://example.com/route_name/test/hello
并Hello World! Welcome to Mageplaza.com
在屏幕上显示消息。
如果您收到此错误消息:出于安全原因,默认情况下禁用异常打印,此主题可能会有所帮助。
现在谈到Create a controller
主题的结尾,在下一个教程中,我将向您展示如何在Magento 2中创建模型