Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Yii
Code

Construire votre démarrage: contrôle d'accès, relations d'enregistrement actives et slugs

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup With PHP: Localization With I18n
Building Your Startup With PHP: User Settings, Profile Images and Contact Details

French (Français) translation by honeymmmm (you can also view the original English article)

Final product image
What You'll Be Creating

Ceci est la cinquième partie de la série Construire son démarrage avec PHP sur Tuts +. Dans cette série, je vous guide dans le lancement d'une startup du concept à la réalité en utilisant mon application Meeting Planner comme exemple concret. À chaque étape, nous publierons le code de Meeting Planner sous forme d’exemples open source à partir desquels vous pourrez apprendre. Nous aborderons également les problèmes commerciaux liés au démarrage au fur et à mesure qu'ils surviennent.

Tout le code de Meeting Planner est écrit dans le framework Yii2 pour PHP. Si vous souhaitez en savoir plus sur Yii2, consultez notre série parallèle Programmation avec Yii2 à Tuts +.

Dans ce didacticiel, je vais vous expliquer plus de fonctionnalités du framework Yii qui rendront notre code de gestion des espaces existant plus robuste. Nous allons implémenter les contrôles d'accès simples de Yii pour garantir que seuls les utilisateurs connectés ajoutent des lieux. Nous allons utiliser les relations Active Record afin que seuls les espaces ajoutés par l'utilisateur apparaissent dans leur affichage de la page d'index des espaces. Nous allons également utiliser les comportements sluggables de Yii pour implémenter des slugs conviviaux pour les URL afin d'afficher ces lieux. Et nous allons faire un peu plus de nettoyage et de polissage autour des fonctionnalités de Place.

Juste un rappel, je participe aux commentaires ci-dessous. Je suis particulièrement intéressé si vous avez des approches différentes ou des idées supplémentaires, ou si vous souhaitez suggérer des sujets pour de futurs tutoriels. Je me félicite également des demandes de fonctionnalités pour Meeting Planner.

Contrôle d'accès

Le code que nous avons écrit jusqu'à présent permet à quiconque de créer des espaces, même s'ils ne se sont pas connectés. Nous pouvons utiliser les fonctionnalités de contrôle d'accès simples de Yii2 pour garantir que les utilisateurs s'enregistrent et se connectent avant d'ajouter et d'afficher des espaces.

Yii2 propose également un contrôle d'accès basé sur le rôle (RBAC) plus avancé (et complexe) que nous ne mettrons pas en œuvre pour le moment.

Si les utilisateurs ne sont pas connectés lorsqu'ils visitent les pages de lieu, Yii les redirigera vers la page de connexion.

Le contrôle d'accès intégré de Yii2 ne prend en charge que deux rôles par défaut: invité (non connecté), représenté par '?', Et authentifié, représenté par '@'. Si cela vous intéresse, Code Ninja a donné un bel exemple d’extension permettant de prendre en charge les modérateurs et les administrateurs (autorisation simplifiée basée sur les rôles dans Yii 2.0) sans recourir à RBAC.

Le cadre facilite la mise en œuvre de ces contrôles. Nous ajoutons simplement des comportements au PlaceController.php qui définissent les règles d’accès pour chaque action, par exemple. indexer, créer, voir, etc. Nous examinerons ici le comportement d'accès, mais si cela vous intéresse, les filtres de verbe de Yii vous permettent de restreindre les opérations http en fonction de l'action de votre contrôleur.

Une fois ajouté, si vous cliquez sur le menu Lieux, vous serez redirigé vers la page de connexion:

Meeting Planner Login Page

Yii gère également la redirection vers la page d'index une fois la connexion établie.

Lorsque les utilisateurs accèdent aux pages de lieu, nous pouvons trouver l'utilisateur actuel avec ce code:

Yii::$app->user->getId();

Donc, juste avant que de nouveaux lieux soient enregistrés, nous pouvons mettre à jour le champ created_by pour l'utilisateur actuellement connecté. Et nous pouvons faire confiance aux contrôles d'accès pour garantir que la méthode create n'est accessible qu'aux utilisateurs authentifiés:

