Laravel generieren slug vor dem speichern
Ich versuche zu lernen, laravel 5 mit Hilfe von diese wondefull website.
Für meine Tätigkeit Modell, das ich erzeugen will Nacktschnecken, bevor ich speichern meiner Datenbank, so habe ich das folgende Modell.
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class Activity extends Model {
protected $table = 'activitys';
protected $fillable = [
'title',
'text',
'subtitle'
];
//Here I want to auto generate slug based on the title
public function setSlugAttribute(){
$this->attributes['slug'] = str_slug($this->title , "-");
}
//
}
Aber wenn ich speichern Sie ein Objekt mit Hilfe der Aktivität Modell slug ist nicht gefüllt, ich habe versucht, es zu verändern $this->Attribute['Titel'] = "test" für die Prüfung, aber es nicht ausführen. Auch habe ich versucht, indem Parameter $title, $slug zu setSlugAttribute (), aber es nicht helfen.
Was mache ich falsch und kann jemand erklären, die parameter, die verwendet werden, einige Beispiele für setSomeAttribute($whyParameterHere).
Hinweis : es ist ein slug Feld in meiner Datenbank.
Vorgeschlagen von user3158900 ich versucht habe :
public function setTitleAttribute($title){
$this->title = $title;
$this->attributes['slug'] = str_slug($this->title , "-");
}
//
Diesem macht mein Feld Titel leer, aber spart die Schnecke, wie ich es möchte, warum $this->Titel leer ist, dann ?
Wenn ich entfernen $this->Titel = $Titel; beide Titel und slug sind leer
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass dies nicht funktioniert, weil Sie nicht versucht, einen "slug" - Attribut so, dass die Funktion nie getroffen wird.
Ich würde vorschlagen, Einstellung
$this->attributes['slug'] = ...
in IhremsetTitleAttribute()
Funktion, so dass es ausgeführt wird, wenn Sie setzen einen Titel.Sonst, eine andere Lösung wäre, ein Ereignis zu erstellen, auf speichern Sie für Ihr Modell, die würden es dort.
Edit: Laut Kommentaren, es ist auch notwendig, um tatsächlich das title-Attribut in dieser Funktion sowie...
Einen Weg, dies zu erreichen, wäre die Haken in Modell Veranstaltungen. In diesem Fall möchten wir generieren eine Schnecke auf erstellen.
Müssen Sie auch fügen Sie den folgenden, um Ihre Anwendungen Liste von Aliasen (app.php):
Könnte man mit diesem Paket, welches ich https://github.com/cviebrock/eloquent-sluggable oder prüfen, wie es gilt, ein Beobachter auf das Modell speichern und wie es erzeugt eine einzigartige Slug, dann tun Sie das gleiche.
Sie möchten die slug wird basierend auf den Titel, wenn das title-Attribut festgelegt wird.
Andere alternative wäre die Verwendung einer ModelObserver und hören Sie die speichern Veranstaltung. Dies ermöglicht es Ihnen, zu generieren, die slug direkt vor dem Modell in die Datenbank geschrieben.
In beiden Fällen werden Sie wahrscheinlich wollen, um etwas Logik, um zu testen, ob die slug existiert bereits in der DB, das hinzufügen einer inkrementierten Nummer, wenn es funktioniert. ie foo-bar-baz-2. Der sicherste Ort für diese Logik wäre in der ModelObserver, wie es ausgeführt wird, die unmittelbar vor der Aktion schreiben.
Du hast 2 Möglichkeiten:
1. Fügen Sie lokal in einer controller-Methode diese Zeile:
Beispiel:
2. Fügen Sie es in Ihrem Modell zu überprüfen, ist es jedem speichern in db
Beispiel:
In jeder Weise, müssen Sie diesen code vor der Klassendeklaration: