8768 sujets

Développement web côté serveur, CMS

Salut ici...

depuis je suis bloqué sur un problème bizarre là donc svp j'aurai besoin de vous.

J'ai un tableau associatif qui contient un ensemble d'expression regulieres comme ceci

$tab = [
	'blog' => '/blog/categorie-([0-9]+)/([0-9]+)-([a-z-]+)',
	'produit' => 'cart/details-produit-([a-zA-z0-9-]+)'
];

j'aimerais fais une fonction qui prend en parametre une cle du tableau
et génère l'URL correspondant aux arguments transmit

La fonction aura une signature comme celle-ci
function makeUrl(string $key, ...$params) : string


Par exemple

echo makeUrl('blog', 2, 3, 'cle-usb') // retourne "/blog/categorie-2/3-cle-usb"

echo makeUrl('blog', 10, 30, 'laptop') // retourne "/blog/categorie-10/30-laptop"

echo makeUrl('blog', 'erreur', 30, 'laptop') // renverai une erreur car le parametre "erreur" ne correspond pas a la regEX

echo makeUrl('produit', 'sac-a-main-gucci') // retourne "/cart/details-produit-sac-a-main-gucci"

Depuis je reflechis sur ça sans succès. Svp un coup de main me fera du bien
Salut,

Une expression rationnelle permet soit de trouver une occurence dans une chaîne, soit de remplacer une occurence par une chaîne. Ici, tu veux valider un format et construire une chaîne.

Pour valider un format, tu peux effectivement utiliser une regexp. PHP possède plusieurs fonctions pour ça : https://www.php.net/manual/fr/ref.pcre.php.

Pour construire la chaîne, il faut plutôt se tourner vers l'interpolation de chaîne, c'est à dire en PHP, l'utilisation des doubles guillemets. Tu peux aussi utiliser la fonction sprintf peut-être plus adaptée à ton besoin.
Modifié par Ostara (09 Aug 2020 - 20:47)
Bonjour,

Est-ce que votre tableau et la signature de votre fonction sont figées ?

Car en l'état, je pense que vous allez rapidement vous heurter à un gros problème le jour où vous devrez modifier l'ordre de vos paramètres dans votre URL.
Vous serez obligé de vérifier la totalité de votre code pour mettre l'ordre à jour, avec les risques d'oublis que cela suppose.

Pourquoi ne pas utiliser un composant qui a fait ses preuves, comme par exemple le redoutable système de routage de Symfony (https://symfony.com/doc/current/routing.html) ?

Si vous n'avez pas le temps d'intégrer ce composant, je vous suggère en seconde option de revoir la structure de votre tableau comme suit :

$tab = [
    'blog' => [
        'url' = '/blog/categorie-{categorie_id}/{categorie_libelle}',
        'url_parts' = [
            [
                'categorie_id' => '([0-9]+)',
                'categorie_libelle' => '([0-9]+)-([a-z-]+)',
            ]
        ]
    ],
    'produit' => [
        'url' = 'cart/details-produit-{produit_id}',
        'url_parts' = [
            [
                'produit_id' => '([a-zA-z0-9-]+)',
            ]
        ]
    ]        
];

Et mine de rien, ce tableau ainsi structuré vous donne énormément de pouvoir.
On verra cela plus bas Smiley cligne

En modifiant légèrement la signature de votre fonction makeUrl comme suit :
makeUrl(string $key, array $params) : string

Vous avez donc deux variables :
$key ne change pas, ca reste le nom de votre route
$params devient un array de paramètres.

Pour votre route blog cela donnerait donc ceci :

makeUrl('blog', [
    'categorie_id' => 132
    'categorie_libelle' => 'Bières belges'
]);

Trois avantages :
Vous gagnez en lisibilité (toute personne qui lit ce code comprend que 132 correspond à l'id de la catégorie)
Vous gagnez en flexibilité (si l'ordre des valeurs change dans l'URL change, le fait d'avoir un nom dans l'URL vous permet de permuter l'ordre sans devoir remodifier tout votre code)
Vous gagnez en facilité (l'ordre des paramètres dans l'appel de fonction makeUrl n'a aucune importance, puisqu'ils sont appellés par leur nom).

Et enfin, le contenu de votre fonction makeURL ressemblerait à quelque chose du genre
(je précise que j'ai juste tapé l'idée du code, il n'a pas été testé)

function makeUrl(string $key, array $params) {

    // 1. Vérifier que le nom de la route dans $key existe, sinon déclencher une exception
    if (array_key_exists($key, $tab)!==true) {
        throw new Exception('Nom de route inexistant');
    }
    
    // 2. On génère l'URL sur base de la route
    $url = $tab[$key]['url'];

    foreach($tab[$key]['url_parts'] as $URLPart) {
    
        // 2a : On valide le paramètre
        if (preg_match('/^'.$URLPart[1].'$/i', $params[$URLPart[0]])!==1) {
            throw new Exception('Le paramètre ['.$URLPart[0].'] de la route ['.$key.'] est invalide !');
        }

        // 2b : On injecte le paramètre dans l'URL
        $url = str_replace('{'.$URLPart[0].'}', $params[$URLPart[0]], $url);
    }

    // Et on retourne l'URL ainsi générée
    return($url);
}

Et donc on répond enfin à votre besoin : cette fonction permet de générer votre URL tout en vérifiant la validité des paramètres.

Bonne journée ! Smiley smile
Modifié par Bouchon (10 Aug 2020 - 15:46)