Wie man mit Yii2 programmiert träge Verhalten

Was Sie erstellen werden

Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an: Einführung in das Yii-Framework, Hier werden die Vorteile von Yii beschrieben und ein Überblick über die Neuerungen in Yii 2.0 (Oktober 2014) gegeben.

In dieser Programmierserie mit Yii2 leite ich die Leser beim Einsatz des neu aktualisierten Yii2-Frameworks für PHP. In diesem Tutorial werde ich Ihnen zeigen, wie Sie die Standard-URL-Routen von Yii für Ansichtsobjekte so ändern können, dass sie benutzerfreundlicher und suchmaschinenfreundlicher sind. Yii bietet hierfür integrierte Unterstützung durch sein träge Verhalten.

Für diese Beispiele stellen wir uns weiterhin vor, dass wir ein Framework für die Veröffentlichung einfacher Statusaktualisierungen erstellen, z. unser eigenes Mini-Twitter.

Nur zur Erinnerung, ich beteilige mich an den Kommentarthreads unten. Ich bin besonders interessiert, wenn Sie unterschiedliche Ansätze, zusätzliche Ideen haben oder Themen für zukünftige Tutorials vorschlagen möchten.

Was ist eine Schnecke??

Wikipedia wird auch als semantische URL bezeichnet: "a Schnecke [ist] der Teil einer URL, der eine Seite anhand von für Menschen lesbaren Schlüsselwörtern identifiziert. "Die standardmäßige Yii-URL zu der Seite unserer Statusansicht lautet beispielsweise:

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

Diese URL sagt dem Nutzer oder den Suchmaschinen nichts über seinen Inhalt. Durch die Implementierung von Slugs können wir auf die Seite mit einer URL zugreifen, wie zum Beispiel:

http: // localhost: 8888 / hallo / status / schau nach vorne zum super-bowl

Yii2 macht das Erstellen von Slugs einfacher als je zuvor, indem das ActiveRecord-Verhalten (SluggableBehavior) verwendet wird.

Implementieren von SluggableBehavior

Fügen Sie der Statustabelle eine Slug-Spalte hinzu

Um unserer Hello-Anwendung Slug-Unterstützung hinzuzufügen, erstellen wir zunächst eine ActiveRecord-Migration, um unserer Statustabelle eine Slug-Spalte hinzuzufügen.

./ yii migrieren / erstellen extend_status_table_for_slugs Yii Migration Tool (basierend auf Yii v2.0.1) Neue Migration erstellen '/Users/Jeff/Sites/hello/migrations/m150128_214906_extend_status_table_for_slugs.php'? (ja | nein) [nein]: ja Die neue Migration wurde erfolgreich erstellt.

Hier ist die Migration, die Sie verwenden sollten:

db-> driverName === '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');  

Dann wenden Sie die Migration an:

./ yii migrieren / up Yii Migration Tool (basierend auf Yii v2.0.1) Gesamtzahl der anzuwendenden neuen Migration: m150128_214906_extend_status_table_for_slugs Anwenden der obigen Migration? (Ja | Nein) [Nein]: Ja *** Anwenden von m150128_214906_extend_status_table_for_slugs> Hinzufügen der Spaltenstrangzeichenfolge NOT NULL zur Tabelle % status… done (Zeit: 0.022s) *** Übertragen erfolgreich aufgebaut.

Fügen Sie das SluggableBehavior zum Statusmodell hinzu

Als Nächstes fügen wir das langsame Verhalten zum hinzu apps \ models \ Status.php Modell:

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

Das slugAttribute wird nicht benötigt, da unsere Kolumne aufgerufen wird Schnecke, die Rahmenvorgabe.

Testen Sie das Slug-Attribut

Testen Sie diese Funktion, indem Sie ein neues Statuselement erstellen. Von dem Status Klicken Sie im Menü auf Erstellen:

Mit PHPMyAdmin schaue ich mir die Statustabelle an und sehe, dass das Slug-Feld automatisch mit einer URL-freundlichen Version der von mir eingegebenen Statusnachricht gefüllt wurde.

Möglicherweise stellen Sie jedoch fest, dass die URL der Ansichtsseite die Nachricht weiterhin anhand ihrer numerischen ID identifiziert:

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

Wie ändern wir das??

Implementieren von Slugs in Grid-Action-Links

Im app \ views \ status \ index.php, Wir müssen die Rasteransicht mit einem benutzerdefinierten Link aktualisieren. Dieser Link fügt die richtige URL für unseren Slug in die Ansicht ein:

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

