Id dans url est complet VS id récupérer juste le dernier chiffre

Résolu/Fermé
rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022 - Modifié le 28 août 2021 à 16:29
rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022 - 1 sept. 2021 à 09:56
Bonjour,


Je travail sur symfony,

Donc en gros, j'ai une page home avec des catégories qui m'envoie chacune sur une page de produit correspondant.

dans mon controller j'envoie bien l'id dans la route {id} :

/*@Route("/produit/{label}{id}", name="app_category_show")

dans mon template twig home je définie bien le path avec mon id :

{{ path('app_category_show', {label: category.label, id: category.id}) }}


Sur toutes les catégories une page s'ouvre et j'ai bien dans mon url le bonne id qui s'affiche à la fin de 1 à 20.

Dans cette page category je veux donc récupérer l'id passer dans l'url
Je fais donc un
app.request.get('id')

je récupère bien les id mais que jusque 9 pour 10 j'aurais 0, 11 j'aurais 1 etc il me prend que le dernière caractère de mon url ou de mon id je ne comprends trop pourquoi

Amicalement


Configuration: Windows / Chrome 92.0.4515.159
A voir également:

2 réponses

rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022
28 août 2021 à 16:32
J'ai résolu mon problème en modifiant la route

/*@Route("/produit/{id}{label}", name="app_category_show")

j'ai passer l'id avant le label et maintenant je récupère bien mes id au complet

15 j'ai bien 15 et pas 5 mais pourquoi ? J'aurais voulus avoir l'id d'affiché à la fin..

J'aimerais donc juste comprendre si quelqu'un sait pourquoi cette différence ?

Merci :)
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
30 août 2021 à 10:14
Bonjour,

C'est étrange de concaténer deux paramètres dans un seul fragment d'url pour la route, du coup il me semble que tu ne récupère qu'un seul paramètre (avec pour valeur l'id et le label concaténé).

Puisque id est un entier et label une chaine de caractère, la conversion du paramètre dans le type désirée change selon l'ordre de concaténation :
$id = 15;
$label = 'toto';

$param1 = $label . $id;

var_dump(strval($param1)); // "toto15"
var_dump(intval($param1)); // 0

$param2 = $id . $label;

var_dump(strval($param2)); // "15toto"
var_dump(intval($param2)); // 15

Voir plus de détail à ce sujet sur la doc php concernant la Manipulation des types/Transtypage.

Généralement chaque paramètre d'url utilise un fragment de l'url :
@Route("/produit/{id}/{label}"
Ou éventuellement ajouter un séparateur (un tiret "-" par exemple) pour récupérer les deux valeurs manuellement séparées dans le contrôleur :
@Route("/produit/{id}-{label}"

Enfin si le champ label de ton entité est unique, tu pourrais utiliser uniquement ce paramètre pour avoir des url plus propres (voir la notion de slug dans Symfony). L'id qui correspond à la clé primaire est une donnée technique dont le visiteur ne devrait pas avoir connaissance, l'id ne devrait idéalement pas être dans l'url.
0
rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022
31 août 2021 à 19:21
Bonsoir,

alors merci pour ta réponse, d'une part j'ai entre temps résolu la question par rapport à l'id et effectivement il fallait le séparé dans la route comme tu le dis
@Route("/produit/{label}_{id}")
le tiret n'est pas autorisé dans les routes sur symfony mais on aurais pu mettre un "/" mais ceci montrerais que nous somme sur une autre page et ce n'est pas le cas.
De plus comme tu le dis plus haut et c'est juste, j'ai également directement comparé avec le label entités comme il est unique cela fonctionne également et c'est ce que j'ai fais tout le problème avec l'id ne se pose plus.

MAIS je ne savais pas du tout que passé un id dans l'url pourrais être gênant par rapport à l'utilisateur ou du moins comment il pourrait l'utilisé mal intentionnellement.. car un id pourrais bien être une valeur unique fixe sans incrémentation exemple FR', pour moi un mot de passe oui des données confidentielles également mais un id je ne vois pas trop mais je ferais des recherches concernant ce sujet c'est intéressant..

Merci pour ton message.
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524 > rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022
Modifié le 31 août 2021 à 21:00
Les tirets sont bien autorisés dans les routes, et heureusement ! Le plus souvent, c'est ce caractère qui sera utilisé comme séparateur de mot dans une url, et pas le symbole underscore qui est plutôt considéré comme faisant partie du mot.

Concernant l'id dans l'url, il ne s'agit pas d’utilisation malintentionnée (ça, c'est ta responsabilité en tant que dev de sécuriser ton application Symfony, "never trust user input").
C'est (légèrement) gênant dans le sens où ça n'apporte aucune information pertinente pour le visiteur.
Si je veux accéder au produit "Voiture de luxe", c'est plus clair en tant que visiteur d'accéder à la page /produits/voiture-de-luxe que /produits/voiture-de-luxe_17. Ici la clé primaire du produit (17) n'apporte rien pour le visiteur et l'url sera plus propre si on peut s'en passer (donc si le label dans ton cas, appelé généralement slug, a bien une contrainte d'unicité dans l'entité).

Encore une fois, se renseigner sur le concept de "slug" dans Symfony. Une première source : https://symfony.com/doc/current/the-fast-track/fr/13-lifecycle.html
0
rdbn Messages postés 95 Date d'inscription samedi 3 avril 2021 Statut Membre Dernière intervention 26 décembre 2022 > Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022
Modifié le 1 sept. 2021 à 09:56
Bonjour,

C'est noté pour les url :)

bas je pense que pour moi, les tirets ne sont pas configuré. Car quand je mets un tiret entre {label} - {nom_du_produit} j'ai cette erreur :

An exception has been thrown during the rendering of a template ("Parameter "***************" for route "**************" must match "[^/\-]++" ("*******************" given) to generate a corresponding URL.").

En passant le concept de slug je ne connaissais pas merci !
0