Trao đổi về dự án
PHP symfony Sonata

Symfony 4 / Sonata : Sử dụng khóa chính với một /

Dù có vẻ lạ lùng, tôi đã phải sử dụng một thực thể với khóa chính được đặt trên trường varchar, và một số giá trị chứa " / ".Cho đến khi bạn đối mặt với vấn đề, thật không thể tưởng tượng nó sẽ gây ra sự cố. Và rồi, bi kịch bắt đầu. ...

Symfony 4 / Sonata : Sử dụng khóa chính với một /

Dù có vẻ lạ lùng, tôi đã phải sử dụng một thực thể với khóa chính được đặt trên trường varchar, và một số giá trị chứa " / ".

Cho đến khi bạn đối mặt với vấn đề, thật không thể tưởng tượng nó sẽ gây ra sự cố. Và rồi, bi kịch bắt đầu.

image
An exception has been thrown during the rendering of a template ("Parameter "id" for route "admin_app_wtype_edit" must match "[^/]++" ("MACHIN/CHOSE" given) to generate a corresponding URL.").

Nói ngắn gọn, dấu gạch chéo được hiểu bởi trình tạo URL như một dấu phân cách URL, làm sập hệ thống.
Vì vậy, bạn cần chỉnh sửa trình tạo URL sao cho nó chuyển " / " thành cái khác (cơ bản là mã hóa URL), và sau đó ở phía nhập vào, bạn cần chỉnh sửa giá trị khóa chính đã lấy để chọn đối tượng sao cho nó thực hiện phép chuyển đổi ngược lại.

Trong file XxxAdmin.php của bạn, thêm giao diện sau:

use Symfony\Component\Routing\Generator\UrlGeneratorInterface as RoutingUrlGeneratorInterface;

Sau đó thêm hai hàm sau:

 public function generateUrl($name, array $parameters = [], $absolute = RoutingUrlGeneratorInterface::ABSOLUTE_PATH)
    {
       
        if(!empty($parameters['id'])){
            $parameters['id'] = str_replace("/","%2F",$parameters['id']);
        }
        
        return $this->routeGenerator->generateUrl($this, $name, $parameters, $absolute);
    }
    
    public function getObject($id)
    {
        $id=str_replace("%2F","/",$id);

        $object = $this->getModelManager()->find($this->getClass(), $id);
        foreach ($this->getExtensions() as $extension) {
            $extension->alterObject($this, $object);
        }
    
        return $object;
    }

Điều chỉnh ví dụ cho phù hợp với phiên bản đã cài đặt

Các ví dụ Symfony và Sonata vẫn gắn với các phiên bản được chỉ ra trong bài viết. Symfony 4.x và Symfony 6.2 không còn được duy trì: đối với một dự án hiện tại, hãy sử dụng một nhánh được duy trì và tài liệu tương ứng chính xác với các phụ thuộc của bạn.

php bin/console about
composer show symfony/framework-bundle sonata-project/admin-bundle

Trước khi tiếp tục với mã, hãy kiểm tra các chữ ký, dịch vụ, tuyến đường và mẫu liên quan. Sau đó thêm một bài kiểm tra chức năng bao phủ quyền, mã HTTP và kết quả hiển thị.

Tham chiếu : phiên bản Symfony được hỗ trợ.

Chia sẻ bài viết