Как переопределить контроллер createpost magento 2?


Я переопределил контроллер \Magento\Customer\Controller\Account\CreatePost, используя предпочтения в di.xml, и хочу добавить коллекцию, используя заводской метод, но всегда получаю

Произошла ошибка типа при создании объекта

Даже я удалил сгенерированную папку и выполнил компиляцию, все еще сталкиваясь с той же проблемой.

Мой di.xml

<preference for="Magento\Customer\Controller\Account\CreatePost" type="Vendor\Modulename\Override\Account\CreatePost"/>

Мой Контроллер.

    <?php

        namespace Vendor\Modulename\Override\Account;

        use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
        use Magento\Customer\Model\Account\Redirect as AccountRedirect;
        use Magento\Customer\Api\Data\AddressInterface;
        use Magento\Framework\Api\DataObjectHelper;
        use Magento\Framework\App\Action\Context;
        use Magento\Customer\Model\Session;
        use Magento\Framework\App\Config\ScopeConfigInterface;
        use Magento\Framework\App\CsrfAwareActionInterface;
        use Magento\Framework\App\ObjectManager;
        use Magento\Framework\App\Request\InvalidRequestException;
        use Magento\Framework\App\RequestInterface;
        use Magento\Framework\Controller\Result\Redirect;
        use Magento\Framework\Exception\LocalizedException;
        use Magento\Framework\Phrase;
        use Magento\Store\Model\StoreManagerInterface;
        use Magento\Customer\Api\AccountManagementInterface;
        use Magento\Customer\Helper\Address;
        use Magento\Framework\UrlFactory;
        use Magento\Customer\Model\Metadata\FormFactory;
        use Magento\Newsletter\Model\SubscriberFactory;
        use Magento\Customer\Api\Data\RegionInterfaceFactory;
        use Magento\Customer\Api\Data\AddressInterfaceFactory;
        use Magento\Customer\Api\Data\CustomerInterfaceFactory;
        use Magento\Customer\Model\Url as CustomerUrl;
        use Magento\Customer\Model\Registration;
        use Magento\Framework\Escaper;
        use Magento\Customer\Model\CustomerExtractor;
        use Magento\Framework\Exception\StateException;
        use Magento\Framework\Exception\InputException;
        use Magento\Framework\Data\Form\FormKey\Validator;
        use Magento\Customer\Controller\AbstractAccount;

        class CreatePost extends \Magento\Customer\Controller\Account\CreatePost
{
    /**
     * @var \Magento\Customer\Api\AccountManagementInterface
     */
    protected $accountManagement;

    /**
     * @var \Magento\Customer\Helper\Address
     */
    protected $addressHelper;

    /**
     * @var \Magento\Customer\Model\Metadata\FormFactory
     */
    protected $formFactory;

    /**
     * @var \Magento\Newsletter\Model\SubscriberFactory
     */
    protected $subscriberFactory;

    /**
     * @var \Magento\Customer\Api\Data\RegionInterfaceFactory
     */
    protected $regionDataFactory;

    /**
     * @var \Magento\Customer\Api\Data\AddressInterfaceFactory
     */
    protected $addressDataFactory;

    /**
     * @var \Magento\Customer\Model\Registration
     */
    protected $registration;

    /**
     * @var \Magento\Customer\Api\Data\CustomerInterfaceFactory
     */
    protected $customerDataFactory;

    /**
     * @var \Magento\Customer\Model\Url
     */
    protected $customerUrl;

    /**
     * @var \Magento\Framework\Escaper
     */
    protected $escaper;

    /**
     * @var \Magento\Customer\Model\CustomerExtractor
     */
    protected $customerExtractor;

    /**
     * @var \Magento\Framework\UrlInterface
     */
    protected $urlModel;

    /**
     * @var \Magento\Framework\Api\DataObjectHelper
     */
    protected $dataObjectHelper;

    /**
     * @var Session
     */
    protected $session;

    /**
     * @var AccountRedirect
     */
    private $accountRedirect;

    /**
     * @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory
     */
    private $cookieMetadataFactory;

    /**
     * @var \Magento\Framework\Stdlib\Cookie\PhpCookieManager
     */
    private $cookieMetadataManager;

    /**
     * @var Validator
     */
    private $formKeyValidator;

