2016-11-20 3 views
2

Я использую Laravel 5.3. Мой первый проект Laravel/опыт обучения В моем файле клика я использую следующий фрагмент, чтобы показать ошибки ниже поля после запроса PUT или POST.

В этом случае поле базы данных называется ПгвЬЫате

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

Теперь, так как у меня есть много полей, я держать repeatings этот блок для каждого поля. Я посмотрел документацию Laravel шаблонов Клинка (Расширение раздела Blade) и думал, что я мог бы сделать следующее в классе 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')

Но не повезло ... Я получаю ошибку «Undefined переменной: ошибки»

Looks как коллекция ошибок Laravel не доступен в этой точке зрения файла.

Цените любую помощь. Благодарю.

+0

Можете ли вы включить то, что вы хотите достичь? – Abrar

+0

Я не хочу копировать и вставлять блок if (errors ...) для каждого поля в моей форме.Вместо этого я хочу использовать шаблон макро/лезвие, такой как @showIfError ('fieldName'), и окончательный вывод будет отображаться как приведенный выше блок span. –

+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;?>'; 
     });