2012-12-13 6 views
22

Ich freue mich auf switching to laravel für mein nächstes Projekt.Dynamische URLs in Laravel?

Mein nächstes Projekt wird wahrscheinlich eine kleine Site mit ein paar statischen Seiten, einem Blog und einem Projektmanager sein und Controller, keine Routen verwenden.

Ich bin neugierig, wie ich dynamische Routen in Laravel verwalten kann.

Grundsätzlich möchte ich in einem Admin-Abschnitt bauen, so dass ich die statischen Seiten im Handumdrehen erstellen kann, und die statischen Seiten SEO-fokussierte URLs, z. http://domain.com/when-it-started Ich möchte nicht für jede Seite manuell einen neuen Controller oder eine neue Route erstellen müssen.

Also frage ich mich, was der sauberste Weg ist, damit umzugehen.

im Wesentlichen alle statischen Seiten werden die gleiche Ansicht zu teilen, nur ein paar Variablen zu ändern.

Das dynamische Routing sollte funktionieren mit die Controller nicht statt.

z. wenn wir einen Controller about mit einer Funktion haben staff dann soll dies über http://domain.com/about/staff

geladen werden, aber wir müssen nicht die Funktion players, so ein Aufruf an http://domain.com/about/players sollte die Datenbank überprüfen, um zu sehen, ob eine dynamische Route und Streichhölzer existiert. Wenn dies angezeigt wird, zeigen Sie andernfalls die 404-Seite an. Gleiches gilt für eine nicht existierende Steuerung. (z. B. würde es keinen when-it-started Controller geben!)

Die gewählte Antwort scheint in Laravel 4 nicht zu funktionieren. Irgendwelche Hilfe dabei?

+0

@anujarora Willkürlich Worte von Fragen/Antworten mit fett hervorgehoben für "bessere Highlights" wird nicht als eine gute Bearbeitung angesehen. Tatsächlich kann es als aktiv schädlich angesehen werden. Sehen Sie sich bitte [Ist das Bearbeiten von Beiträgen an, um nur fett hervorgehoben zu werden? Akzeptabel?] (Http://meta.stackexchange.com/q/158564/169503). –

+0

Ich mache keine zusätzlichen Anstrengungen für die Betonung. Ich habe nur Wörter hervorgehoben, die die Aufmerksamkeit auf sich ziehen und zu einem besseren Verständnis beitragen sollen. –

+2

@anujarora, aber der Punkt, den Xavi macht, ist, dass diese Art der Bearbeitung von den meisten Mitgliedern der Community als inakzeptabel betrachtet wird. Grammer und Rechtschreibung zu korrigieren ist gut, aber das Hinzufügen von "Hervorhebung" ist nicht etwas, das dem Post hinzugefügt wird. Bitte gehen Sie zu dem Link, den Xavi zur Verfügung gestellt hat, um – psubsee2003

Antwort

17

Für Laravel 4 Dazu

Route::get('{slug}', function($slug) { 
    $page = Page::where('slug', '=', $slug)->first(); 

    if (is_null($page)) 
     // use either one of the two lines below. I prefer the second now 
     // return Event::first('404'); 
     App::abort(404); 

    return View::make('pages.show', array('page' => $page)); 
}); 

// for controllers and views 
Route::get('{page}', array('as' => 'pages.show', 'uses' => '[email protected]')); 
+1

wie es funktioniert? Seite ist Modell? Was sind Anforderungen für Ansichten/Controller? –

+0

Ja Seite ist ein Modell, das aktualisiert wurde, um Codes für die Verwendung von Controllern und Ansichten anzuzeigen. Ich hoffe, das hilft. – CharlesS

+0

Das ist großartig (: –

8

Sie könnten die Wildcards der Route für den Job verwenden. Sie können mit (:any) beginnen. Wenn Sie mehrere URL-Segmente benötigen, fügen Sie optional (:all?) hinzu und identifizieren Sie dann die Seite aus dem Slug.

Zum Beispiel:

Route::get('(:any)', function($slug) { 
    $page = Page::where_slug($slug)->first(); 

    if (is_null($page)) 
     return Event::first('404'); 

    return View::make('page')->with($page); 
}); 
1

Sehr ähnlich Charles' Antwort, aber in der Steuerung:

public function showBySlug($slug) { 
    $post = Post::where('slug','=',$slug)->first(); 
    // would use app/posts/show.blade.php 
    return View::make('posts.show')->with(array( 
     'post' => $post, 
    )); 
} 

Dann können Sie routen so:

Route::get('post/{slug}', '[email protected]') 
    ->where('slug', '[\-_A-Za-z]+');` 

..., die die zusätzlichen Bonus haben Ihnen eine einfache Möglichkeit zu erlauben, direkt auf die Schnecke Routen auf einer Indexseite zu verbinden, zum Beispiel:

@foreach ($posts as $post) 
    <h2>{{ HTML::link(
     action('[email protected]', array($post->slug)), 
     $post->title 
    )}}</h2> 
@endforeach