Id dans url est complet VS id récupérer juste le dernier chiffre
Résolu
rdbn
Messages postés
95
Date d'inscription
Statut
Membre
Dernière intervention
-
rdbn Messages postés 95 Date d'inscription Statut Membre Dernière intervention -
rdbn Messages postés 95 Date d'inscription Statut Membre Dernière intervention -
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 :
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
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
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:
- Id dans url est complet VS id récupérer juste le dernier chiffre
- Url - Guide
- Id telephone - Guide
- Clavier iphone chiffre et lettre - Guide
- Recuperer message whatsapp supprimé - Guide
- Url masquée pour votre sécurité - Forum Réseaux sociaux
2 réponses
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 :)
/*@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 :)
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 :
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.
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.
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.
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.
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
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
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 !
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 !