如何在Magento 2中创建控制器

Controller特别是 Module开发系列中的重要内容之一,以及PHP MVC Framework。它的功能是接收请求,处理和呈现页面。
在Magento2中,Controller在模块的Controller文件夹中有一个或多个文件,它包含包含execute()方法的类的动作。有2个不同的控制器,它们是前端控制器和后端控制器。它们通常类似于工作流程,但管理员控制器略有不同。管理控制器中有一个检查权限方法,它会调用form key。

控制器如何工作?

它接收来自最终用户(浏览器或comamnd行)的请求,例如:

http://example.com/route_name/controller/action
  • route_name是在routes.xml中设置的唯一名称。
  • controllerController文件夹中的文件夹。
  • action 是一个具有执行方法来处理请求的类。

Magento系统中最重要的一个是frontControllerMagento\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/helloHello World! Welcome to Mageplaza.com在屏幕上显示消息。

如果您收到此错误消息:出于安全原因默认情况下禁用异常打印,此主题可能会有所帮助。

现在谈到Create a controller主题的结尾,在下一个教程中,我将向您展示如何在Magento 2中创建模型

相关文章

0 0 投票数
文章评分
订阅评论
提醒
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论