W Magento 2 większość klas ma te dwie konstrukcje ( __construct
i _construct
) metody. Jaka jest różnica między nimi?
Nie jestem do końca pewien, czy zmieniło się to między Magento 1 i Magento 2, prawdopodobnie nie, więc pójdę z tym, co wiem z Magento 1.
_construct
Zostanie wywołana po__construct
Natywna __construct
metoda PHP nie powinna być nadpisywana ani używana w kodzie. Jeśli chcesz wykonać kod w bezpieczny sposób na początku klasy, użyj _construct
.
Magento użyje języka macierzystego, __construct
aby upewnić się, że wszystko jest „gotowe” do użycia klasy, na przykład zdefiniować odpowiednie znaczniki pamięci podręcznej dla określonego modelu.
Metoda _construct była „wynalazkiem Varien” stosowanym do zawarcia logiki inicjalizacji w modelach, pomocnikach i blokach.
Dlatego niezwykła jest zmiana lub ponowna deklaracja natywnej metody __construct () w modelach / blokach M1 lub pomocnikach, ponieważ zawsze korzystamy z fabryk Magento. Jednak nie ma żadnych problemów / złych praktyk dotyczących korzystania z niego (jeśli zależy Ci na kompatybilności).
W M2 metoda _construct () nadal występuje w niektórych częściach i jest używana do tych samych celów, ale teraz (w M2) cała logika DI jest implementowana przez __constructor (), więc w bazie kodu znajdziesz wiele deklaracji konstrukcyjnych.
BTW, nie ma już takich fabryk jak Mage::getModel()
w M2.
Innymi słowy:
Metoda _construct () jest implementowana przez Magento w niektórych klasach i jest wywoływana automatycznie w deklaracji funkcji __construct , więc jeśli rozszerzasz klasę Magento jak Model, możesz użyć jej do wykonania pewnych rzeczy po utworzeniu obiektu.
W modelu zasobów lub klasie modelu należy zdefiniować _construct()
metodę w celu zdefiniowania tabeli i klucza podstawowego
Z drugiej strony __construct jest rodzimą metodą PHP (wszystkie języki OO mają taką), __construct
wywoływaną za każdym razem, gdy tworzysz obiekt. To wszystko
Przykład:
Magento \ Framework \ Model \ ResourceModel \ AbstractResource
/**
* Abstract resource model
*/
abstract class AbstractResource
{
/**
* Main constructor
*/
public function __construct()
{
/**
* Please override this one instead of overriding real __construct constructor
*/
$this->_construct();
} ...
Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb
/**
* Class constructor
*
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
* @param string $connectionName
*/
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
$this->transactionManager = $context->getTransactionManager();
$this->_resources = $context->getResources();
$this->objectRelationProcessor = $context->getObjectRelationProcessor();
if ($connectionName !== null) {
$this->connectionName = $connectionName;
}
parent::__construct();
}