ticaje / m2-persistence
中间件,用于实现 Magento 2 的持久化
Requires
- php: ^7.0
- ticaje/design-by-contract: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ~2.14.0
- magento/magento-coding-standard: ~3.0.0
- magento/magento2-functional-testing-framework: 2.4.5
- pdepend/pdepend: 2.5.2
- phpmd/phpmd: @stable
- sebastian/phpcpd: ~3.0.0
- squizlabs/php_codesniffer: ~3.4.0
README
前言
Magento 框架是构建电子商务解决方案的强大工具。它之前推出了版本 2,其质量有了巨大的提升。即便如此,我还是想为开发者提供一些便利,让他们在编写 Magento 代码时更轻松,并处理重复性任务。
我必须说的是,也许有一些免责声明,这是一系列在 S.O.L.I.D 和其他面向对象设计原则下开发的扩展。因此,我们希望在 Magento 的开发中引入一些标准化,因为其设计者在决定走上一条更好的架构之路时,采用了这种方式。简而言之,S.O.L.I.D 原则和良好的设计实践贯穿了整个 Magento 生态系统。
安装
您可以使用 composer 安装此包(我唯一推荐的安装方式)
composer require ticaje/m2-persistence
关于此模块的疑虑是什么?
此模块是关于持久化。从许多角度来看,Magento 2 对框架进行了深刻的重新设计,引入了现代(也许不是那么新的)面向对象设计技术,但如果你仔细观察,当涉及到持久化时,并没有太大的变化,它继续塑造相同的 ORM(如果它曾经接近 ORM)结构,典型的模型/资源方法保持不变。
此模块解决的问题。
一个事实是,当开发人员需要创建单个实体时(在 Magento 中实体是模型),需要完成相同的样板代码。这非常尴尬,因为需要创建大量的类(模型、资源和集合)来创建单个实体。结果是,Magento 提供了工具,让开发人员避免每次单个实体出现时重复进行这一过程,更不用说创建更复杂的实体关系。
实际上,此模块重构了 Magento 进行此操作的方式,这样开发人员就可以通过 DIC(即 di.xml)以声明方式简单地定义正确的实体及其关系,从而专注于定义实体。
我将提供一个例子,因为图片胜于千言万语。
一个简单的例子
假设您需要因为业务模式而向 Magento 添加特定的表。表名将是 "example_table_name";我们不会在这里讨论模式细节,因为这仍然是相同的,此模块不会对此类情况产生影响。一旦开发人员定义了模式(通过传统的 Magento 渠道),剩下的事情就是定义以下 xml,以完成将模式与 ORM 连接所需的类。
<!-- Resource definition --> <virtualType name="Vendor\Module\Model\Resource\Example" type="Ticaje\Persistence\Entity\Resource\Base"> <arguments> <argument name="tableName" xsi:type="string">example_table_name</argument> <argument name="referenceId" xsi:type="string">entity_id</argument> </arguments> </virtualType> <!-- Resource definition --> <!-- Model Recipe, VT was not able to achieve --> <type name="Vendor\Module\Model\Example"> <arguments> <argument name="resourceModelClass" xsi:type="string">Vendor\Module\Model\Resource\Example</argument> <argument name="cacheTag" xsi:type="const">example_table_name</argument> </arguments> </type> <!-- Model Recipe --> <!-- Collection definition --> <virtualType name="Vendor\Module\Model\Example\Resource\Example\Collection" type="Ticaje\Persistence\Entity\Resource\Collection\Base"> <arguments> <argument name="idFieldName" xsi:type="const">Vendor\Module\Model\ExampleInterface::KEY_ID</argument> <argument name="model" xsi:type="string">Vendor\Module\Model\Example</argument> <argument name="resourceModel" xsi:type="string">Vendor\Module\Model\Example\Resource</argument> </arguments> </virtualType> <!-- Collection definition -->
由于一些不一致的框架连接,我们必须创建一个继承自我们的基础实体类的具体模型类。我们尝试过,就像资源和集合一样,将其定义为虚拟类型,但无法实现对象的实例化,任何帮助都将受到赞赏。
我们的示例模型类。
<?php declare(strict_types=1); namespace Vendor\Module\Model; use Ticaje\Persistence\Entity\Base as ParentClass; /** * Class Example * @package Vendor\Module\Model */ class Example extends ParentClass { }
这就是全部。
简而言之,我们在这里定义了模型、资源和集合类,以便于新的模型使用。因此,开发人员可以像在 Magento 生态系统中那样使用它。
优势
使用这种方法的好处是不必担心在创建 Magento 中的模型时重复相同的类结构细节。这很容易出错并增加与框架的耦合。最大的好处在于当 Magento 对框架进行升级且任何这些类受到影响时。此模块充当网关,因此开发人员(此模块的维护者)只需更改此模块以符合新的规范,而使用此模块的消费者(模块)对此毫不知情。想象一下,当你系统中有许多自定义模型定义时,由于你的逻辑与框架无关,你就可以避免在许多地方进行大量更改。
贡献
有关详细信息,请参阅贡献指南。
致谢
许可证
GNU 通用公共许可证(GPLv3)。有关更多信息,请参阅许可证文件。