更好地了解magento界面

时间:2019-07-05 06:51:31

标签: php magento interface magento2

在magento中,在项目的每个步骤中,您都可以找到接口的实例,例如下面的函数所示:

public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) 
{
        //Upgrade schema logic
}

如何创建接口实例,如果我对接口很了解,就不可能有接口对象

SchemaSetupInterface $setup, 
ModuleContextInterface $context

1 个答案:

答案 0 :(得分:0)

这是一种很好的编程方式,在Magento中,它与依赖注入(DI)模式有关。

常规接口用法

接口定义了类必须实现的最小功能。因此,如果一个函数接受类型为SchemaSetupInterface的接口,则它只需要一个实现SchemaSetupInterface中定义的函数的类。

在这种特殊情况下,接口定义如下,upgrade函数需要一个实现getIdxName($tableName, $fields, $indexType = '');getFkName($priTableName, $priColumnName, $refTableName, $refColumnName);的类。

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Framework\Setup;

/**
 * DB schema resource interface
 * @api
 * @since 100.0.2
 */
interface SchemaSetupInterface extends SetupInterface
{
    /**
     * Retrieves 32bit UNIQUE HASH for a Table index
     *
     * @param string $tableName
     * @param array|string $fields
     * @param string $indexType
     * @return string
     */
    public function getIdxName($tableName, $fields, $indexType = '');

    /**
     * Retrieves 32bit UNIQUE HASH for a Table foreign key
     *
     * @param string $priTableName  the target table name
     * @param string $priColumnName the target table column name
     * @param string $refTableName  the reference table name
     * @param string $refColumnName the reference table column name
     * @return string
     */
    public function getFkName($priTableName, $priColumnName, $refTableName, $refColumnName);
}

Magento DI.xml

Magento支持di.xml定义文件和一个全局ObjectManager,它基于di.xml中的首选项配置来解析类。然后,将实现特殊接口的类的实例自动注入到您的类的构造函数中。

示例:vendor/magento/magento2-base/app/etc/di.xml

<config>
    <!-- ... more -->
    <preference for="\Magento\Framework\Setup\SchemaSetupInterface" type="\Magento\Setup\Module\Setup" />
    <!-- ... more -->
</config>

在此配置下,Magento传递了一个\Magento\Setup\Module\Setup实例,该实例对升级功能的定义如下。

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Setup\Module;

use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\App\ResourceConnection;

/**
 * @api
 */
class Setup extends \Magento\Framework\Module\Setup implements SchemaSetupInterface
{
    /**
     * Retrieve 32bit UNIQUE HASH for a Table index
     *
     * @param string $tableName
     * @param array|string $fields
     * @param string $indexType
     * @param string $connectionName
     * @return string
     */
    public function getIdxName(
        $tableName,
        $fields,
        $indexType = '',
        $connectionName = ResourceConnection::DEFAULT_CONNECTION
    ) {
        return $this->getConnection($connectionName)->getIndexName($this->getTable($tableName), $fields, $indexType);
    }

    /**
     * Retrieve 32bit UNIQUE HASH for a Table foreign key
     *
     * @param string $priTableName  the target table name
     * @param string $priColumnName the target table column name
     * @param string $refTableName  the reference table name
     * @param string $refColumnName the reference table column name
     * @param string $connectionName
     * @return string
     */
    public function getFkName(
        $priTableName,
        $priColumnName,
        $refTableName,
        $refColumnName,
        $connectionName = ResourceConnection::DEFAULT_CONNECTION
    ) {
        return $this->getConnection($connectionName)->getForeignKeyName(
            $this->getTable($priTableName),
            $priColumnName,
            $refTableName,
            $refColumnName
        );
    }
}

您可以在Docs的Magento中找到有关依赖项注入的更多信息。