Magento 2のURLで予約語を使用する


11

Magento 2で、標準のルーティングを使用して、次の形式のURLに応答するモジュールを作成することは可能ですか?

http://magento.example.com/namespace_module/return/index

つまり、2番目のパラメーターがPHPの予約済みキーワードであるURL です。上記の問題は、PHPコントローラークラス名を作成することです。

Namespace\Module\Controller\Return\Index

そしてReturn名前空間にいることは違法なPHPです。URLの最後のパラメーター(伝統的にアクションと呼ばれていました)が予約済みのキーワードだったかどうか

http://magento.example.com/namespace_module/foo/return

Magentoでは、次の名前のコントローラークラスを作成できます。

Namespace\Module\Controller\Foo\ReturnAction

ただし、これは2番目のパラメーターに対しては機能しません。

標準のMagento 2ルーティング技術を使用してこれを行う方法はありますか?

そうでない場合、この動作を実現するためにカスタムルーターオブジェクトを挿入するための一般的に考えられるベストプラクティス、またはこれを回避できる他のいくつかの手法はありますか?(afterプラグインMagento\Framework\App\Router\ActionList?)

回答:


7

プラグインを追加してしまいました Magento\Framework\App\Router\ActionList

<!-- File: app/code/Package/Namespace/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">
    <type name="Magento\Framework\App\Router\ActionList">
        <plugin name="package_module_magento_framework_app_router_actionlist" type="Package\Module\Plugin\Magento\Framework\App\Router\ActionList"/>
    </type>
</config>

そして$namespacegetメソッドのパラメータをいじる

#File: app/code/Package/Module/Plugin/Magento/Framework/App/Router/ActionList.php
public function beforeGet($subject, $module, $area, $namespace, $action)
{
    if($namespace === 'return')
    {
        $namespace = 'returnaction';
    }
    return [$module, $area, $namespace, $action];
}

これは私にクラス名を与えました

Package\Module\Controller\ReturnAction\Index

これがどれほど良いアイデアかわからないので、バイヤーは注意してください。


これは見た目も簡単です。特に、アクション名がアクションクラスにマッピングされるのと同じ方法で、すべてのphp予約語に拡張できるためです。別の方法はカスタムルーターを作成することですが、これにはさらに多くのコードが必要です。
マリウス

2
いくつかのコメントのみ:1)これにより、「return」コントローラーを使用しようとするすべてのモジュールの名前空間が変更されます。意図的に「キャッチオール」を作成しているのでない限り、$ moduleパラメータをチェックして自分のモジュールと一致させるのが最善です。2)ネーミングパリティを保持しようとする場合、返される$ namespaceはおそらく 'returnController'である必要があります。これにより、ReturnController名前空間/ファイルパスが検索されます。これがロードされます\Namespace\Module\Controller\ReturnController\Index-より正確です。
Jeremy Rimpo 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.