0

I have one online store with two store views, English and French.

How can I add different routes per store view in a custom module on a Magento 2.4 store, following the attached example?

EN: www.domain.com/welcome/index/start
FR: www.domain.com/bienvenue/index/start

Thank you!

1 Answer 1

1

Module name - Vendor_CustomUrlRouter

You have to create below listed files

1. Registration.php :: app/code/Vendor/CustomUrlRouter/registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(

    \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Vendor_CustomUrlRouter', __DIR__

);
?>

2. Module.xml :: app/code/Vendor/CustomUrlRouter/etc/module.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">

    <module name="Vendor_CustomUrlRouter" setup_version="2.0.0"></module>

</config>

3. di.xml :: app/code/Vendor/CustomUrlRouter/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
</config>

4. routes.xml :: app/code/Vendor/CustomUrlRouter/etc/frontend/routes.xml

<router id="standard">

    <route id="aksurlrouter" frontName="aksurlrouter">

        <module name="Vendor_CustomUrlRouter" />

    </route>

</router>

5. di.xml :: app/code/Vendor/CustomUrlRouter/etc/frontend/di.xml

Here we need to passing the router file path and the sort order for the router

<?xml version="1.0" encoding="UTF-8"?>

<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="akscustomurlrouter" xsi:type="array">

                    <item name="class" xsi:type="string">Vendor/CustomUrlRouter\Controller\Router</item>

                    <item name="disable" xsi:type="boolean">false</item>

                    <item name="sortOrder" xsi:type="string">61</item>

                </item>

            </argument>

        </arguments>

    </type>

</config>

6.Routes.php :: app/code/Vendor/CustomUrlRouter/Controller/Router.php

<?php

namespace Vendor/CustomUrlRouter\Controller;

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

    /**

     * @var \Magento\Framework\App\ActionFactory

     */

    protected $actionFactory;

    /**

     * Response

     *

     * @var \Magento\Framework\App\ResponseInterface

     */

    protected $_response;

    /**

     * @param \Magento\Framework\App\ActionFactory $actionFactory

     * @param \Magento\Framework\App\ResponseInterface $response

     */

    public function __construct(

    \Magento\Framework\App\ActionFactory $actionFactory, \Magento\Framework\App\ResponseInterface $response

    ) {
        $this->actionFactory = $actionFactory;

        $this->_response = $response;
    }

    /**
     * Validate and Match
     * @param \Magento\Framework\App\RequestInterface $request
     * @return bool
     */

    public function match(\Magento\Framework\App\RequestInterface $request) {

        /*

         * We can use any name of the URL to add and make condition for that name for redirect it. Here we can get customrouting 

         * If we got the same url it will redirect the request to controller action.

         * If we want to search “examplerouter” and “exampletocms” words to redirect the cutom router

         * using this example -examplerouter will forward to base router to match aksurlrouter front name, test the controller path and test controller class

         * -exampletocms will set for front name to cms, and controller path to page and action to view

         */

        //$a = explode('/', $_SERVER['REQUEST_URI']);

        //$postId = end($a);  [if you want to pass parameter also.]


        $identifier = trim($request->getPathInfo(), '/');

        if (strpos($identifier, 'exampletocms') !== false) {

            /* We must set module name, controller path and action name within need to set page id 5 witch is about us page on default magento 2 installation with sample data.
             */

            $request->setModuleName('cms')->setControllerName('page')->setActionName('view')->setParam('page_id', 4); // specify the page id

        } else if (strpos($identifier, 'customrouting') !== false) {

            /* We must set module name, controller path and action name for our controller is class(Controller/Test/Test.php)
            */

            $request->setModuleName('CustomRouter')->setControllerName('test')->setActionName('test');

            // $request->setParam('id', $postId); [if passing params]

        } else {

            //If it is no match
            return;

        }

        /*

         * We have match and now we will forward action

         */
        return $this->actionFactory->create(
            'Magento\Framework\App\Action\Forward', ['request' => $request]
        );

    }
}

/* you will face iteration error if the controller is not available you have to trying to access*/
?>

7. Test.php :: app/code/Vendor/CustomUrlRouter/Controller/Test/Test.php

<?php

namespace Vendor/CustomUrlRouter\Controller\Test;

class Test extends \Magento\Framework\App\Action\Action {

    /**

     * Listing all images in gallery

     *  -@param gallery id

     */
    public function execute() {

        die("Inchoo\\CustomRouter\\Controller\\Test\\Test controller execute()");

    }
}
2
  • Thank you! I used StoreManagerInterface to determine the current store and in this way I could serve different pages from different URLs on each store view. However, it seems that the old URLs (the base route) is still working. Is there a way to disable it?
    – Kloppo
    Commented Nov 17, 2022 at 14:34
  • 1
    In Steps 5 for disable change <item name="disable" xsi:type="boolean">false</item> to <item name="disable" xsi:type="boolean">true</item> Commented Nov 18, 2022 at 5:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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