Cum să programați cu Yii2 comportament slujitor

Ce veți crea

Dacă vă întrebați: "Ce este Yii?" verificați tutorialul meu anterior: Introducere în Cadrul Yii, care analizează beneficiile Yii și include o prezentare generală a ceea ce este nou în Yii 2.0, lansat în octombrie 2014.

În această serie de programare cu seria Yii2, îndrumăm cititorii în folosirea noii tehnologii Yii2 Framework for PHP. În acest tutorial, vă voi arăta cum să modificați rutele adreselor URL de vizionare implicite ale modelului Yii pentru obiectele de model pentru a fi mai ușor de utilizat și cu motor de căutare prietenos. Yii oferă suport încorporat pentru acest lucru prin comportamentele sale lente.

Pentru aceste exemple, vom continua să ne imaginăm că construim un cadru pentru afișarea actualizărilor de stare simple, de ex. propriul mini-Twitter.

Doar un memento, eu particip la comentariile de mai jos. Sunt interesat în special dacă aveți abordări diferite, idei suplimentare sau doriți să sugerați subiecte pentru tutoriale viitoare.

Ce este un Slug?

De asemenea, cunoscut sub numele de URL semantic, Wikipedia spune "... a melc [este] o parte a unei adrese URL care identifică o pagină care utilizează cuvinte cheie care pot fi citite de oameni. "De exemplu, adresa URL prestabilită Yii la pagina din ecranul de stare de mai jos este:

http: // localhost: 8888 / Hello / starea / vizualizare id = 3

Această adresă URL nu indică utilizatorului sau motoarelor de căutare nimic despre conținutul său. Prin punerea în aplicare a slugs, putem accesa pagina cu o adresă URL, cum ar fi:

http: // localhost: 8888 / Hello / status / cu aspect transmite-to-the-super-castron

Yii2 face mai usor ca niciodata, folosind propriile comportamente ActiveRecord - in mod specific, LoebableBehavior.

Implementarea comportamentului ușor

Adăugați o coloană Slug în tabelul de stare

Pentru a adăuga asistență pentru slug la aplicația noastră Hello, vom începe prin crearea unei migrări ActiveRecord pentru a adăuga o coloană de slug în tabelul de stare.

./ yii migrați / creați extens_status_table_for_slugs Instrumentul de migrare Yii (bazat pe Yii v2.0.1) Creați noua migrare '/Users/Jeff/Sites/hello/migrations/m150128_214906_extend_status_table_for_slugs.php'? (da | nu) [no]: da Migrația nouă a fost creată cu succes.

Iată migrarea pe care ar trebui să o utilizați:

db-> driverName === 'mysql') $ tableOptions = 'SETAREA CHARACTERULUI utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> addColumn ('% status', 'slug', Schema :: TYPE_STRING. 'NOT NULL');  funcția publică jos () $ this-> dropColumn ('% status', 'slug');  

Aplicați apoi migrarea:

./ yii migrați / up Instrument de migrare Yii (bazat pe Yii v2.0.1) Se va aplica un total de 1 migrare nou: m150128_214906_extend_status_table_for_slugs Aplicați migrarea de mai sus? (da: nu): da *** aplicând m150128_214906_extend_status_table_for_slugs> adăugați șirul de coloană de sertar NOT NULL la tabelul % status ... făcut (timpul: 0.022s) *** aplicat m150128_214906_extend_status_table_for_slugs (timpul: 0.027s) cu succes.

Adăugați comportamentul Loggable la modelul de stare

Apoi adăugăm comportamentul lent la Aplicații \ modele \ Status.php model:

 Cunoașterea comportamentului :: className (), 'attribute' => 'message', // 'slugAttribute' => 'slug',];]; 

slugAttribute nu este necesară de la numirea coloanei noastre melc, implicit cadru.

Testați atributul Slug

Să testăm această funcție creând un nou element de stare. De la stare meniu, faceți clic pe Crea:

Folosind PHPMyAdmin, mă uit la tabelul de stare și văd că câmpul de slug a fost populate automat de o versiune prietenoasă cu adresa URL a mesajului Status introdus.

Dar este posibil să observați că adresa URL a paginii de vizualizare continuă să identifice mesajul prin numărul său numeric:

http: // localhost: 8888 / Hello / starea / vizualizare id = 4

