Hoe te programmeren met Yii2 slap gedrag

Wat je gaat creëren

Als je vraagt: "Wat is Yii?" bekijk mijn eerdere tutorial: Introductie tot het Yii Framework, die de voordelen van Yii bekijkt en een overzicht bevat van wat er nieuw is in Yii 2.0, uitgebracht in oktober 2014.

In deze serie Programming With Yii2 begeleid ik lezers in gebruik van het onlangs bijgewerkte Yii2 Framework voor PHP. In deze zelfstudie laat ik u zien hoe u de standaard view URL-routes van Yii voor modelobjecten kunt aanpassen om gebruikersvriendelijker en zoekmachinevriendelijk te zijn. Yii biedt ingebouwde ondersteuning hiervoor via zijn loze gedrag.

Voor deze voorbeelden blijven we ons voorstellen dat we een raamwerk bouwen voor het plaatsen van eenvoudige statusupdates, bijvoorbeeld onze eigen mini-Twitter.

Ter herinnering, ik neem wel deel aan de commentaarthreads hieronder. Ik ben vooral geïnteresseerd in verschillende benaderingen, aanvullende ideeën of onderwerpen voor toekomstige zelfstudies.

Wat is een naaktslak?

Ook bekend als een semantische URL, zegt Wikipedia: "... a naaktslak [is] het deel van een URL dat een pagina identificeert met behulp van voor mensen leesbare zoekwoorden. "De standaard Yii-URL naar de pagina van onze statusweergave hieronder is bijvoorbeeld:

http: // localhost: 8888 / hallo / staat / view id = 3

Deze URL vertelt de gebruiker of zoekmachines niets over de inhoud ervan. Door slakken te implementeren, hebben we toegang tot de pagina met een URL zoals:

http: // localhost: 8888 / hallo / status / looking-forward-to-the-super-bowl

Yii2 maakt het bouwen van naaktslakken gemakkelijker dan ooit, met behulp van het ActiveRecord-gedrag - specifiek Sluggable Behavior.

Sluggable Behavior implementeren

Voeg een Slug-kolom toe aan de statustabel

Om slug-ondersteuning aan onze Hello-applicatie toe te voegen, beginnen we met het maken van een ActiveRecord-migratie om een ​​slug-kolom aan onze statustabel toe te voegen.

./ yii migreren / create extend_status_table_for_slugs Yii Migration Tool (gebaseerd op Yii v2.0.1) Maak nieuwe migratie '/Users/Jeff/Sites/hello/migrations/m150128_214906_extend_status_table_for_slugs.php'? (ja | nee) [nee]: ja Nieuwe migratie is succesvol gemaakt.

Dit is de migratie die u moet gebruiken:

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

Pas dan de migratie toe:

./ yii migreren / omhoog Yii Migration Tool (gebaseerd op Yii v2.0.1) Totaal 1 nieuwe migratie die moet worden toegepast: m150128_214906_extend_status_table_for_slugs De bovenstaande migratie toepassen? (yes | no) [nee]: yes *** apply m150128_214906_extend_status_table_for_slugs> voeg kolom slug string toe NOT NULL to table % status ... done (time: 0.022s) *** applied m150128_214906_extend_status_table_for_slugs (time: 0.027s) Migrated succesvol op.

Voeg de Sluggable Behavior aan het Statusmodel toe

Vervolgens voegen we het loze gedrag toe aan de apps \ modellen \ status.php model:

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

De slugAttribute is niet nodig omdat onze kolom wordt genoemd naaktslak, de standaardinstelling.

Test het Slug-kenmerk

Laten we deze functionaliteit testen door een nieuw statusitem te maken. Van de staat menu, klik creëren:

Met behulp van PHPMyAdmin zal ik naar de Status-tabel kijken en zien dat het veld van de slug automatisch wordt ingevuld door een URL-vriendelijke versie van het statusbericht dat ik heb ingevoerd.

U zult echter merken dat de URL van de weergavepagina het bericht blijft identificeren aan de hand van zijn numerieke ID:

http: // localhost: 8888 / hallo / staat / view id = 4

Hoe kunnen we dit veranderen??

Implementeren van Slugs in Grid Action Links

In app \ uitzicht \ staat \ index.php, we moeten de rasterweergave bijwerken met een aangepaste link. Deze link codeert de juiste URL voor onze slug in de weergave:

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

Wanneer u nu de indexpagina bezoekt, ziet u dat de weergavelink is opgelost naar:

