2017-01-16 8 views
0

私のアプリでは友好的なURLを作成していますが、機能していないので、アプリは " - "に関するいくつかの問題を抱えています。 それは私のエラーを与えている:URLは友好的です

ErrorException in PostController.php line 60: 
Trying to get property of non-object 

私の理想的なURLは次のとおりです。

http://domain.com/CATEGORY-title-of-post-ID 

私のルートは以下のとおりです。

Route::get('{category}-{title}-{id}', '[email protected]'); 

のPostControllerショー機能:

public function show($category,$title,$id) 
    { 
     $post = Post::find($id); 
     $user = Auth::user(); 

     $comments = Comment::where('post_id',$id) 
          ->where('approved',1) 
          ->get(); 




     return view('posts.show',compact('post','comments','user')); 
    } 

ブレード表示:

<?php 
    $title_seo = str_slug($feature->title, '-'); 
?> 
<a href="{{url($feature->categories[0]->internal_name."-".$title_seo."-".$feature->id)}}" rel="bookmark"> 
...</a> 

答えて

2

各ポストのためのユニークスラッグ、正しくURLエンコードそれが作成されますEloquent-Sluggableと呼ばれるライブラリがあります。インストールする

は(ドキュメントから取られた):

composer require cviebrock/eloquent-sluggable:^4.1 

そして、サービスプロバイダのエントリを追加することによってconfig/app.phpを更新します。お使いのモデルにコードはSluggable形質を追加し、使用するには

php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider" 

'providers' => [ 
    // ... 
    Cviebrock\EloquentSluggable\ServiceProvider::class, 
]; 

最後に、コマンドラインから再び、デフォルトの設定ファイルを公開

use Cviebrock\EloquentSluggable\Sluggable; 

class Post extends Model 
{ 
    use Sluggable; 

    /** 
* Return the sluggable configuration array for this model. 
* 
* @return array 
*/ 
public function sluggable() 
{ 
    return [ 
     'slug' => [ 
      'source' => 'title' 
      ] 
     ]; 
    } 

} 

保存するとモデルのインスタンスでは、ライブラリは自動的にスラッグを作成し、モデルテーブルの新しく作成されたslugカラムに保存します。あなたが使用するスラッグにアクセスするには$model->slug

デフォルトでtitleから作成するのではなく、希望するスラッグを達成するには。あなたはそうのように、関連するモデルの属性にアクセスするには、ドット表記法を使用して、sluggable方法フィールド名の配列のsource属性を渡すことができます。

public function sluggable() 
{ 
    return [ 
     'slug' => [ 
      'source' => ['category.name','title','id'] 
      ] 
     ]; 
    } 

} 
+0

こんにちは応答に感謝、私はちょうどそれを実装し、すでに私のデータベースに保存しますが、私は私のルートでそれを構造化する方法を一つの質問を持っているのですか?それでも私にはエラーが出ます。 – Pedro

+0

'{category} - {title} - {id}'を使わなければならない理由はありますか?私はあなたがそれぞれダッシュで区切っているので、また使い捨ての使用もダッシュしていると考えているので、カテゴリが終了してタイトルが始まるときは分かりません。デフォルトの例のように 'title'を使用するなら、それをあなたのコントローラに渡し、' Posts :: where( 'slug'、$ slug) - > first(); 'を実行することができます。それでもカテゴリを使用したい場合は、スラッシュ( '/')を使用して区切ってルートに反映させるのが最善です – TimothyBuktu

1

を手動であなたの「優しいURLを」generingているのはなぜ?

指定されたパラメータに基づいてURLを構築するヘルパー関数があります。これはです。

Route::get('{category}-{title}-{id}', [ 
    'as => 'post.show', 
    'uses' => '[email protected]' 
]); 

echo route('post.show', ['testing', 'title', 'id']); // http://domain.dev/testing-title-id 

これはとにかく、SEOフレンドリーなURLを実施するための最良のアプローチではありません。あなたは、常にポストを見つけるためにあなたのIDを使用して、コントローラで


、それは、カテゴリとタイトルがユーザーに提供する必要があるリソースを決定するために、完全に役に立たないことを意味しています。

あなたのような何か行うことであなたの人生を容易にすることができます。

class Post 
{ 
    [...] 

    public function slug() 
    { 
     return str_slug("{$this->category}-{$this->title}"); 
    } 
} 
:あなたはあなたのポストのためのスラグを生成するヘルパー関数を作成

あなたのモデルでは
Route::get('{id}-{slug}', [ 
    'as => 'post.show', 
    'uses' => '[email protected]' 
]); 

echo route('post.show', ['id', 'slug']); // http://domain.dev/id-slug 

あなたのコントローラでは、記事へのアクセスに使用されたスラッグが正しいかどうかをチェックする必要があります。 Googleが間違ったスラグで投稿をインデックスに登録しないようにします。基本的にURLを特定の方法で強制し、インデックスポイントを失うことはありません。

class PostController 
{ 
    [...] 

    public function show($id, $slug) 
    { 
     $post = Post::findOrFail($id); 
     $user = Auth::user(); 

     if ($post->slug() !== $slug) { 
      return redirect()->route('posts.show', ['id' => 1, 'slug' => $post->slug()]); 
     } 

     $comments = Comment::where('post_id', $id)->where('approved', 1)->get(); 
     return view('posts.show', compact('post', 'comments', 'user')); 
    } 
} 
関連する問題