Magento 2.1: Вызовите urlBuilder->getURL() в контроллере в пользовательском модуле


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

Что я хотел бы сделать, так это получить URL-адрес с помощью функции getUrl() из объекта Magento\Framework\UrlInterface.

Итак, это то, что у меня есть до сих пор.

  1. Создайте функциональный контроллер и настройте маршрут. Он доступен через веб-браузер и имеет определенную функцию execute().
  2. Добавить использование Magento\Framework\UrlInterface; в классе контроллера
  3. Добавить защищенный переменная $urlBuilder
  4. Добавьте конструктор, как показано ниже

    public function __construct(
        UrlInterface $urlBuilder
    ) {
        $this->urlBuilder = $urlBuilder;
    }
    

Следующая ошибка возникает, когда я перехожу на URL-адрес, к которому привязан контроллер.

Неустранимая ошибка: Неперехваченная ошибка типа: Аргумент 1 передан тестеру\Examplepaymentgateway\Контроллеру\Пример\Абстрактный пример\Запуск::__конструкция() должна реализовывать интерфейс Magento\Framework\URL-интерфейс, экземпляр Magento\Framework\Приложение\Действие\Заданный контекст, вызываемый в var/generation/Tester/ExamplePaymentGateway/Controller/Example/Start/Interceptor.php в строке 14 и определено в приложении/коде/Тестере/Examplepaymentgateway/Контроллере/Примере/абстрактном примере/Start.php:24
Трассировка стека:
#0 var/generation/Tester/ExamplePaymentGateway/Controller/Example/Start/Interceptor.php (14):
Tester\ExamplePaymentGateway\Controller\Example\AbstractExample\Start->__construct(Object(Magento\Framework\App\Action\Context), Объект (Magento\Клиент\Модель\Сессия\Перехватчик), Объект (Magento\Проверка\Модель\Сессия\Перехватчик), Объект (Magento\Продажи\Модель\зАказфАктория), Объект (Magento\Paypal\Модель\Экспресс\Проверка\Фабрика), Объект (Magento\Рамки\Сессия\Ge в app/code/Tester/ExamplePaymentGateway/Controller/Example/AbstractExample/Start.php в строке 24

Я пропустил какой-то шаг, прежде чем смогу ввести конструктор URL-адресов или любые другие объекты (скажем, цитату, корзину или помощник по оплате)?

Author: 7ochem, 2016-09-03

2 answers

Если ваш контроллер расширяется Magento\Framework\App\Action\Action, вы должны следовать правилам создания контроллера. Таким образом, вы должны реализовать внедрение зависимостей конструктора родительского класса (Magento\Framework\App\Action\Action):

/**
 * @param Context $context
 */
public function __construct(Context $context)
{
    parent::__construct($context);
    $this->_objectManager = $context->getObjectManager();
    $this->_eventManager = $context->getEventManager();
    $this->_url = $context->getUrl();
    $this->_actionFlag = $context->getActionFlag();
    $this->_redirect = $context->getRedirect();
    $this->_view = $context->getView();
    $this->messageManager = $context->getMessageManager();
}

Ваш метод построения должен выглядеть следующим образом после модификации:

/**
 * @param Context $context
 * @param UrlInterface $urlBuilder
 */
public function __construct(
    Context $context,
    UrlInterface $urlBuilder
) {
    parent::__construct($context);
    $this->urlBuilder = $urlBuilder;
}

ПРИМЕЧАНИЕ: не забудьте удалить старый каталогvar/generation после внесения изменений, потому что там хранятся сгенерированные файлы контроллеров.

 7
Author: Siarhey Uchukhlebau, 2016-09-03 12:24:29

На самом деле из контроллера вы можете использовать

$this->_url->getUrl('yourmoduleurl/index/index')
 10
Author: Ansyori, 2017-05-08 10:18:53