2016-11-20 11 views
2

私はLaravel 5.3を使用しています。私の最初のLaravelプロジェクト/学習経験 私のブレードファイルでは、以下のスニペットを使用して、PUTまたはPOSTリクエスト後にフィールドの下のエラーを表示します。

この場合、データベースのフィールドは、私は多くの分野を持っているので、私はすべてのフィールドにrepeatingsにこのブロックを維持しているのfirstName

 @if ($errors->has('firstName')) 
      <span class="help-block"> 
       <strong>{{ $errors->first('firstName') }}</strong> 
      </span> 
     @endif 

と呼ばれています。私は(刃部を拡張する)ブレードテンプレートにLaravelのドキュメントを見て、私はAppServiceProviderクラスで次の操作を行うことができると思った(AppServiceProviderの.php)

public function boot() 
{ 
    // 
    Blade::directive('showIfError', function($fieldName) { 
     if ($errors->has('$fieldName')) { 
      echo "<span class='help-block'> 
      <strong> $errors->first('$fieldName') </strong> 
      </span>"; 
     } 
    }); 
} 

、その後

@showIfError(「firstNameの」を使用します)

しかし、運...私はエラー「未定義の変数を:エラー」を取得Laravelエラーコレクションは、このビューのファイルにアクセスできないように

が見えます。

ありがとうございました。ありがとう。

+0

達成したいことを含めることができますか? – Abrar

+0

フォームの各フィールドのif(errors ...)ブロックをコピー&ペーストしたくありません。代わりに、@showIfError( 'fieldName')のようなマクロ/ブレードテンプレートが必要で、最終出力は上記のスパンブロックのようにレンダリングされます。 –

+0

私はビューのキャッシュが出力を妨げていることがわかります。私がストレージ(キャッシュ)フォルダ内のすべてのファイルを削除すると、セッション( 'エラー')を使って動作させることができますが、一度しか動作しません!同じエラーでフォームを再度送信しても、出力は生成されません。このため、私は答えがうまくいくかどうか完全にテストすることができません:-( さらに、Blade :: directive関数は2つの引数を取っていません。 –

答えて

1

物は$errorsで閉鎖できません。また、クロージャーが文字列のみを受け付けるディレクティブとしてオブジェクト全体を渡すことはできません。単純なデータでは、implode()とそれに続いてexplode()となりますが、オブジェクトやコレクションではできません。

あなたができることは、閉鎖の中で手動で$errorsを作成することです。

は、私はそれをテストしたのだが、期待通りに動作します:

Blade::directive('showIfError', function($fieldName) { 
    $errors = session('errors'); 

    if ($errors->has($fieldName)) { 
     return "<span class='help-block'>".$errors->first($fieldName)."</span>"; 
    } 
}); 
0

問題は$エラー変数は、ビュー内でのみ利用可能であるということです。変数(https://github.com/laravel/framework/blob/5.0/src/Illuminate/View/Middleware/ShareErrorsFromSession.php)を共有するミドルウェアを見ると、セッションに格納されていることがわかります。

次のようにだからあなたはそれにアクセスすることができます。

$errors = session()->get('errors'); 

注意をあなたの例では、あなたは他の問題のカップルを持っています。 $ fieldName変数は引用符で囲まないでください。例:

public function boot() { 
Blade::directive('showIfError', function($fieldName) { 
$errors = session()->get('errors'); 
if ($errors->has($fieldName)) { 
     echo "<span class='help-block'> <strong>". $errors->first($fieldName). "</strong> </span>"; 
} 
}); 
} 
0

最後に、私のビューの中にPHP関数を書いて、さまざまなフィールド名で呼んでいます。 これは良いアプローチだと思います。これを実装する最善の方法は何か分かりません。

function showIfError($fieldName) 
{ 
    $errors=session('errors'); 
    if (count($errors)>0) { 
     if (session('errors')->has($fieldName)) { 
      $msg=$errors->first($fieldName); 
      echo '<span class="help-block"> 
        <strong>'. $msg.' </strong> 
       </span>'; 
     } 
    } 

} 
2

これは遅れて返信されますが、これは来てくれた他の人に役立つとうまくいけばいいです。カスタムブレードディレクティブは、テンプレートがレンダリングされたときに評価される文字列PHPコードを返すことになっています。 $errors変数は、応答が行われたときにのみ使用可能であるため、指示文で評価しようとすると機能しません。解決策は次のとおりです。

// custom blade directive to render the error block if input has error 
// put this inside your service provider's boot method 

    \Blade::directive('errorBlock', function ($input) { 
      return 
       '<?php if($errors->has('.$input.')):?> 
        <div class=\'form-control-feedback\'> 
         <i class=\'icon-cancel-circle2\'></i> 
        </div> 
        <span class=\'help-block\'> 
          <strong><?php echo $errors->first('.$input.') ?></strong> 
        </span> 
       <?php endif;?>'; 
     }); 
関連する問題