Sử dụng các từ dành riêng trong Magento 2 URL


11

Có thể tạo một mô-đun trong Magento 2, bằng cách sử dụng định tuyến tiêu chuẩn, đáp ứng với URL ở dạng

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

Đó là - một URL trong đó tham số thứ hai là một từ khóa dành riêng cho PHP. Vấn đề với ở trên là tạo một tên lớp trình điều khiển PHP

Namespace\Module\Controller\Return\Index

và có Returntrong không gian tên là PHP bất hợp pháp. Tôi biết nếu tham số cuối cùng của URL (theo truyền thống được gọi là hành động) là một từ khóa dành riêng

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

Magento sẽ cho phép tôi tạo một lớp trình điều khiển có tên

Namespace\Module\Controller\Foo\ReturnAction

Tuy nhiên, điều này không làm việc cho tham số thứ hai.

Có cách nào để làm điều này bằng cách sử dụng các kỹ thuật định tuyến Magento 2 tiêu chuẩn không?

Nếu không, có thường được coi là thực hành tốt nhất để tiêm một đối tượng bộ định tuyến tùy chỉnh để có hành vi này, hoặc một số kỹ thuật khác sẽ cho phép tôi làm việc xung quanh vấn đề này? (một afterplugin trên Magento\Framework\App\Router\ActionList?)

Câu trả lời:


7

Tôi đã kết thúc việc thêm một plugin cho 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>

và sau đó thay đổi $namespacetham số của getphương thức

#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];
}

Điều này đã cho tôi một tên lớp của

Package\Module\Controller\ReturnAction\Index

Không chắc chắn ý tưởng này tốt như thế nào, vì vậy người mua hãy cẩn thận, v.v.


Điều này có vẻ tốt đẹp và dễ dàng. Đặc biệt bởi vì nó có thể được mở rộng cho tất cả các từ dành riêng cho php theo cùng cách các tên hành động được ánh xạ tới các lớp hành động. Một cách khác là tạo một bộ định tuyến tùy chỉnh nhưng điều này đòi hỏi nhiều mã hơn.
Marius

2
Chỉ một vài nhận xét: 1) Điều này sẽ thay đổi không gian tên cho bất kỳ mô-đun nào cố gắng sử dụng bộ điều khiển 'return'. Trừ khi bạn cố tình tạo ra một 'sản phẩm', tốt nhất nên kiểm tra tham số mô-đun $ để khớp với mô-đun của riêng bạn. 2) Nếu chúng ta sẽ cố gắng duy trì tính chẵn lẻ đặt tên, không gian tên $ được trả về có thể là 'returnContoder' - sau đó sẽ tìm kiếm không gian tên / filepath của ReturnContoder. Điều này sau đó sẽ tải \Namespace\Module\Controller\ReturnController\Index- mà chính xác hơn.
Jeremy Rimpo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.