Модуль Magento 2 для расширения проблемы клиента

Я пытаюсь создать модуль Magento 2, чтобы расширить класс и метод Customer::loadByEmail() по умолчанию с некоторой дополнительной логикой.

Поскольку мой модуль содержит несколько разных классов/файлов, я создал публичный список, содержащий код, вместо того, чтобы засорять этот пост кучей кода.

Полный код: https://gist.github.com/JasonMortonNZ/90ada76ad5511a37d2c6

Также для справки весь код находится в папке project-root/app/code/Jason/OCUsers.

Что работает:

  • Модуль распознается моим Magento, когда я запускаю команду magento module:status из командной строки.
  • Я могу успешно включать и отключать модуль, хотя миграции (обновления схемы), похоже, не выполняются.

Что НЕ работает:

  • Обновления схемы при установке и обновлении не работают. Обновления схемы базы данных не сохраняются и не вступают в силу.
  • Похоже, что DI неверен, так как новый класс Customer и метод loadByEmail, которые я создал, не срабатывают.

Любая помощь или предложения о том, почему возникает эта пара проблем, будут высоко оценены :)

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="Jason_OCUser" setup_version="2.0.0"/>
    <sequence>
        <module name="Magento_Customer"/>
    </sequence>
</config>

di.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Customer\Api\Data\CustomerInterface" type="Jason\OCUser\Model\Customer" />
    <type name="Magento\Framework\Model\ActionValidator\RemoveAction">
        <arguments>
            <argument name="protectedModels" xsi:type="array">
                <item name="customer" xsi:type="string">Jason\OCUser\Model\Customer</item>
            </argument>
        </arguments>
    </type>
</config>

Клиент.php

<?php
namespace Jason\OCUser\Model;

use Magento\Customer\Model\Customer as MCustomer;

class Customer extends MCustomer
{
    /**
     * Load customer by email
     *
     * @param   string $customerEmail
     * @return  $this
     */
    public function loadByEmail($customerEmail)
    {
        die('Not reaching this :( ');
    }
}

InstallSchema.php

<?php

namespace Jason\OCUser\Setup;

use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\InstallSchemaInterface;

class InstallSchema implements InstallSchemaInterface
{

    /**
     * Installs DB schema for a module
     *
     * @param SchemaSetupInterface $setup
     * @param ModuleContextInterface $context
     * @return void
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {

        $installer = $setup;

        $installer->startSetup();

        /**
         * Add salt column and oc user status
         */
        $installer->getConnection()->addColumn(
            'customer_entity',
            'oc_salt',
            [
                'type' => Table::TYPE_TEXT,
                'nullable' => true,
                'default' => null,
                'length' => 9,
                'comment' => ''
            ]
        );

        $installer->getConnection()->addColumn(
            'customer_entity',
            'oc_user',
            [
                'type' => Table::TYPE_BOOLEAN,
                'nullable' => false,
                'default' => 0,
                'comment' => ''
            ]
        );

        $installer->endSetup();
    }
}

person JasonMortonNZ    schedule 30.11.2015    source источник


Ответы (1)


Ваш di.xml кажется неверным. См. атрибут for в теге preference. См. ниже. Я заменил Magento\Customer\Api\Data\CustomerInterface на Magento\Customer\Model\Customer.

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Customer\Model\Customer" type="Jason\OCUser\Model\Customer" />
    <type name="Magento\Framework\Model\ActionValidator\RemoveAction">
        <arguments>
            <argument name="protectedModels" xsi:type="array">
                <item name="customer" xsi:type="string">Jason\OCUser\Model\Customer</item>
            </argument>
        </arguments>
    </type>
</config>
person GeorgeQ    schedule 30.11.2015
comment
Это тоже не работает. Метод loadByEmail() все еще вызывается для Magento\Customer\Model\Customer не моего класса? @georgeq - person JasonMortonNZ; 01.12.2015