Hur man programmerar med Yii2 Sluggable Beteende

Vad du ska skapa

Om du frågar, "Vad är Yii?" kolla in min tidigare handledning: Introduktion till Yii Framework, som granskar fördelarna med Yii och innehåller en översikt över vad som är nytt i Yii 2.0, släppt i oktober 2014.

I denna programmering med Yii2-serien guidar jag läsare som använder den nyuppgraderade Yii2 Framework for PHP. I den här handledningen kommer jag att visa dig hur du ändrar Yii: s standardvisningsadressrutter för modellobjekt att vara mer användarvänliga och sökmotorvänliga. Yii ger inbyggt stöd för detta via dess sluggable beteenden.

För dessa exempel fortsätter vi att föreställa oss att vi bygger ett ramverk för att skicka enkla statusuppdateringar, t.ex. vår egen mini-Twitter.

Bara en påminnelse, jag deltar i kommentera trådarna nedan. Jag är särskilt intresserad om du har olika tillvägagångssätt, ytterligare idéer eller vill föreslå ämnen för framtida handledning.

Vad är en slug?

Kallas även som en semantisk URL, säger Wikipedia "... a snigel [är] den del av en webbadress som identifierar en sida med hjälp av läsbara sökord. "Till exempel är standard Yii-webbadressen till sidan i vår statusvy nedan:

http: // localhost: 8888 / hello / status / visa id = 3

Den här URL-adressen anger inte användaren eller sökmotorerna något om innehållet. Genom att implementera sniglar kan vi komma åt sidan med en webbadress som:

http: // localhost: 8888 / hello / status / ser framåt-to-the-super-bowl

Yii2 gör byggsnusar lättare än någonsin, med hjälp av ActiveRecord-beteenden, speciellt SluggableBehavior.

Genomförande SluggableBehavior

Lägg till en slugkolumn till status tabellen

För att lägga till slug-stöd till vår Hello-applikation börjar vi genom att skapa en ActiveRecord-migrering för att lägga till en slugkolumn i vår Status-tabell.

./ yii migrera / skapa extend_status_table_for_slugs Yii Migrationsverktyg (baserat på Yii v2.0.1) Skapa ny migrering '/Users/Jeff/Sites/hello/migrations/m150128_214906_extend_status_table_for_slugs.php'? (ja | nej) [nej]: ja Ny migrering skapades framgångsrikt.

Här är den migrering du ska använda:

db-> drivrutinName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> addColumn ('% status', 'slug', Schema :: TYPE_STRING. 'NOT NULL');  offentlig funktion ner () $ this-> dropColumn ('% status', 'slug');  

Använd sedan migreringen:

./ yii migrera / uppåt Yii Migrationsverktyg (baserat på Yii v2.0.1) Totalt 1 ny migration som ska tillämpas: m150128_214906_extend_status_table_for_slugs Använd ovanstående migrering? (ja | nej) nej: ja *** tillämpning m150128_214906_extend_status_table_for_slugs> lägg till kolumn slug sträng INTE NULL till tabell % status ... gjort (tid: 0.022s) *** tillämpas m150128_214906_extend_status_table_for_slugs (tid: 0.027s) Migrerad upp framgångsrikt.

Lägg till SluggableBehavior till statusmodellen

Därefter lägger vi till det sluggable beteendet till Appar \ modeller \ Status.php modell:

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

De slugAttribute behövs inte eftersom vår kolumn kallas snigel, ramvärdet.

Testa slug attributet

Låt oss testa denna funktion genom att skapa ett nytt statusobjekt. Från Status meny, klicka Skapa:

Med PHPMyAdmin tittar jag på statustabellen och ser till att slugfältet har fyllts automatiskt av en URL-vänlig version av statusmeddelandet som jag angav.

Men du kanske märker att webbadressen för visningssida fortsätter att identifiera meddelandet med sitt numeriska ID:

http: // localhost: 8888 / hello / status / visa id = 4

Hur förändrar vi detta??

Implementera Sniglar i Grid Action Links