    /**
     * @param Context $context
     * @param Session $customerSession
     * @param ScopeConfigInterface $scopeConfig
     * @param StoreManagerInterface $storeManager
     * @param AccountManagementInterface $accountManagement
     * @param Address $addressHelper
     * @param UrlFactory $urlFactory
     * @param FormFactory $formFactory
     * @param SubscriberFactory $subscriberFactory
     * @param RegionInterfaceFactory $regionDataFactory
     * @param AddressInterfaceFactory $addressDataFactory
     * @param CustomerInterfaceFactory $customerDataFactory
     * @param CustomerUrl $customerUrl
     * @param Registration $registration
     * @param Escaper $escaper
     * @param CustomerExtractor $customerExtractor
     * @param DataObjectHelper $dataObjectHelper
     * @param AccountRedirect $accountRedirect
     * @param Validator $formKeyValidator
     *
     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
     */
    public function __construct(
        Context $context,
        Session $customerSession,
        ScopeConfigInterface $scopeConfig,
        StoreManagerInterface $storeManager,
        AccountManagementInterface $accountManagement,
        Address $addressHelper,
        FormFactory $formFactory,
        SubscriberFactory $subscriberFactory,
        RegionInterfaceFactory $regionDataFactory,
        AddressInterfaceFactory $addressDataFactory,
        CustomerInterfaceFactory $customerDataFactory,
        CustomerUrl $customerUrl,
        Registration $registration,
        Escaper $escaper,
        CustomerExtractor $customerExtractor,
        DataObjectHelper $dataObjectHelper,
        AccountRedirect $accountRedirect,
        Validator $formKeyValidator = null,
        UrlFactory $urlFactory
    ) {
        $this->session = $customerSession;
        $this->scopeConfig = $scopeConfig;
        $this->storeManager = $storeManager;
        $this->accountManagement = $accountManagement;
        $this->addressHelper = $addressHelper;
        $this->formFactory = $formFactory;
        $this->subscriberFactory = $subscriberFactory;
        $this->regionDataFactory = $regionDataFactory;
        $this->addressDataFactory = $addressDataFactory;
        $this->customerDataFactory = $customerDataFactory;
        $this->customerUrl = $customerUrl;
        $this->registration = $registration;
        $this->escaper = $escaper;
        $this->customerExtractor = $customerExtractor;
        $this->urlModel = $urlFactory->create();
        $this->dataObjectHelper = $dataObjectHelper;
        $this->accountRedirect = $accountRedirect;
        $this->formKeyValidator = $formKeyValidator ?: ObjectManager::getInstance()->get(Validator::class);
        parent::__construct($context, $customerSession, $scopeConfig, $storeManager, $accountManagement, $addressHelper, $formFactory, $subscriberFactory, $regionDataFactory, $addressDataFactory, $customerDataFactory, $customerUrl, $registration, $escaper, $customerExtractor, $dataObjectHelper, $accountRedirect, $formKeyValidator=null, $urlFactory->create());
    }

            /**
             * Retrieve cookie manager
             *
             * @deprecated 100.1.0
             * @return \Magento\Framework\Stdlib\Cookie\PhpCookieManager
             */
            private function getCookieManager()
            {
                if (!$this->cookieMetadataManager) {
                    $this->cookieMetadataManager = ObjectManager::getInstance()->get(
                        \Magento\Framework\Stdlib\Cookie\PhpCookieManager::class
                    );
                }
                return $this->cookieMetadataManager;
            }

            /**
             * Retrieve cookie metadata factory
             *
             * @deprecated 100.1.0
             * @return \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory
             */
            private function getCookieMetadataFactory()
            {
                if (!$this->cookieMetadataFactory) {
                    $this->cookieMetadataFactory = ObjectManager::getInstance()->get(
                        \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory::class
                    );
                }
                return $this->cookieMetadataFactory;
            }

            /**
             * Add address to customer during create account
             *
             * @return AddressInterface|null
             */
            protected function extractAddress()
            {
                if (!$this->getRequest()->getPost('create_address')) {
                    return null;
                }

                $addressForm = $this->formFactory->create('customer_address', 'customer_register_address');
                $allowedAttributes = $addressForm->getAllowedAttributes();

                $addressData = [];

                $regionDataObject = $this->regionDataFactory->create();
                foreach ($allowedAttributes as $attribute) {
                    $attributeCode = $attribute->getAttributeCode();
                    $value = $this->getRequest()->getParam($attributeCode);
                    if ($value === null) {
                        continue;
                    }
                    switch ($attributeCode) {
                        case 'region_id':
                            $regionDataObject->setRegionId($value);
                            break;
                        case 'region':
                            $regionDataObject->setRegion($value);
                            break;
                        default:
                            $addressData[$attributeCode] = $value;
                    }
                }
                $addressDataObject = $this->addressDataFactory->create();
                $this->dataObjectHelper->populateWithArray(
                    $addressDataObject,
                    $addressData,
                    \Magento\Customer\Api\Data\AddressInterface::class
                );
                $addressDataObject->setRegion($regionDataObject);

                $addressDataObject->setIsDefaultBilling(
                    $this->getRequest()->getParam('default_billing', false)
                )->setIsDefaultShipping(
                    $this->getRequest()->getParam('default_shipping', false)
                );
                return $addressDataObject;
            }

            /**
             * @inheritDoc
             */
            public function createCsrfValidationException(
                RequestInterface $request
            ): ?InvalidRequestException {
                /** @var Redirect $resultRedirect */
                $resultRedirect = $this->resultRedirectFactory->create();
                $url = $this->urlModel->getUrl('*/*/create', ['_secure' => true]);
                $resultRedirect->setUrl($this->_redirect->error($url));

                return new InvalidRequestException(
                    $resultRedirect,
                    [new Phrase('Invalid Form Key. Please refresh the page.')]
                );
            }

            /**
             * @inheritDoc
             */
            public function validateForCsrf(RequestInterface $request): ?bool
            {
                return null;
            }

            /**
             * Create customer account action
             *
             * @return void
             * @SuppressWarnings(PHPMD.CyclomaticComplexity)
             * @SuppressWarnings(PHPMD.NPathComplexity)
             */
            public function execute()
            {
    }
    }
Author: Rising, 2019-12-27

2 answers

Не могли бы вы обновить __построить код и использовать приведенный ниже формат кода

public function __construct(
    Context $context,
    Session $customerSession,
    ScopeConfigInterface $scopeConfig,
    StoreManagerInterface $storeManager,
    AccountManagementInterface $accountManagement,
    Address $addressHelper,
    UrlFactory $urlFactory,
    FormFactory $formFactory,
    SubscriberFactory $subscriberFactory,
    RegionInterfaceFactory $regionDataFactory,
    AddressInterfaceFactory $addressDataFactory,
    CustomerInterfaceFactory $customerDataFactory,
    CustomerUrl $customerUrl,
    Registration $registration,
    Escaper $escaper,
    CustomerExtractor $customerExtractor,
    DataObjectHelper $dataObjectHelper,
    AccountRedirect $accountRedirect,
    Validator $formKeyValidator = null
) {
    $this->formKeyValidator = $formKeyValidator ?: ObjectManager::getInstance()->get(Validator::class);
    $this->accountRedirect = $accountRedirect;
    parent::__construct(
        $context,
        $customerSession,
        $scopeConfig,
        $storeManager,
        $accountManagement,
        $addressHelper,
        $urlFactory,
        $formFactory,
        $subscriberFactory,
        $regionDataFactory,
        $addressDataFactory,
        $customerDataFactory,
        $customerUrl,
        $registration,
        $escaper,
        $customerExtractor,
        $dataObjectHelper,
        $accountRedirect
    );
}
 2
Author: Vithal Bariya, 2019-12-27 12:29:10

Вы можете добавить свой вспомогательный объект следующим способом.

<?php
namespace Vendor\Module\Controller;

