2016-11-20 118 views
2

我正在使用Laravel 5.3。我的第一个Laravel项目/学习经验 在我的刀片文件中,我使用以下片段在PUT或POST请求之后的字段下显示错误。

在这种情况下,数据库字段称为的firstName

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

现在,因为我有很多领域,我必须保持repeatings这个块各个领域。我抬头看了看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;?>'; 
     });