Cum schimbăm acest lucru?

Implementarea de sluguri în legăturile de acțiune ale rețelei

În app \ puncte de vedere \ statutul \ index.php, trebuie să actualizăm vizualizarea rețelei cu un link personalizat. Acest link va codifica adresa URL corespunzătoare pentru slugul nostru în vizualizare:

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

Acum, când vizitați pagina index, veți vedea că linia de vizualizare se rezolvă pentru:

http: // localhost: 8888 / Hello / starea / testare-the-slug-atribut

Desigur, acea pagină nu există încă. Trebuie să construim sprijin pentru acesta în cadrul controlorului nostru.

Punerea în aplicare a slugs în trasee

Yii analizează cererile primite folosind un set implicit de reguli încorporate în UrlManager. Trebuie să adăugăm suport pentru ruta noastră personalizată în aplicație app \ config \ web.php:

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

Acum, atunci când o adresă URL se găsește în http: // localhost: 8888 / hello / status / test-the-slug-attribute, Yii va direcționa cererea către acțiunea slugului StatusController cu parametrul sau în acest caz "test-the-slug-attribute".

Observați că am definit și noi Starea / index și Starea / crea în mod specific pe rută, altfel Yii ar putea crede că "indexul" sau "crea" erau golici.

Implementarea acțiunii controlerului de zgomot

Apoi, adăugăm o nouă acțiune de controler denumită slug la StatusController.php. Este vorba doar de vizualizare, cu excepția faptului că operează din coloana de colivie:

/ ** * Afișează un singur model de stare. * @ param integer $ id * @return mixt * / public function actionView ($ id) retur $ this-> render ('view', ['model' => $ this-> findModel ($ id);  / ** * Afișează un singur model de stare. * @param șir $ slug * @return mixt * / function public functionSlug ($ slug) $ model = Status :: find () -> unde (['slug' => $ slug]) -> one; dacă ! is_null ($ model)) retur $ this-> render ('view', ['model' => $ model,]);  altceva return $ this-> redirect ('/ status / index');  

Acum, când vizitați pagina folosind URL-ul dvs. de slug, ar trebui să vedeți acest lucru:

Gestionarea permanenței și a caracterului unic

Yii oferă câteva îmbunătățiri drăguțe ale lui SluggableBehavior pentru scenarii utile.

De exemplu, odată ce un motor de căutare înregistrează un blitz, probabil că nu doriți ca URL-ul paginii să se modifice. 'imuabil' atributul îi spune lui Yii să păstreze același lucru după ce a fost creat - chiar dacă mesajul este actualizat.

Dacă utilizatorii introduc mesaje care se suprapun în conținut, 'EnsureUnique' proprietatea va adăuga automat un sufix unic pentru duplicate. Acest lucru face sigur că fiecare mesaj are o adresă URL unică, chiar dacă mesajul este identic. 

 funcțiile publice () return [['class' => SluggableBehavior :: className (), 'attribute' => 'message', 'immutable' => true,'cureUnique '=> true;  

Dacă mergeți mai departe și creați un alt mesaj cu același conținut exact, veți vedea că mușchiul său este incrementat la test-the-slug-attribute-2.

Notă: Dacă primiți o eroare legată de proprietatea imuabilă, este posibil să aveți nevoie să rulați o actualizare a compozitorului pentru a obține cea mai recentă versiune de Yii.

Ce urmeaza?

Urmăriți tutorialele viitoare din programul meu de programare cu seria Yii2, deoarece continuam să scufundăm în diferite aspecte ale cadrului. Ați putea dori, de asemenea, să verificați clădirea dvs. Startup cu seria PHP care utilizează șablonul avansat al lui Yii2, pe măsură ce construiesc o aplicație din lumea reală.

Salut cererile de teme și teme. Puteți să le postați în comentariile de mai jos sau puteți să ne trimiteți un e-mail pe site-ul meu Lookahead Consulting.

Dacă doriți să știți când vine următorul tutorial Yii2, urmați-mă @reifman pe Twitter sau verificați pagina de instructor. Pagina mea de instructor va include toate articolele din această serie de îndată ce vor fi publicate. 

Link-uri conexe

  • Site-ul web Yii
  • Introducere în Cadrul Yii (Tuts +)
  • Yii2 Developer Exchange, site-ul meu de resurse Yii2
Cod