在magento中,在项目的每个步骤中,您都可以找到接口的实例,例如下面的函数所示:
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
//Upgrade schema logic
}
如何创建接口实例,如果我对接口很了解,就不可能有接口对象
SchemaSetupInterface $setup,
ModuleContextInterface $context
答案 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
定义文件和一个全局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中找到有关依赖项注入的更多信息。