I am not able to pass variables to controller from my observer file. Below is the code for observer:

 class Sendtogateway implements \Magento\Framework\Event\ObserverInterface
          protected $_responseFactory;
          protected $_url;
          protected $order;
            protected $logger;

            public function __construct(
                \Magento\Framework\App\ResponseFactory $responseFactory,
            \Magento\Framework\UrlInterface $url,
            \Magento\Sales\Api\Data\OrderInterface $order,
                \Psr\Log\LoggerInterface $loggerInterface
                $this->_responseFactory = $responseFactory;
            $this->_url = $url;
            $this->order = $order;
                $this->logger = $loggerInterface;

          public function execute(\Magento\Framework\Event\Observer $observer)
            $id = $observer->getEvent()->getOrder()->getIncrementId();
            $orderdetail = $this->order->loadByIncrementId($id);
            $url = "affrikpay/index/index/id/".$id;
            $customerBeforeAuthUrl = $this->_url->getUrl($url);


And calling variable in controller with

     public function execute()
           $id = $this->request->getParam('id');      
  • You shouldn't call a controller in your observer. That might be the cause of your problem. Can you give me more context of the exact problem? – David Lambauer Nov 18 '17 at 15:04
  • Thanks for your interest David , I am able to redirect to controller from observer but was not able to send the order id. – Ashish Sharma Nov 20 '17 at 7:36

Getting variable from param is not a reliable way, you should try using session, since you seem to be dealing with checkout use checkout session like following ;

Inject \Magento\Checkout\Model\Session into observer's constructor and set your variable like ;


you can get it on controller like following ;


namespace Vendor\Module\Controller\Demo;

class Demo extends \Magento\Framework\App\Action\Action

    protected $_checkoutSession;

    public function __construct(
        \Magento\Checkout\Model\Session $checkoutSession
    ) {

        $this->_checkoutSession = $checkoutSession;

    public function execute()
        $varValue = $this->_checkoutSession->getVariableName();


If you do want to do it using params , you are passing them wrongly, remove $url = "affrikpay/index/index/id/".$id; and use following in place of $customerBeforeAuthUrl = $this->_url->getUrl($url);

$query = ['id' => $id];
$customerBeforeAuthUrl = $this->_url->getUrl('affrikpay/index/index',['_use_rewrite' => true, '_query' => $query]);
| improve this answer | |
  • Thanks Neo, well I am using place order after observer so I think checkout session will be lost after place order. However I am able to get last order id in observer. I am trying to pass this order id to controller. Though checkout session I am not sure will work but yeah session is a good idea I will create my on session variable. Thanks for guiding me – Ashish Sharma Nov 20 '17 at 6:15
  • I have used session in a similar situation, so I suggested this. – Vivek Kumar Nov 20 '17 at 6:24
  • @AshishSharma please check updated answer – Vivek Kumar Nov 20 '17 at 6:40
  • I just want to confirm I am using observer to call the controller and send order detail from controller to payment gateway. Is observer a good choice or we can call controller with order id directly from knockout js etc. if there is any possibility please help :) – Ashish Sharma Nov 20 '17 at 7:02
  • session brought in value to controller thanks so much. U r champ 100 likes – Ashish Sharma Nov 20 '17 at 7:30

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.