http: // localhost: 8888 / hallo / Status / test-the-slug-attribuut

Natuurlijk bestaat die pagina nog niet. We moeten er ondersteuning voor opbouwen in onze controller.

Slugs in routes implementeren

Yii parseert binnenkomende verzoeken met behulp van een standaard set regels ingebouwd in zijn UrlManager. We moeten ondersteuning voor onze aangepaste slug-route toevoegen aan de applicaties app \ config \ web.php:

 'components' => ['urlManager' => ['showScriptName' => false, 'enablePrettyUrl' => true, 'rules' => ['status' => 'status / index', 'status / index' => 'status / index', 'status / create' => 'status / create', 'status / weergave /'=>' status / weergave ',' status / update /'=>' status / update ',' status / verwijderen /'=>' status / verwijderen ',' status /'=>' status / slug ',' defaultRoute '=>' / site / index ',], 

Nu, wanneer een URL http: // localhost: 8888 / hello / status / test-de-slak-attribuut ontvangt, zal Yii de aanvraag sturen naar de actie van de StatusController met de parameter of in dit geval "test-the-slug-attribuut".

Merk op dat we ook hebben gedefinieerd Status / index en Status / creëren specifiek in de route, anders zou Yii kunnen denken dat "indexeren" of "creëren" naaktslakken waren.

Implementatie van de actie Slug Controller

Vervolgens voegen we een nieuwe controller-actie toe, genaamd slug aan StatusController.php. Het is net een beeld, maar het werkt buiten de slug-kolom:

/ ** * Geeft een enkel statusmodel weer. * @param integer $ id * @return mixed * / public function actionView ($ id) return $ this-> render ('view', ['model' => $ this-> findModel ($ id),]);  / ** * Geeft een enkel statusmodel weer. * @param string $ slug * @return mixed * / public function actionSlug ($ slug) $ model = Status :: find () -> where (['slug' => $ slug]) -> one (); if (! is_null ($ model)) return $ this-> render ('view', ['model' => $ model,]);  else return $ this-> redirect ('/ status / index');  

Wanneer u nu de pagina bezoekt met uw slug-URL, zou u dit moeten zien:

Beheer van permanentie en uniekheid

Yii biedt enkele handige verbeteringen aan Sluggable Behavior voor handige scenario's.

Zodra een zoekmachine bijvoorbeeld een slug vastlegt, wilt u waarschijnlijk niet dat de pagina-URL verandert. De 'onveranderlijk' attribuut vertelt Yii dat de slug dezelfde blijft nadat deze voor het eerst is gemaakt, zelfs als het bericht is bijgewerkt.

Als gebruikers berichten invoeren die elkaar overlappen, wordt de 'EnsureUnique' eigenschap voegt automatisch een uniek achtervoegsel toe aan duplicaten. Dit zorgt ervoor dat elk bericht een unieke URL heeft, zelfs als het bericht identiek is. 

 public function behaviors () return [['class' => SluggableBehavior :: className (), 'attribute' => 'message', 'immutable' => true, 'sureUnique' => true,],];  

Als je doorgaat en een ander bericht met dezelfde exacte inhoud maakt, zie je dat de naaktslak wordt verhoogd om te testen-de-slak-kenmerk-2.

Opmerking: als u een foutmelding krijgt met betrekking tot de onveranderlijke eigenschap, kan het zijn dat u een update voor een componist moet uitvoeren om de nieuwste versie van Yii te krijgen.

Wat is het volgende?

Kijk uit naar komende tutorials in mijn Programming With Yii2-serie terwijl ik verder duik in verschillende aspecten van het framework. Je kunt ook mijn Building Your Startup With PHP-serie bekijken, die de geavanceerde sjabloon van Yii2 gebruikt terwijl ik een toepassing uit de echte wereld samenstel.

Ik verwelkom aanvragen voor functies en onderwerpen. Je kunt ze plaatsen in de reacties hieronder of e-mail me op mijn Lookahead Consulting-website.

Als je wilt weten wanneer de volgende Yii2-handleiding aankomt, volg me dan @reifman op Twitter of bekijk mijn instructeurspagina. Op mijn instructeurspagina staan ​​alle artikelen uit deze serie zodra ze zijn gepubliceerd. 

Gerelateerde Links

  • Yii Framework Website
  • Introductie van het Yii Framework (Tuts +)
  • Yii2 Developer Exchange, mijn Yii2-bronsite