Relations d'enregistrement actives

Dans Meeting Planner, je souhaite connaître le premier utilisateur à créer un lieu. Ceci est stocké dans le champ created_by. Nous voulons également suivre les lieux suggérés et utilisés par les utilisateurs pour leurs réunions, la fréquence à laquelle ils utilisent les lieux et leurs favoris. Nous utilisons la table UserPlace pour cela.

Maintenant que nous savons quel utilisateur est connecté lorsque nous créons un espace, nous souhaitons également renseigner une ligne relationnelle dans la table UserPlace.

Tout d'abord, nous devons utiliser le générateur de code de Yii, Gii (http://localhost:8888/mp/index.php/gii/model), pour créer un modèle pour UserPlace:

Meeting Planner Yii2 Gii Model Generator User Place

Ensuite, lorsqu'un lieu est ajouté avec succès, nous voulons créer un enregistrement dans la table UserPlace pour l'utilisateur actif. Nous pouvons étendre Yii ActiveRecord avec la méthode afterSave. Dans le modèle Place, nous ajoutons:

Dans le modèle UserPlace, nous ajoutons la fonction:

Lorsque l'utilisateur visite la page d'index des lieux, nous souhaitons afficher uniquement les lieux qu'il a utilisés, uniquement ceux de la table UserPlace pour cet utilisateur.

Je vais vous expliquer deux manières différentes d'y parvenir. Comme je gagne toujours en expérience avec Yii2.x, les détails de la meilleure approche étaient nouveaux pour moi. Je tiens à remercier Alex Makarov, un développeur de Yii qui gère également YiiFeed.com, pour son aide. Lui et le fondateur de Yii, Qiang Xue, ont été très utiles pour répondre aux questions et soutenir mes efforts avec ces tutoriels sur Yii.

L'approche la plus simple

Le moyen le plus simple consiste à joindre la table Place à la table UserPlace de la propriété UserPlace.place_id en filtrant UserPlace.user_id avec l'utilisateur actuellement authentifié.

Voici la méthode du contrôleur d'index par défaut:

Nous allons créer une nouvelle méthode de contrôleur appelée Yours:

Notez que joinWith('userPlaces') utilise la requête relationnelle générée par Gii dans Place.php. Cela peut être un peu déroutant si vous omettez le préfixe "get":

Nous devons également modifier la classe PlaceSearch:

Une approche alternative

Un autre moyen d'implémenter cela consiste à utiliser un contrôleur UserPlace. Après tout, nous visionnons "les lieux de l'utilisateur". Dans ce cas, nous pouvons apporter une légère modification à la méthode d’indexation du contrôleur générée par Gii:

Ensuite, dans /views/user-place/index.php, nous devons modifier les chemins de liaison générés et l’accès aux données de modèle, par exemple. /place/create_place_google:

Dans le widget Grid View, nous utilisons la relation UserPlace avec la table Place pour accéder aux propriétés du dernier modèle, par exemple $model->place->slug:

L'approche UserPlace nécessite quelques modifications aux liens autour des chemins de navigation, des liens d'action de widget et des boutons de commande, mais reste assez simple.

Si vous examinez le code dans cette version, vous pouvez voir les espaces de l'utilisateur à la fois: http://localhost:8888/mp/place/yours et http://localhost:8888/mp/user-place. Il est intéressant de voir comment vous pouvez réaliser cette fonctionnalité avec deux approches différentes au sein de Yii.

Slugs

Une fois que vous avez activé de jolies URL dans le framework Yii, la page d'affichage d'un objet de modèle ressemble généralement à http://meetingplanner.com/place/692, où 692 représente l'ID de l'objet à afficher. En plus d'être indescriptible pour l'utilisateur, il est également moins efficace avec les moteurs de recherche. Il est préférable d'utiliser des chaînes conviviales pour les URL telles que http://meetingplanner.com/place/caffe-seattle. La chaîne est parfois appelée limace. Yii2 fournit un support intégré pour les slugs, sous la forme de comportements Sluggable. Les comportements font partie de la prise en charge de Yii Active Record et peuvent être appliqués automatiquement aux modèles d'objet de données.

