2017-12-09 1 views
0

Ich baue meine erste Laravel App.Versucht, alle Beiträge in der gegebenen Kategorie anzuzeigen - Fehler erhalten

Ich versuche, alle Beiträge in X-Kategorie anzuzeigen.

Meine Routen:

Route::get('/', '[email protected]')->name('home'); 
Route::get('/{id}/{slug?}', '[email protected]')->name('show'); 
Route::get('/categories/{category}', '[email protected]')->name('category'); 

Meine Kategorie Modell:

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Category extends Model 
{ 
    public function posts() 
    { 
     return $this->hasMany(Post::class); 
    } 

    public function getRouteKeyName() 
    { 
     return 'slug'; 
    } 
} 

Meine Kategorie Controller:

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use App\Category; 

class CategoriesController extends Controller 
{ 
    public function index(Category $category) 
    { 
     $posts = $category->posts; 

     return view('index', compact('posts')); 
    } 
} 

Erste: „Sorry, die Seite, die Sie suchen nicht sein könnte gefunden. "

funktioniert, wenn ich ändern:

Route::get('/{id}/{slug?}', '[email protected]')->name('show'); 

An:

Route::get('/{post}', '[email protected]')->name('show'); 

Vielen Dank im Voraus!

Antwort

0

Ihre Route /{id}/{slug?} regex categories Ihrer anderen Weg, das Wort ist die Erfassung und verhindern, dass es wie erwartet funktionieren. Sie haben 2 Optionen hier:

  • Verschieben Sie die categories/{category} bis zur Post Route. Laravel Routen stoppt beim ersten Spiel.
  • definieren, was {id}

    sein kann
    Route::get('/{id}/{slug?}', '[email protected]')->name('show')->where('id', '[0-9]*'); 
    

Wie auch immer, wenn die Post-ID Route ein Back-End-Route ist, werde ich Ihnen empfehlen, wie posts/{id}/{slug?} zu Präfix. Wenn es sich um ein Frontend handelt, wählen Sie eine der vorherigen Lösungen (oder sogar beide).

+0

vielen dank! Könnten Sie mir mehr darüber erzählen, wie die Regex "/ {id}/{slug?}" Die Wortkategorien von einer anderen Route erfasst hat? Und warum wurde ein {id} einfach so festgelegt? – wdotis

+0

@wdotis Der '{id}' ist ein Regex-Platzhalter, wenn Sie ihn nicht mit 'where' definieren, ist ein Regex wie'. * ', Mit anderen Worten, passen Sie jede einzelne Route an. Wenn Sie die Datei mit dem Where definieren, ändern Sie das '. *' In '[0-9] *', was nur Zahlen bedeutet. – Lloople

+1

du bist großartig! – wdotis

0

Das klingt wie die Route, die falsch konfiguriert ist, manchmal kann die Reihenfolge, in der Sie die Routen definieren, Probleme verursachen.

versuchen, die Routen in Theis, um zu definieren, anstatt zu sehen, ob es einen Unterschied macht:

Route::get('/{id}/{slug?}', '[email protected]')->name('show'); 
Route::get('/', '[email protected]')->name('home'); 
Route::get('/categories/{category}', '[email protected]')->name('category'); 
0

Wenn Sie viele oder viele Beziehungen zwischen Kategorien und Posts haben, können Sie das tun.

Route::get('categories/{category_slug?}',['as'=>'category.show','uses'=>'[email protected]'}) 

und in Ihrem Controller;

public function Show($category_slug){ 

     $category = Category::where('category_slug',$category_slug)->first(); 


     return view('index',compact('category')); 
    } 

und in Ihrer Klinge;

@foreach($category->posts as $post) 
    $post->title 
    $post->content 
@endforeach 
Verwandte Themen