Wenn Sie nun die Indexseite besuchen, wird der Link für die Ansicht in Folgendes aufgelöst:

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

Natürlich existiert diese Seite noch nicht. Wir müssen dafür Unterstützung in unserem Controller schaffen.

Slugs in Routen implementieren

Yii analysiert eingehende Anforderungen mit einem in UrlManager integrierten Standardsatz von Regeln. Wir müssen Unterstützung für unsere benutzerdefinierte Slug-Route in die Anwendung einfügen app \ config \ web.php:

 'components' => ['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 / löschen /'=>' status / delete ',' status /'=>' status / slug ',' defaultRoute '=>' / site / index ',], 

Wenn nun eine URL in http: // localhost: 8888 / hello / status / test-the-slug-Attribut eingeht, leitet Yii die Anforderung mit dem Parameter an die Slug-Aktion des StatusControllers oder in diesem Fall "test-the-slug-attribute".

Beachten Sie, dass wir auch definiert haben Status / Index und Status / Erstellen speziell in der Route, sonst könnte Yii denken, dass "index" oder "create" Slugs waren.

Implementieren der Slug-Controller-Aktion

Als Nächstes fügen wir der StatusController.php eine neue Controller-Aktion namens slug hinzu. Es ist wie bei view, außer dass es außerhalb der Slug-Spalte funktioniert:

/ ** * Zeigt ein einzelnes Statusmodell an. * @param integer $ id * @return mixed * / public function actionView ($ id) return $ this-> render ('view', ['model' => $ this-> findModel ($ id),]);  / ** * Zeigt ein einzelnes Statusmodell an. * @param string $ slug * @return mixed * / public function actionSlug ($ slug) $ model = Status :: find () -> wo (['slug' => $ slug]) -> one (); if (! is_null ($ model)) return $ this-> render ('view', ['model' => $ model,]);  else return $ this-> redirect ('/ status / index');  

Wenn Sie jetzt die Seite mit Ihrer Slug-URL aufrufen, sollten Sie Folgendes sehen:

Beständigkeit und Einzigartigkeit verwalten

Yii bietet einige nützliche Verbesserungen für SluggableBehavior für nützliche Szenarien.

Sobald eine Suchmaschine beispielsweise einen Slug aufzeichnet, möchten Sie wahrscheinlich nicht, dass sich die Seiten-URL ändert. Das 'unveränderlich' Attribut teilt Yii mit, dass der Slug nach der Erstellung gleich bleibt, auch wenn die Nachricht aktualisiert wird.

Wenn Benutzer Nachrichten eingeben, die sich im Inhalt überschneiden, können Sie 'sureUnique' Die Eigenschaft fügt automatisch ein eindeutiges Suffix an Duplikate an. Dadurch wird sichergestellt, dass jede Nachricht eine eindeutige URL hat, auch wenn die Nachricht identisch ist. 

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

Wenn Sie fortfahren und eine weitere Nachricht mit demselben genauen Inhalt erstellen, werden Sie feststellen, dass der Slug auf test-the-slug-attribute-2 erhöht wird.

Hinweis: Wenn Sie einen Fehler im Zusammenhang mit der unveränderlichen Eigenschaft erhalten, müssen Sie möglicherweise ein Composer-Update ausführen, um die neueste Version von Yii zu erhalten.

Was kommt als nächstes?

Achten Sie auf kommende Tutorials in meiner Programmierreihe "Programmieren mit Yii2", während ich mich weiter mit verschiedenen Aspekten des Frameworks beschäftige. Vielleicht möchten Sie auch meine Erstellung Ihres Startups mit der PHP-Serie überprüfen, die die erweiterte Vorlage von Yii2 verwendet, während ich eine reale Weltanwendung baue.

Ich freue mich über Feature- und Themenanfragen. Sie können sie in den Kommentaren unten posten oder mich auf meiner Lookahead Consulting-Website per E-Mail benachrichtigen.

Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, folgen Sie mir @reifman auf Twitter oder besuchen Sie meine Instructor-Seite. Meine Ausbilderseite enthält alle Artikel dieser Serie, sobald sie veröffentlicht sind. 

ähnliche Links

  • Yii Framework-Website
  • Einführung in das Yii-Framework (Tuts +)
  • Yii2 Developer Exchange, meine Website für Yii2-Ressourcen