Comment programmer avec Yii2 Comportement Sluggable

Ce que vous allez créer

Si vous demandez, "Qu'est-ce que Yii?" Découvrez mon tutoriel précédent: Introduction au framework Yii, qui passe en revue les avantages de Yii et inclut un aperçu des nouveautés de Yii 2.0, publiées en octobre 2014.

Dans cette série de programmation avec Yii2, je guide les lecteurs dans l'utilisation du framework Yii2 pour PHP récemment mis à jour. Dans ce tutoriel, je vais vous montrer comment modifier les itinéraires d'URL de vue par défaut de Yii pour que les objets de modèle soient plus conviviaux et adaptés aux moteurs de recherche. Yii fournit un support intégré pour cela via ses comportements sluggable.

Pour ces exemples, nous allons continuer à imaginer que nous construisons un cadre pour la publication de mises à jour de statut simples, par exemple. notre propre mini-Twitter.

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

Qu'est-ce qu'une limace??

Également appelée URL sémantique, Wikipedia dit "… un limace [est] la partie d'une URL qui identifie une page à l'aide de mots clés lisibles par l'homme. "Par exemple, l'URL Yii par défaut de la page de notre vue Statut ci-dessous est la suivante:

http: // localhost: 8888 / hello / status / view? id = 3

Cette URL ne dit rien à l'utilisateur ni aux moteurs de recherche sur son contenu. En implémentant des slugs, nous pouvons accéder à la page avec une URL telle que:

http: // localhost: 8888 / hello / status / regarder-en avant vers le super-bol

Yii2 rend la construction de slugs plus facile que jamais, en utilisant ses comportements ActiveRecord, spécifiquement SluggableBehavior.

Implémentation de SluggableBehavior

Ajouter une colonne Slug à la table d'état

Pour ajouter la prise en charge slug à notre application Hello, nous allons commencer par créer une migration ActiveRecord pour ajouter une colonne slug à notre table Status..

./ yii migrate / create extend_status_table_for_slugs Outil de migration Yii (basé sur Yii v2.0.1) Créer une nouvelle migration '/Users/Jeff/Sites/hello/migrations/m150128_214906_extend_status_table_for_slugs.php' (oui | non) [non]: oui Nouvelle migration créée avec succès.

Voici la migration que vous devriez utiliser:

db-> nomDuPort === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> addColumn ('% status', 'slug', Schema :: TYPE_STRING. 'NOT NULL');  public function down () $ this-> dropColumn ('% status', 'slug');  

Puis appliquez la migration:

./ yii migrate / up Yii Outil de migration (basé sur Yii v2.0.1) Total 1 nouvelle migration à appliquer: m150128_214906_extend_status_table_for_slugs Appliquer la migration ci-dessus? (yes | no) [no]: yes *** application de m150128_214906_extend_status_table_for_slugs> ajouter une chaîne slug chaîne NOT NULL à la table % status… done (heure: 0.022s) up avec succès.

Ajouter le comportement SluggableBehavior au modèle d'état

Ensuite, nous ajoutons le comportement sluggable à la apps \ models \ Status.php modèle:

 SluggableBehavior :: className (), 'attribut' => 'message', // 'slugAttribute' => 'slug',],]; 

le slugAttribute n'est pas nécessaire puisque notre colonne s'appelle limace, le cadre par défaut.

Tester l'attribut Slug

Testons cette fonctionnalité en créant un nouvel élément d'état. Du Statut menu, cliquez Créer:

À l'aide de PHPMyAdmin, je regarderai le tableau Status et constaterai que le champ slug a été automatiquement renseigné par une version conviviale du message Status que j'ai entré..

Mais vous remarquerez peut-être que l'URL de la page d'affichage continue à identifier le message par son ID numérique:

http: // localhost: 8888 / hello / status / view? id = 4

Comment pouvons-nous changer cela?

Implémentation de slugs dans les liens d’action de grille

Dans app \ views \ status \ index.php, nous devons mettre à jour la vue de grille avec un lien personnalisé. Ce lien va coder l'URL appropriée pour notre slug dans la vue:

  $ dataProvider, 'filterModel' => $ searchModel, 'columns' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'message: ntext', 'permissions', 'created_at', 'updated_at', ['class' => 'yii \ grid \ ActionColumn', 'template' => 'view update delete', 'buttons' => ['view' => function ($ url , $ model) return Html :: a ('',' status /'.$ model-> slug, ['title' => Yii :: t ('yii', 'View'),]); ],],],]); ?>

