2016-07-13 16 views
1

私は正確に解決できず、これからどこから始めるべきかわからない問題を抱えていました。コントローラに注入されたモデルを使用したLaravelカスタムエラー

私はLaravelが素晴らしいfindOrFail()機能を持っていることを知っていますが、私の場合は使用できません。したがって、たとえば、私は次のようにルートを持っている:

Route::get('user/{user}', '[email protected]); 

私のコントローラ

public function show(User $user) 
{ 
    //never reaches this section 
} 

を今、これは正常に動作しますが、レコードが存在しない場合、私は、関数の中に入る前に、Laravelはエラーをスローします。私はそれが非常に良く、私の関数パラメータでユーザークラスを持っており、そこにそれを削除しないように願って見つける

public function show($id) 
{ 
    $user = User::findOrFail($id) 
} 

に私の機能を変更せずにエラーをキャッチする素晴らしく、簡単な方法はあります。

答えて

2

(見出し「『が見つかりません』動作のカスタマイズ」にスクロールダウン):あなたがあなた自身の「見つかりません」という動作を指定したい場合に3番目の引数としてClosureを渡し、

model方法:以前そのコードを配置する場所を、彼らが指定

$router->model('user', 'App\User', function() { 
    throw new NotFoundHttpException; 
}); 

RouteServiceProvider::bootメソッドでモデルバインディングを定義する必要があります。

+1

私はこれを逃したどのように愚かな、非常にそれは私の問題を解決してくれてありがとう! – killstreet

0

初めて質問に答えるので、私と一緒に熊!

PHP try/catchブロックを使用できます。したがって、このような何か:エラーを表示するには

@if(!empty($error) && $error == 1) 
    <div> 
     <strong>Uh-Oh!</strong> 
     @if(!empty($message)) 
      {!! $message !!} 
     @endif 
    </div> 
@endif 

try { 
     //Your code here 
    } catch (\Exception $e) { 
     return \Redirect::to('/users') 
      ->with('error', 1) 
      ->with('message', 'Error getting your record!'); 
    } 

そしてあなたLaravelにあなたのような何かを行うことができますブレード。必要なエラーページにリダイレクトすることもできます。 the Laravel Docs for Route Model Bindingパー

+1

問題は、自分の機能の中で何かを行う前にエラーが表示されていることです。エコー "テスト"を入れても、死ぬ;私の機能の中でこれは表示されません。 – killstreet

+0

あなたのコードがあなたの関数に到達していない場合は、あらかじめ問題があることを意味します!あなたのルートは、ユーザーIDのURLパラメータを持つGETです。ですから、関数は最初の行で 'public function show($ userid)'を読みます。クエリを実行すると、 '$ user = User :: find($ userid)'のようなことができます。 – user3776578

+0

Laravel 5では、 'app() - > make(\ App \ Models)のようにすることもできます。 \ User :: class) - > where( 'users.id'、 '='、$ userid) - > get();これはあなたのモデルを注入する必要はありません。 – user3776578

関連する問題