Parliamo del progetto
PHP symfony Sonata

Symfony 4 / Sonata : Utilizzare una chiave primaria con una /

Per quanto possa sembrare stranoître j’hai dovuto usare un'entità con una chiave primaria impostataésu un campo di tipo varchar, e alcuni valori contenevano un « / ».Finché l’non siamo confrontatiéal pro...

Symfony 4 / Sonata : Utilizzare una chiave primaria con una /

Per quanto possa sembrare stranoître j’hai dovuto usare un'entità con una chiave primaria impostataésu un campo di tipo varchar, e alcuni valori contenevano un « / ».

Finché l’non siamo confrontatiéal problèio, impossibile pensare che questo possa creare un problema. E lì c’è il dramma.

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.").

In breve, lo slash è interpretatoétédal génératore d’URL come una sépreparatore di l’URL e questo fa bloccare il sistemaèio.
Quindi, bisogna modificare il génératore d’URL per che’lo trasforma« / »in qualcos'altro (in pratica URL codificatoé), e poi in entrée bisogna modificare il valore della chiave primaria rétazzaéréper séselezionare l’oggetto per cui’faccia la trasformazione inversa.

Nel vostro file XxxAdmin.php, aggiungete l’interfaccia :

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

Poi aggiungete le due funzioni seguenti:

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

Adattare l’esempio alla versione installata

Gli esempi Symfony e Sonata rimangono legati alle versioni indicate nell’articolo. Symfony 4.x e Symfony 6.2 non sono più supportati: per un progetto attuale, utilizzate un ramo mantenuto e la documentazione corrispondente esattamente alle vostre dipendenze.

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

Prima di riprendere il codice, controllate le firme, i servizi, le rotte e i template interessati. Aggiungete poi un test funzionale che copra le autorizzazioni, il codice HTTP e il risultato visibile.

Riferimento : versioni di Symfony supportate.

Condividi questo articolo