Magento 2 – Create a Page with Dynamic URL Using Same Controller

dynamicmagento2url

I posted a question earlier but didn't able to understand the answer,

Magento 2: How to create a dynamic url with the same controller

i want to create a page with the dynamic url but with same controller to handle the requests,

for example: http://192.168.1.108/magento2/profile/id/jatin123 and http://192.168.1.108/magento2/profile/id/amit123

just able to get the id and display the results accoring to the id = "jatin123" display this user profile and id="amit123" display this user profile.

Please suggest a solution.

Best Answer

You can create it by with the help of Magento\Framework\App\RouterList. For this you need to create di.xml in your module (I am assuming that you know how to create module in M2). First create di.xml in below path,

app/code/yourvendor/yourmodule/etc/frontend/di.xml

In this file add

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\App\RouterList">
        <arguments>
            <argument name="routerList" xsi:type="array">
                <item name="cms" xsi:type="array">
                    <item name="class" xsi:type="string">YOURVENDOR\YOURMODULE\Controller\Router</item>
                    <item name="disable" xsi:type="boolean">false</item>
                    <item name="sortOrder" xsi:type="string">60</item>
                </item>
            </argument>
        </arguments>
    </type>
</config>

Now create a YOURVENDOR\YOURMODULE\Controller\Router but make sure that It should Implements \Magento\Framework\App\RouterInterface

    namespace YOURVENDOR\YOURMODULE\Controller;

    class Router implements \Magento\Framework\App\RouterInterface
    {

     /**
     * @var \Magento\Framework\App\ActionFactory
     */
    protected $actionFactory;

    /**
     * Event manager
     *
     * @var \Magento\Framework\Event\ManagerInterface
     */
    protected $_eventManager;

    /**
     * Store manager
     *
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $_storeManager;


    /**
     * Config primary
     *
     * @var \Magento\Framework\App\State
     */
    protected $_appState;

    /**
     * Url
     *
     * @var \Magento\Framework\UrlInterface
     */
    protected $_url;

    /**
     * Response
     *
     * @var \Magento\Framework\App\ResponseInterface
     */
    protected $_response;


  public function __construct(
        \Magento\Framework\App\ActionFactory $actionFactory,
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Framework\UrlInterface $url,        
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Framework\App\ResponseInterface $response
    ) {
        $this->actionFactory = $actionFactory;
        $this->_eventManager = $eventManager;
        $this->_url = $url;        
        $this->_storeManager = $storeManager;
        $this->_response = $response;
    }

     public function match(\Magento\Framework\App\RequestInterface $request)
       {
        $identifier = trim($request->getPathInfo(), '/');

        $condition = new \Magento\Framework\DataObject(['identifier' => $identifier, 'continue' => true]);

        $identifier = $condition->getIdentifier();

        if ($condition->getRedirectUrl()) {
            $this->_response->setRedirect($condition->getRedirectUrl());
            $request->setDispatched(true);
            return $this->actionFactory->create('Magento\Framework\App\Action\Redirect');
        }

        if (!$condition->getContinue()) {
            return null;
        }

        // check your custom condition here if its satisfy they go ahed othrwise set return null
        $satisfy=true;
        if (!$satisfy) {
            return null;
        }

        $request->setModuleName('yourmodule')->setControllerName('yourcontroller')->setActionName('youraction')->setParam('custom_id',"test" );
        $request->setAlias(\Magento\Framework\Url::REWRITE_REQUEST_PATH_ALIAS, $identifier);

        return $this->actionFactory->create('Magento\Framework\App\Action\Forward');
        }
    }

Alternatively you can also take help from Magento_Cms module. Magento team also doing the same.

Reference

app\code\Magento\Cms\etc\frontend\di.xml

and

app\code\Magento\Cms\Controller\Router.php

Related Topic