ใช้คำสงวนใน Magento 2 URL


11

เป็นไปได้หรือไม่ที่จะสร้างโมดูลใน Magento 2 โดยใช้การกำหนดเส้นทางมาตรฐานที่ตอบสนองต่อ URL ในรูปแบบของ

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

นั่นคือ - URL ที่พารามิเตอร์ที่สองคือคำหลักที่สงวนไว้ของ PHP ปัญหาข้างต้นคือการสร้างชื่อคลาสตัวควบคุม PHP ที่

Namespace\Module\Controller\Return\Index

และReturnใน namespace นั้น PHP ผิดกฎหมาย ฉันรู้ว่าพารามิเตอร์สุดท้ายของ URL (เรียกว่าการกระทำแบบดั้งเดิม) เป็นคำหลักที่สงวนไว้หรือไม่

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

วีโอไอพีนั้นให้ฉันสร้างคลาสคอนโทรลเลอร์ที่ชื่อ

Namespace\Module\Controller\Foo\ReturnAction

อย่างไรก็ตามสิ่งนี้ใช้ไม่ได้กับพารามิเตอร์ที่สอง

มีวิธีทำเช่นนี้โดยใช้เทคนิคการกำหนดเส้นทาง 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>

แล้วเล่นซอกับ$namespaceพารามิเตอร์ของgetวิธีการ

#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 ได้เช่นเดียวกับที่ชื่อการกระทำถูกแมปกับคลาสการดำเนินการ อีกทางเลือกหนึ่งคือการสร้างเราเตอร์ที่กำหนดเองแต่ต้องใช้รหัสเพิ่มเติม
Marius

2
ความคิดเห็นสองสามข้อเท่านั้น: 1) สิ่งนี้จะเปลี่ยนเนมสเปซสำหรับโมดูลใด ๆ ที่พยายามใช้ตัวควบคุม 'ส่งคืน' นอกจากว่าคุณตั้งใจสร้าง 'catchall' คุณควรตรวจสอบพารามิเตอร์ $ module เพื่อให้ตรงกับโมดูลของคุณเอง 2) หากเราจะพยายามรักษาความเท่าเทียมกันของการตั้งชื่อไว้เนมสเปซ $ ที่ส่งคืนควรจะเป็น 'returnController' ซึ่งจะค้นหาเนมสเปซ / สิ่งนี้จะโหลด\Namespace\Module\Controller\ReturnController\Index- ซึ่งมีความแม่นยำมากกว่า
Jeremy Rimpo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.