Это хорошее программирование, и в 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
s. Экземпляры классов, которые реализуют специальные интерфейсы, автоматически добавляются в конструкторы ваших классов.
Пример: 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
);
}
}
Дополнительную информацию о внедрении зависимостей в Magento можно найти в Docs .