Dans notre modèle de lieu, nous avons ajouté une propriété slug. Voici comment nous implémentons le comportement Sluggable dans le modèle d'emplacement:

Yii veillera, lors de l'opération save(), à ce que le champ slug soit rempli avec une version du champ de nom adaptée aux URL. En d'autres termes, si le nom de lieu est Oddfellows Cafe, la limace sera oddfellows-café.

La propriété immuable garantit que le slug ne change jamais, même si le nom convivial est modifié. Ceci est utile pour conserver des liens vers des lieux ainsi que des références à des moteurs de recherche.

La propriété EnsureUnique génère un slug unique en ajoutant automatiquement un index de suffixe.

Le générateur de code automatisé de Yii, Gii, relie généralement les objets par des identifiants numériques. Nous voulons changer ces liens pour utiliser la limace. Ce code existe à deux endroits.

Le premier se trouve sur la page d'index de lieu dans les colonnes d'action de la grille. Vous pouvez personnaliser ces liens comme ceci dans /frontend/views/places/index.php:

L'autre endroit est dans la chapelure:

Meeting Planner Breadcrumbs

Par exemple, dans /frontend/views/place/update.php, nous devons changer ceci:

Remplacement du code d'identification de la vue pour utiliser le slug:

Nettoyage et polonais

Au fur et à mesure de la construction de Meeting Planner, des sprints de code seront créés pour créer de nouvelles fonctionnalités et périodes nécessaires au nettoyage et au polissage. Ce sera probablement un cycle répétitif.

Je vais passer en revue quelques scénarios que je souhaite aborder à ce stade. Bien entendu, des zones de nettoyage continueront d’être nécessaires tant que nous élaborons du code, prenons en compte les commentaires des utilisateurs et améliorons le produit.

Extension de la barre de navigation

Yii2 est bien intégré à Bootstrap, pour que vos applications aient fière allure et s'exécutent de manière réactive tout de suite. Si vous souhaitez créer une barre de navigation avec des menus déroulants, il est utile de consulter la documentation de Bootstrap et de comprendre l'utilisation par Yii2 de la notation à tableaux courts en PHP. La documentation du widget Yii2 Navbar ne fournit pas beaucoup d'exemples pour le moment.

J'ai décidé de commencer à mettre à jour la navigation de Meeting Planner avec certains menus déroulants basés sur l'état de l'utilisateur, par exemple. invité ou authentifié.

Bootstrap Dropdown Menu in Meeting Planner

Voici le code qui implémente ce qui précède - je suis sûr que je vais continuer à le modifier au fur et à mesure:

Valider les modèles correctement avant de les enregistrer

J'ai réécrit les actions de création dans PlaceController pour valider les modèles avant d'essayer d'ajouter des relations UserPlace. Dans certains cas, des données non valides pourraient être soumises, ce qui aurait pour effet de faire échec aux tentatives d’ajout de relations. Cela garantit également que les utilisateurs seront renvoyés au formulaire avec des messages d'erreur conviviaux en cas d'échec des validations.

Prévenir les doublons

Dans notre code de création de lieu initial, nous voulons nous protéger contre les doublons. Les lieux peuvent avoir des noms identiques, par exemple il y a beaucoup de cafés Starbucks (beaucoup trop), mais nous voulons éviter que le lieu exact soit créé deux fois, par exemple Starbucks Coffee avec le même identifiant Google Place ou un nom et une adresse identiques.

Yii offre aux validateurs de modèles qui s’intègrent avec ActiveForms une grande partie de ce travail pour nous. Voici les règles que nous définirons dans le modèle Place:

Les validateurs peuvent appliquer les champs obligatoires ainsi que les types et la longueur de champs. Ils peuvent également valider des URL, comme avec le champ de site Web ci-dessus, des adresses électroniques, etc. Vous pouvez également écrire des validateurs personnalisés.

