Magento 2.1: Вызовите urlBuilder->getURL() в контроллере в пользовательском модуле
Я думаю, что моя проблема может быть связана с внедрением зависимостей, которое я все еще пытаюсь понять.
Что я хотел бы сделать, так это получить URL-адрес с помощью функции getUrl()
из объекта Magento\Framework\UrlInterface
.
Итак, это то, что у меня есть до сих пор.
- Создайте функциональный контроллер и настройте маршрут. Он доступен через веб-браузер и имеет определенную функцию
execute()
. - Добавить использование
Magento\Framework\UrlInterface
; в классе контроллера - Добавить защищенный переменная
$urlBuilder
-
Добавьте конструктор, как показано ниже
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-адресов или любые другие объекты (скажем, цитату, корзину или помощник по оплате)?
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
после внесения изменений, потому что там хранятся сгенерированные файлы контроллеров.
На самом деле из контроллера вы можете использовать
$this->_url->getUrl('yourmoduleurl/index/index')