Slik programmerer du med Yii2 Sluggable Behavior

Hva du skal skape

Hvis du spør, "Hva er Yii?" sjekk ut min tidligere opplæring: Introduksjon til Yii Framework, som vurderer fordelene med Yii og inneholder en oversikt over hva som er nytt i Yii 2.0, utgitt i oktober 2014.

I denne programmeringen med Yii2-serien, er jeg veiledende lesere i bruk av den nylig oppgraderte Yii2 Framework for PHP. I denne opplæringen skal jeg vise deg hvordan du kan endre Yii's standardvisningslinjer for tilgang til modellobjekter for å være mer brukervennlig og søkemotor vennlig. Yii gir innebygd støtte for dette via sin sluggable oppførsel.

For disse eksemplene fortsetter vi å forestille oss at vi bygger et rammeverk for å legge ut enkle statusoppdateringer, f.eks. vår egen mini-Twitter.

Bare en påminnelse, jeg deltar i kommentar tråder nedenfor. Jeg er spesielt interessert hvis du har forskjellige tilnærminger, flere ideer eller ønsker å foreslå emner for fremtidige opplæringsprogrammer.

Hva er en slug?

Også kjent som en semantisk URL, sier Wikipedia "... a slug [er] delen av en nettadresse som identifiserer en side ved hjelp av menneskelige lesbare søkeord. "For eksempel er standard Yii-nettadressen til siden i statusvisningen nedenfor:

http: // localhost: 8888 / hei / status / view id = 3

Denne nettadressen forteller ikke brukeren eller søkemotoren noe om innholdet. Ved å implementere snegler kan vi få tilgang til siden med en nettadresse som:

http: // localhost: 8888 / hei / status / ser frem til den super bowl

Yii2 gjør bygningsklær enklere enn noensinne, ved hjelp av ActiveRecord-oppføringene, spesielt SluggableBehavior.

Implementere SluggableBehavior

Legg til en slugkolonne i statustabellen

For å legge til slug-støtte til Hello-programmet, starter vi ved å opprette en ActiveRecord-migrering for å legge til en slugkolonne i statustabellen vår.

./ yii migrere / opprett extend_status_table_for_slugs Yii Migreringsverktøy (basert på Yii v2.0.1) Opprett ny migrasjon '/Users/Jeff/Sites/hello/migrations/m150128_214906_extend_status_table_for_slugs.php'? (ja | nei) [nei]: ja Ny migrasjon ble opprettet.

Her er overføringen du bør bruke:

db-> drivernavn === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> addColumn ('% status', 'slug', Schema :: TYPE_STRING. 'IKKE NULL');  offentlig funksjon ned () $ this-> dropColumn ('% status', 'slug');  

Deretter bruker du migreringen:

./ yii migrere / opp Yii Migreringsverktøy (basert på Yii v2.0.1) Totalt 1 ny migrasjon som skal brukes: m150128_214906_extend_status_table_for_slugs Bruk overføringen ovenfor? (ja | nei) nei: ja *** gjelder m150128_214906_extend_status_table_for_slugs> legg til kolonne slug streng IKKE NULL til tabell % status ... ferdig (tid: 0.022s) *** påført m150128_214906_extend_status_table_for_slugs (tid: 0.027s) Migrert opp med hell.

Legg til SluggableBehavior til statusmodellen

Deretter legger vi til truggbar oppførsel til Apps \ modeller \ Status.php modell:

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

De slugAttribute er ikke nødvendig siden vår kolonne er kalt slug, rammeverdien.

Test Slug Attribut

La oss teste denne funksjonaliteten ved å opprette et nytt statuselement. Fra Status menyen, klikk Skape:

Ved hjelp av PHPMyAdmin, ser jeg på Status-tabellen og ser at slug-feltet er automatisk befolket av en URL-vennlig versjon av Statusmeldingen jeg skrev inn.

Men det kan hende du merker at visningssiden URL fortsetter å identifisere meldingen med sin numeriske ID:

http: // localhost: 8888 / hei / status / view id = 4

Hvordan endrer vi dette?

Implementere snegler i Grid Action Links

app \ utsikt \ status \ index.php, Vi må oppdatere gridvisningen med en egendefinert lenke. Denne koblingen vil kode den riktige nettadressen for vår slug i visningen:

  $ dataProvider, 'filterModel' => $ searchModel, 'columns' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'melding: ntext', 'tillatelser', 'created_at' 'updated_at', ['class' => 'yii \ grid \ ActionColumn', 'mal' => 'view update delete', 'buttons' => ['view' => funksjon , $ modell) retur Html :: a ('',' status /'.$ modell-> slug, ['title' => Yii :: t ('yii', 'View'),]); ],],],]); ?>