app \ visningar \ status \ index.php, Vi behöver uppdatera gridvyn med en anpassad länk. Den här länken kommer att koda den rätta webbadressen för vår slug till vyn:

  $ dataProvider, 'filterModel' => $ searchModel, 'kolumner' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'meddelande: ntext', 'behörigheter', 'created_at' 'updated_at', ['class' => 'yii \ grid \ ActionColumn', 'mall' => 'view update delete', 'buttons' => ['view' => funktion , $ modell) returnera Html :: a ('',' status /'.$ modell-> slug, ['title' => Yii :: t ('yii', 'View'),]); ],],],]); ?>

Nu när du besöker indexsidan ser du visningen länken löses till:

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

Naturligtvis finns den sidan inte ännu. Vi behöver bygga stöd för det i vår controller.

Implementera sniglar i rutor

Yii analyserar inkommande förfrågningar med en standard uppsättning regler inbyggda i UrlManager. Vi behöver lägga till stöd för vår anpassade slugrutt i applikationens app \ config \ web.php:

 'components' => ['urlManager' => ['showScriptName' => false, 'enablePrettyUrl' => true, 'rules' => ['status' => 'status / index', 'status / index' => 'status / index', 'status / create' => 'status / skapa', 'status / visa /'=>' status / visa ',' status / uppdatering /'=>' status / update ',' status / delete /'=>' status / delete ',' status /'=>' status / slug ',' defaultRoute '=>' / site / index ',], 

Nu när en URL kommer i http: // localhost: 8888 / hej / status / test-the-slug-attributet, kommer Yii att rikta begäran till StatusController's slug action med parametern eller i detta fall "test-the-slug-attribut".

Observera att vi också definierat status / index och status / skapa specifikt i rutten, annars kan Yii tro att "index" eller "skapa" var sniglar.

Genomföra Slug Controller Action

Därefter lägger vi till en ny kontrolleråtgärd kallad slug till StatusController.php. Det är bara som att visa, utom det går utanför slugkolumnen:

/ ** * Visar en enda Status-modell. * @param heltal $ id * @return mixed * / public function actionView ($ id) return $ this-> render ('view', ['model' => $ this-> findModel ($ id),]);  / ** * Visar en enda Status-modell. * @paramsträng $ slug * @return mixed * / allmän funktion actionSlug ($ slug) $ model = Status :: find () -> where (['slug' => $ slug)) -> one (); om (! is_null ($ modell)) return $ this-> render ('view', ['model' => $ modell,]);  annars returnera $ this-> omdirigering ('/ status / index');  

Nu när du besöker sidan med din slug-URL, bör du se detta:

Hantera Permanence och Unikhet

Yii erbjuder några bra förbättringar för SluggableBehavior för användbara scenarier.

Till exempel, när en sökmotor registrerar en slug, vill du antagligen inte att webbadressen ska ändras. De 'oföränderlig' attributet berättar för att Yii ska hålla sluggen samma efter det att den skapades först - även om meddelandet uppdateras.

Om användare anger inlägg som överlappar innehållet, 'EnsureUnique' egenskapen lägger automatiskt till ett unikt suffix för duplikat. Detta gör att varje meddelande har en unik URL, även om meddelandet är identiskt. 

 public function behaviors () return [['class' => SluggableBehavior :: className (), 'attribute' => 'meddelande', 'immutable' => true, 'secureUnique' => true]]  

Om du fortsätter och skapar ett annat meddelande med samma exakta innehåll ser du att dess snigel inkrementeras till test-the-slug-attribute-2.

Obs! Om du får ett fel relaterat till den oföränderliga egenskapen kan det vara att du måste köra en kompositöruppdatering för att få den senaste versionen av Yii.

Vad kommer härnäst?

Titta på kommande handledningar i min programmering med Yii2-serien när jag fortsätter att dyka in i olika aspekter av ramen. Du kanske också vill kolla in min Building Your Startup With PHP-serie som använder Yii2s avancerade mall när jag bygger en verklig världsapplikation.

Jag välkomnar funktion och ämnesförfrågningar. Du kan skicka in dem i kommentarerna nedan eller maila mig på min Lookahead Consulting webbplats.

Om du vill veta när nästa Yii2 handledning kommer, följ mig @ reifman på Twitter eller kolla min instruktörssida. Min instruktörssida kommer att innehålla alla artiklar från denna serie så snart de publiceras. 

relaterade länkar

  • Yii Framework Website
  • Introduktion till Yii Framework (Tuts +)
  • Yii2 Developer Exchange, min Yii2 resurs webbplats