Il existe plusieurs validateurs intégrés spécifiques à l'unicité. Par exemple, ils peuvent valider l'unicité d'un champ comme nous l'avons fait avec le champ slug. Mais il existe également des validateurs d'unicité plus complexes.

Lorsque l'utilisateur ajoute un emplacement avec Google Autocomplete, nous voulons imposer l'unicité du résultat google_place_id dans le champ masqué, mais nous souhaitons que le message d'erreur apparaisse dans le champ searchbox. Cette définition l'accomplit:

Nous voulons également nous assurer que le nom et l'adresse sont uniques ensemble. En d'autres termes, plusieurs lieux peuvent avoir le même nom ou la même adresse mais aucun lieu ne peut être identique dans les deux champs. Cette définition fait que:

Bien entendu, de nombreux utilisateurs peuvent ajouter le même endroit à leur liste de UserPlaces.

Éliminer la suppression

Je souhaite également protéger contre la suppression de lieux. Le générateur de code automatisé de Yii, Gii, comporte généralement des liens pour supprimer des opérations de la grille d'index et mettre à jour des pages. Nous voulons supprimer ceux-ci. Et nous voulons limiter l'accès à l'action de suppression à partir du contrôleur.

Voici un exemple de page d'index d'emplacement avec des icônes de suppression:

Meeting Planner Place Index Page with Delete Action

Lorsque nous avons personnalisé les liens slug ci-dessus, nous avons éliminé l'utilisation par défaut de la commande delete.

En passant, j’apprécie vraiment l’utilisation de Bootstrap et des glyphiques par Yii. Ils travaillent à merveille.

Voici la page d'affichage avec son bouton de suppression:

Meeting Planner Update with Delete button

Pour l'instant, commentons le code du bouton Supprimer dans /frontend/views/place/view.php. Nous voudrons peut-être le rajouter pour les administrateurs à un moment donné.

Empêcher la saisie semi-automatique de saisir la clé

Alors que je construisais une partie du code de saisie semi-automatique HTML5 et Google Places, quelques erreurs se sont produites, certaines liées à JavaScript.

Par exemple, si vous cliquez sur la touche Entrée après avoir saisi le champ de saisie semi-automatique, Google envoie le formulaire. Nous devons outrepasser cela.

Dans notre create_place.js, nous ajoutons un gestionnaire de clés pour empêcher le formulaire de soumettre:

Maintenant, lorsque vous appuyez sur Enter, vous verrez la carte sur la page et pourrez modifier le reste du formulaire avant de le soumettre.

Create a Place from Google Places

Examen des avantages de l'utilisation d'un cadre

Beaucoup de gens pensent que PHP est une plate-forme moins sérieuse ou moins performante. Pour moi, le succès de Facebook avec PHP leur a toujours prouvé le contraire.

Beaucoup de gens n'ont pas entendu parler du framework Yii ou ont rejeté la valeur des frameworks.

Peu de temps après, dans cette série de startups, nous avons déjà bénéficié d'un grand nombre de fonctionnalités du framework de Yii: accélération du développement, création d'une architecture propre et code de qualité:

  • Architecture MVC
  • migrations de bases de données
  • Relations et validation du modèle Active Record
  • génération automatique de code
  • Intégration Bootstrap et Glyphicons
  • filtres de contrôle d'accès
  • comportements de limaces
  • internationalisation

C'est pourquoi je suis un ardent défenseur du cadre Yii. Cela fait de moi un développeur beaucoup plus efficace, capable de fournir des solutions beaucoup plus rapidement qu'avec le PHP vanille.

Et après?

Dans le prochain tutoriel Construire votre démarrage avec PHP, nous allons développer la prise en charge des paramètres utilisateur, des contacts et des images de profil.

N'hésitez pas à ajouter vos questions et commentaires ci-dessous; Je participe généralement aux discussions. Vous pouvez également me joindre sur Twitter @reifman ou m'envoyer un courriel directement.

Liens connexes

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.