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