use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
use Magento\Customer\Model\Account\Redirect as AccountRedirect;
use Magento\Customer\Api\Data\AddressInterface;
use Magento\Framework\Api\DataObjectHelper;
use Magento\Framework\App\Action\Context;
use Magento\Customer\Model\Session;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\CsrfAwareActionInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\Request\InvalidRequestException;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Controller\Result\Redirect;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Phrase;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Customer\Api\AccountManagementInterface;
use Magento\Customer\Helper\Address;
use Magento\Framework\UrlFactory;
use Magento\Customer\Model\Metadata\FormFactory;
use Magento\Newsletter\Model\SubscriberFactory;
use Magento\Customer\Api\Data\RegionInterfaceFactory;
use Magento\Customer\Api\Data\AddressInterfaceFactory;
use Magento\Customer\Api\Data\CustomerInterfaceFactory;
use Magento\Customer\Model\Url as CustomerUrl;
use Magento\Customer\Model\Registration;
use Magento\Framework\Escaper;
use Magento\Customer\Model\CustomerExtractor;
use Magento\Framework\Exception\StateException;
use Magento\Framework\Exception\InputException;
use Magento\Framework\Data\Form\FormKey\Validator;
use Magento\Customer\Controller\AbstractAccount;

class Yourclass extends \Magento\Customer\Controller\Account\CreatePost
{
    /**
     * @var \Magento\Customer\Api\AccountManagementInterface
     */
    protected $accountManagement;

    /**
     * @var \Magento\Customer\Helper\Address
     */
    protected $addressHelper;

    /**
     * @var \Magento\Customer\Model\Metadata\FormFactory
     */
    protected $formFactory;

    /**
     * @var \Magento\Newsletter\Model\SubscriberFactory
     */
    protected $subscriberFactory;

    /**
     * @var \Magento\Customer\Api\Data\RegionInterfaceFactory
     */
    protected $regionDataFactory;

    /**
     * @var \Magento\Customer\Api\Data\AddressInterfaceFactory
     */
    protected $addressDataFactory;

    /**
     * @var \Magento\Customer\Model\Registration
     */
    protected $registration;

    /**
     * @var \Magento\Customer\Api\Data\CustomerInterfaceFactory
     */
    protected $customerDataFactory;

    /**
     * @var \Magento\Customer\Model\Url
     */
    protected $customerUrl;

    /**
     * @var \Magento\Framework\Escaper
     */
    protected $escaper;

    /**
     * @var \Magento\Customer\Model\CustomerExtractor
     */
    protected $customerExtractor;

    /**
     * @var \Magento\Framework\UrlInterface
     */
    protected $urlModel;

    /**
     * @var \Magento\Framework\Api\DataObjectHelper
     */
    protected $dataObjectHelper;

    /**
     * @var Session
     */
    protected $session;

    /**
     * @var AccountRedirect
     */
    private $accountRedirect;

    /**
     * @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory
     */
    private $cookieMetadataFactory;

    /**
     * @var \Magento\Framework\Stdlib\Cookie\PhpCookieManager
     */
    private $cookieMetadataManager;

    /**
     * @var Validator
     */
    private $formKeyValidator;

    protected $_customHelper;

    public function __construct(
        Context $context,
        Session $customerSession,
        ScopeConfigInterface $scopeConfig,
        StoreManagerInterface $storeManager,
        AccountManagementInterface $accountManagement,
        Address $addressHelper,
        UrlFactory $urlFactory,
        FormFactory $formFactory,
        SubscriberFactory $subscriberFactory,
        RegionInterfaceFactory $regionDataFactory,
        AddressInterfaceFactory $addressDataFactory,
        CustomerInterfaceFactory $customerDataFactory,
        CustomerUrl $customerUrl,
        Registration $registration,
        Escaper $escaper,
        CustomerExtractor $customerExtractor,
        DataObjectHelper $dataObjectHelper,
        AccountRedirect $accountRedirect,
        Validator $formKeyValidator = null,
        \Vendor\Module\etc\Helper $customHelper
    ) {
        parent::__construct(
            $context, 
            $customerSession, 
            $scopeConfig, 
            $storeManager, 
            $accountManagement, 
            $addressHelper, 
            $formFactory, 
            $subscriberFactory, 
            $regionDataFactory, 
            $addressDataFactory, 
            $customerDataFactory, 
            $customerUrl, 
            $registration, 
            $escaper, 
            $customerExtractor, 
            $urlFactory->create(), 
            $dataObjectHelper, 
            $accountRedirect, 
            $formKeyValidator ?: ObjectManager::getInstance()->get(Validator::class)
        );

        $this->_customHelper = $customHelper;
    }

    public function execute()
    {

    }
}
 0
Author: Ranganathan, 2019-12-27 11:44:07