Maintenant, lorsque vous visitez la page d'index, vous verrez le lien de vue résolu comme suit:

http: // localhost: 8888 / hello / status / test-the-slug-attribut

Bien sûr, cette page n'existe pas encore. Nous devons construire un support pour cela dans notre contrôleur.

Implémentation de slugs dans des routes

Yii analyse les demandes entrantes en utilisant un ensemble de règles par défaut intégré à son UrlManager. Nous devons ajouter un support pour notre route de slug personnalisée dans l'application app \ config \ web.php:

 'composants' => ['urlManager' => ['showScriptName' => false, 'enablePrettyUrl' => true, 'rules' => ['status' => 'status / index', 'status / index' => 'status / index', 'status / create' => 'status / create', 'status / view /'=>' status / view ',' status / update /'=>' status / update ',' status / delete /'=>' status / delete ',' status /'=>' status / slug ',' defaultRoute '=>' / site / index ',], 

Maintenant, quand une URL est dans http: // localhost: 8888 / hello / status / test-the-slug-attribut, Yii dirigera la requête vers l'action slug de StatusController avec le paramètre ou dans ce cas "test-the-slug-attribute".

Notez que nous avons également défini statut / index et statut / créer spécifiquement dans la route, sinon Yii pourrait penser que "index" ou "créer" étaient des slugs.

Mise en œuvre de l'action du contrôleur Slug

Ensuite, nous ajoutons une nouvelle action de contrôleur appelée slug à StatusController.php. C'est comme la vue sauf qu'elle fonctionne à partir de la colonne slug:

/ ** * Affiche un seul modèle de statut. * @param integer $ id * @return mixed * / public function actionView ($ id) return $ this-> render ('view', ['model' => $ this-> findModel ($ id),]);  / ** * Affiche un seul modèle de statut. * @param string $ slug * @return mixed * / public function actionSlug ($ slug) $ model = Status :: find () -> Où (['slug' => $ slug]) -> un (); if (! is_null ($ model)) return $ this-> render ('view', ['model' => $ model,]);  else return $ this-> redirect ('/ status / index');  

Maintenant, lorsque vous visitez la page en utilisant votre URL de slug, vous devriez voir ceci:

Gestion de la permanence et de l'unicité

Yii offre quelques améliorations intéressantes à SluggableBehavior pour des scénarios utiles.

Par exemple, une fois qu'un moteur de recherche enregistre un slug, vous ne voulez probablement pas que l'URL de la page change. le 'immuable' L'attribut indique à Yii de garder le slug identique après sa création, même si le message est mis à jour..

Si les utilisateurs entrent des messages dont le contenu se chevauchent, la 'EnsureUnique' property ajoutera automatiquement un suffixe unique aux doublons. Cela garantit que chaque message a une URL unique même si le message est identique. 

 fonction de comportement publique () return [['class' => SluggableBehavior :: className (), 'attribut' => 'message', 'immuable' => vrai, 'EnsureUnique' => vrai,],];  

Si vous continuez et créez un autre message avec le même contenu exact, vous verrez que son slug est incrémenté de test-the-slug-attribut-2..

Remarque: Si vous obtenez une erreur liée à la propriété immuable, il se peut que vous deviez exécuter une mise à jour du compositeur pour obtenir la dernière version de Yii..

Et après?

Surveillez les prochains tutoriels de ma série Programming With Yii2 pendant que je continue à plonger dans différents aspects du cadre. Vous pouvez également consulter ma série Construire votre démarrage avec PHP qui utilise le modèle avancé de Yii2 pour créer une application du monde réel..

Je me félicite des demandes de fonctionnalités et de sujets. Vous pouvez les poster dans les commentaires ci-dessous ou m'envoyer un email sur mon site Lookahead Consulting.

Si vous souhaitez savoir quand le prochain tutoriel Yii2 arrive, suivez-moi @reifman sur Twitter ou consultez ma page d'instructeur. Ma page d’instructeur comprendra tous les articles de cette série dès leur publication.. 

Liens connexes

  • Yii Framework Site
  • Introduction au framework Yii (Tuts +)
  • Yii2 Developer Exchange, mon site de ressources Yii2