Вызов функции-члена dispatch() при нуле в vendor/magento/framework/Model/AbstractModel.php

#magento #magento2 #magento2.4

Вопрос:

Я хочу вставить некоторые данные при первой установке модуля.

Это моя структура папок

 Navien/Custom -- Setup/InstallData.php -- Model/  -- StateData.php  -- StateMaster.php  -- ResourceModel/  -- StateMaster.php  -- StateMaster/  -- Collection.php  

Вот содержание моего сценария InstallData.php

 use MagentoFrameworkSetupInstallDataInterface; use MagentoFrameworkSetupModuleContextInterface; use MagentoFrameworkSetupModuleDataSetupInterface; use MagentoEavSetupEavSetup; use MagentoEavSetupEavSetupFactory;  use MagentoEavModelConfig;  use NavienCustomModelStateData;  class InstallData implements InstallDataInterface {   private $eavSetupFactory;  private $eavConfig;  private $stateDataMaster;   public function __construct(EavSetupFactory $eavSetupFactory, Config $eavConfig, StateData $stateData)  {  $this-gt;eavSetupFactory = $eavSetupFactory;  $this-gt;eavConfig = $eavConfig;   $this-gt;stateDataMaster = $stateData;  }   public function install(  ModuleDataSetupInterface $setup,  ModuleContextInterface $context  )  {  $data = [  ['code' =gt; 'AL', 'name' =gt; 'Alabama', 'abbreviation' =gt; 'Ala.', 'country' =gt; 'US'],  ['code' =gt; 'AK', 'name' =gt; 'Alaska', 'abbreviation' =gt; 'Alaska', 'country' =gt; 'US']  ];   $this-gt;stateDataMaster-gt;insertStates($data);   } }  

Model/StateData.php

 namespace NavienCustomModel; use NavienCustomModelResourceModelStateMaster; use PsrLogLoggerInterface; use MagentoFrameworkViewElementTemplateContext;  // class StateData extends MagentoFrameworkViewElementTemplate class StateData {  protected $_logger;  protected $_stateMaster;  protected $_objectManager;   public function __construct(  LoggerInterface $logger,  StateMaster $stateMaster,  Context $context,  array $data = []  )   {  // parent::__construct($context, $data);  $this-gt;_objectManager = MagentoFrameworkAppObjectManager::getInstance();  $this-gt;_logger = $logger;  }   public function insertStates($states)  {  if( !empty( $states ) )  {  $stateMasterRepository = $this-gt;_objectManager-gt;get('NavienCustomModelStateMaster');  $stateData = $stateMasterRepository-gt;getCollection()-gt;getData();  foreach( $states as $key =gt; $state )  {  if( (array_search($state['code'], array_column($stateData, 'code')) === FALSE) )  {  $stateMaster = $this-gt;_objectManager-gt;get('NavienCustomModelStateMaster');   $stateMaster-gt;setData( $state );  $stateMaster-gt;save();  }  }  }  }   public function execute()  {   } }  

Model/StateMaster.php

 namespace NavienCustomModel; use MagentoFrameworkModelAbstractModel; use PsrLogLoggerInterface;  class StateMaster extends AbstractModel {  protected $_logger;   public function __construct(  LoggerInterface $logger  )   {  $this-gt;_init('NavienCustomModelResourceModelStateMaster');  } }  

Model/ResourceModel/StateMaster.php

 namespace NavienCustomModelResourceModel; use PsrLogLoggerInterface;  class StateMaster extends MagentoFrameworkModelResourceModelDbAbstractDb {  protected function _construct()  {  $this-gt;_init('navien_states','ID');  } }  

NavienCustomModelResourceModelStateMaster

 namespace NavienCustomModelResourceModelStateMaster;  class Collection extends MagentoFrameworkModelResourceModelDbCollectionAbstractCollection {  public function __construct(  MagentoFrameworkDataCollectionEntityFactory $entityFactory,  PsrLogLoggerInterface $logger,  MagentoFrameworkDataCollectionDbFetchStrategyInterface $fetchStrategy,  MagentoFrameworkEventManagerInterface $eventManager,  MagentoCatalogModelResourceModelProductOptionValueCollectionFactory $optionValueCollectionFactory,  MagentoStoreModelStoreManagerInterface $storeManager,  MagentoFrameworkDBAdapterAdapterInterface $connection = null,  MagentoFrameworkModelResourceModelDbAbstractDb $resource = null  ) {  $this-gt;_optionValueCollectionFactory = $optionValueCollectionFactory;  $this-gt;_storeManager = $storeManager;  parent::__construct(  $entityFactory,   $logger,   $fetchStrategy,   $eventManager,   $connection,   $resource  );  $this-gt;logger = $logger;     }  protected function _construct()  {  $this-gt;_init('NavienCustomModelStateMaster','NavienCustomModelResourceModelStateMaster');  } }  

Теперь я получаю эту ошибку

 Error: Call to a member function dispatch() on null in /var/www/dev/vendor/magento/framework/Model/AbstractModel.php:701  Stack trace: #0 /var/www/dev/vendor/magento/framework/Model/ResourceModel/Db/AbstractDb.php(412): MagentoFrameworkModelAbstractModel-gt;beforeSave()  #1 /var/www/dev/vendor/magento/framework/Model/AbstractModel.php(655): MagentoFrameworkModelResourceModelDbAbstractDb-gt;save()  #2 /var/www/dev/app/code/Navien/Custom/Model/StateData.php(62): MagentoFrameworkModelAbstractModel-gt;save()  

Ответ №1:

Это потому, что ваш конструктор не соответствует конструктору родительского блока.

Model/StateMaster.php

 namespace NavienCustomModel; use MagentoFrameworkModelAbstractModel;  

класс StateMaster расширяет абстрактную модель

 {  public function __construct(  MagentoFrameworkModelContext $context,  MagentoFrameworkRegistry $registry,  MagentoFrameworkModelResourceModelAbstractResource $resource = null,  MagentoFrameworkDataCollectionAbstractDb $resourceCollection = null,  array $data = []  ) {  parent::__construct($context, $registry, $resource, $resourceCollection, $data);  }    protected function _construct()  {  $this-gt;_init(NavienCustomModelResourceModelStateMaster::class);  } }