Nå, når du besøker indekssiden, vil du se visningslinken løst til:

http: // localhost: 8888 / Directory / status / test-the-slug-attributt

Selvfølgelig eksisterer denne siden ennå ikke. Vi trenger å bygge støtte for det i vår kontroller.

Gjennomføring av snegler i ruter

Yii analyserer innkommende forespørsler ved å bruke et standard sett med regler innbygget i UrlManager. Vi må legge til støtte for vår tilpassede slug rute inn i programmets app \ config \ web.php:

 'components' => ['urlManager' => ['showScriptName' => false, 'enablePrettyUrl' => true, 'rules' => ['status' => 'status / indeks', 'status / index' => 'status / index', 'status / create' => 'status / opprett', 'status / visning /'=>' status / visning ',' status / oppdatering /'=>' status / oppdatering ',' status / slett /'=>' status / slett ',' status /'=>' status / slug ',' defaultRoute '=>' / site / index ',], 

Nå, når en URL kommer i http: // localhost: 8888 / hei / status / test-the-slug-attributtet, vil Yii rette forespørselen til StatusController's slug action med parameteren eller i dette tilfellet "test-the-slug-attributt".

Legg merke til at vi også har definert status / index og status / opprette spesielt i ruten, ellers kan Yii tro at "index" eller "create" var snegler.

Implementere Slug Controller Action

Deretter legger vi til en ny kontrolleraktivitet kalt slug til StatusController.php. Det er akkurat som visning bortsett fra at det opererer utenfor slugkolonnen:

/ ** * Viser en enkelt Status-modell. * @param heltall $ id * @return mixed * / offentlig funksjon actionView ($ id) return $ this-> render ('view', ['model' => $ this-> findModel ($ id),]);  / ** * Viser en enkelt statusmodell. * @param streng $ slug * @return mixed * / offentlig funksjon actionSlug ($ slug) $ model = Status :: finn () -> hvor (['slug' => $ slug]) -> en (); hvis (! er_null ($ modell)) return $ this-> render ('view', ['model' => $ modell,]);  ellers return $ this-> redirect ('/ status / index');  

Nå, når du besøker siden ved hjelp av slugadressen din, bør du se dette:

Administrere Permanence og Unikhet

Yii tilbyr noen gode forbedringer til SluggableBehavior for nyttige scenarier.

For eksempel, når en søkemotor registrerer en slug, vil du sannsynligvis ikke ha webadressen til å endres. De 'Uforanderlig' Attributt forteller Yii å holde sluggen det samme etter at den først ble opprettet - selv om meldingen er oppdatert.

Hvis brukerne skriver inn meldinger som overlapper innholdet, 'EnsureUnique' Egenskapen vil automatisk legge til et unikt suffiks for duplikater. Dette sikrer at hver melding har en unik nettadresse, selv om meldingen er identisk. 

 Offentlig funksjon atferd () return [['class' => SluggableBehavior :: className (), 'attribute' => 'message', 'immutable' => true, 'sikreUnique' => true,];  

Hvis du går videre og oppretter en annen melding med det samme nøyaktige innholdet, ser du at dets slug er økt til test-slug-attribute-2.

Merk: Hvis du får en feil relatert til den uforanderlige egenskapen, kan det hende du må kjøre en komponistoppdatering for å få den nyeste versjonen av Yii.

Hva blir det neste?

Se etter kommende opplæringsprogrammer i min programmering med Yii2-serien når jeg fortsetter å dykke inn i ulike aspekter av rammen. Du vil kanskje også sjekke ut Bygg opp din oppstart med PHP-serien som bruker Yii2s avanserte mal når jeg bygger en ekte verdensapplikasjon.

Jeg aksepterer funksjon og emneforespørsler. Du kan legge inn dem i kommentarene under eller sende meg en e-post på Lookahead Consulting.

Hvis du vil vite når neste Yii2 opplæring kommer, følg meg @ reifman på Twitter eller sjekk min instruktørside. Min instruktørside vil inkludere alle artiklene fra denne serien så snart de er publisert. 

Relaterte linker

  • Yii Framework Website
  • Introduksjon til Yii Framework (Tuts +)
  • Yii2 Developer Exchange, min Yii2 ressurs side