如何在Magento2中创建控制器及其方法

本教程是magento2漫长系列教程中的第2部分。 它将随着平台的发展而逐步更新。 现在,您将学习如何在Magento2下创建控制器及其动作。 如果您不知道magento(v1)没问题,我将在此进行讨论,但是不必知道magento 1.x平台即可掌握magento2上的本教程。

在本教程中,您将为magento2创建一个通讯簿管理模块,该模块具有管理界面,前台,对数据库的访问权限以及其他所有功能。

首先创建模块的文件夹

从magento目录的根目录转到/ app / code文件夹。然后创建一个文件夹“ Pfay”和另一个文件夹“ Contacts”。
然后在“Contacts”文件夹中创建一个文件夹“ Controller”和另一个目录“ etc”。

命名空间:
您的模块位于Pfay命名空间中。您将在此文件夹中“存储”要创建的模块。
请注意,切勿修改magento2的“核心”文件,即/ app / code / Magento文件夹,否则,如果尝试更新平台,将会遇到很大的问题。

在magento2下声明其模块

现在,您已经创建了模块的文件夹,您必须将其“声明”为magento的模块。为此,我们将在模块的/ etc文件夹中创建module.xml文件,如下所示:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Pfay_Contacts" setup_version="2.0.0">
        <sequence>
            <module name="Magento_Cms"/>
        </sequence>
    </module>
</config>

我们也将创建文件“注册文件”。转到app / code / Pfay / Contacts,然后创建registration.php,如下所示:

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Pfay_Contacts',
    __DIR__
);

当您启动以下命令时:

php bin/magento setup:upgrade

您会看到这一行


'Pfay_Contacts' => 1

被插入文件app / etc / config.php中。这使您知道模块处于活动状态。对于那些知道magento(1.X)的人来说,您必须知道在magento2下,您不再需要在/ app / etc / module /中声明您的模块,在设计中使用模板等等,现在使用magento2 t与模块有关的所有内容都在其文件夹中。在magento2中,您有两个概念:“强依赖性”和“弱依赖性”。

magento2中的模块依赖性

强烈的模块依赖关系
恢复:如果不存在依赖关系,则Magento2不起作用。
该模块包含其他模块,类,静态方法,类的静态属性,接口等的逻辑代码。您需要提醒的是,dependecy模块不存在… 404!

对模块的依赖关系弱
:如果不存在依赖关系,Magento2仍然可以
工作。通常,它扩展了其他模块的功能,它首先检查依赖项的可用性。如果它不存在,它不会抛出异常……它会处理它。

创建控制器

在文件夹app / code / Pfay / Contacts / Controller中,创建一个文件夹Test,然后在其中创建Index.php文件,如下所示:

<?php
namespace Pfay\Contacts\Controller\Test;
class Index extends \Magento\Framework\App\Action\Action
{
    public function execute()
    {
        die('test index');
    }
}

小心一点,您会注意到,当我们定义文件的命名空间时,开头没有\,而扩展名中只有一个….
简而言之,这里我们创建一个Index类,它实际上是一个magento2 Action。实际上,在magento2中,不再有控制器。现在,您可以通过操作创建文件。这些动作扩展了核心类 \ Magento \ Framework \ App \ Action \ Action,并且必须具有函数execute()。现在,在magento 1.x中的一个控制器中对动作进行分组时,现在将在文件夹中对动作类进行分组。

创建访问控制器的路径

为了通过前端访问我们的模块,您必须为我们的模块的前端创建路由。在这里,我们要通过URL www.magento2.lan / contacts /访问我们的模块。我们在“ etc”文件夹中创建一个“ frontend”文件夹,然后插入“ routes.xml”文件。

文件route.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="contacts" frontName="contacts">
            <module name="Pfay_Contacts" />
        </route>
    </router>
</config>

我们使用允许访问magento2模块前端部分的“标准”路由器!然后,我们添加ID为“ contacts”的路由以进行标识,并添加frontName“ contacts”(这是用于访问前端模块的关键URL)。然后,在此路由中,我们使用名称属性定义模块元素,该属性包含“名称空间” +“模块名称”。

供您参考,您还应该使用routes.xml类型的文件在后台中创建路径。

关于控制器组织的一点

从模块的根目录开始,我们有文件
/ Controller / Test / Index,
我们将在本教程的后续步骤中告诉我们控制器Test的操作索引是Action 。我们将通过访问URL来访问它

http//www.magento2.lan/contacts/test/index

如果未在url中指定动作,则名为index的动作是magento默认将采取的动作。我们可以通过以下方式访问它:

http//www.magento2.lan/contacts/test/

在这两个URL上,您将显示“测试索引”显示。

如果您想以其他动作查看为例,我们可以在包含以下内容的Test文件夹中创建另一个文件View.php:

<?php
namespace Pfay\Contacts\Controller\Test;
class View extends \Magento\Framework\App\Action\Action
{
    public function execute()
    {
        die('test index');
    }
}

网址:

http//www.magento2.lan/contacts/test/view

您将看到显示的“测试视图”

!为什么它对我不起作用?一些解决方案…

-不行吗?清空
后台的缓存>系统>缓存管理,并禁用所有缓存

本文翻译致:https://www.pierrefay.com/magento2-training/create-controller-action-magento2.html