2016-05-10 2 views
1

У меня есть поле ввода, которое я динамически добавляю с помощью jQuery, это поле ввода для видео-ссылок, которое пользователь может добавить столько раз, сколько захочет, и мне нужно проверить, не является ли URL-адрес действителен для всех полей, если в них что-то написано, мне также необходимо оставить его как необязательное поле. Я пытался сделать это, следуя this example но, очевидно, не работает для меня:Проверка массива Laravel 5.2

Это моя полевая форма:

{!! Form::text('external_media[]', null,['class' => 'form-control col-lg-10 external-media-input']) !!} 

И в моем контроллер магазине функции Я пытался проверить это следующим образом:

$this->validate($request->all(), [ 
     'external_media.*' => 'present|active_url', 
    ]); 

Когда я отправляю данные из формы создания, $request->all() выглядит следующим образом:

array:11 [▼ 
"_token" => "JQXZjFEs3ETgVqh2izcmJx1h3sGryFvDkzGGtVAd" 
"external_media" => array:3 [▶] 
"category" => "1" 
"type" => "0" 
"title" => "sdbvsdb" 
] 

Но я получаю ошибку:

FatalThrowableError in ValidatesRequests.php line 49: 
Type error: Argument 1 passed to App\Http\Controllers\Controller::validate() must be an instance of Illuminate\Http\Request, array given, called in /home/vagrant/Projects/myProject/app/Http/Controllers/Admin/Articles/ArticlesController.php on line 66 

Я также попытался с созданием проверки с правилами в запросах файлы, как это:

$rules = [ 
    'title' => 'required', 
    'text' => 'required', 
    //'image' => 'required|image|max:20000', 
    ]; 

foreach($this->request->get('external_media') as $val) 
{ 
    $rules[$val] = 'present|active_url'; 
} 

return $rules; 

Но тогда, когда у меня есть пустое поле для external_media, Я получаю эту ошибку:

ErrorException in helpers.php line 531: 
htmlentities() expects parameter 1 to be string, array given (View: /home/vagrant/Projects/iCoop5.2/resources/views/admin/articles/create.blade.php) 
+0

Почему вы не используете проверку active_url для проверки URL-адресов? https://laravel.com/docs/5.2/validation#rule-active-url – Abhishek

+0

Или это https://laravel.com/docs/5.2/validation#rule-url – Abhishek

+0

Я изменил это, но это, очевидно, не проблема, я получаю эту ошибку, потому что есть проблема с массивом, она даже не входит в часть проверки. Возможно, название не отражает, какова реальная проблема, я отредактирую вопрос. – Marco

ответ

3
$inputs = request()->all(); 
$validator = Validator::make($inputs, [ 
    'external_link.*' => 'required|active_url', 
]); 

dd($validator->messages()); 

Не забудьте use Validator; в файле.

+0

как можно настроить отображение сообщений для каждого поля массива – Learner

0

FatalThrowableError in ValidatesRequests.php line 49: Type error: Argument 1 passed to App\Http\Controllers\Controller::validate() must be an instance of Illuminate\Http\Request, array given, called in /home/vagrant/Projects/myProject/app/Http/Controllers/Admin/Articles/ArticlesController.php on line 66

это просто означает, что он говорит. Вы должны быть пропусканием $request объект не массив из $request->all()

$this->validate($request, ....); 

ErrorException in helpers.php line 531: htmlentities() expects parameter 1 to be string, array given (View: /home/vagrant/Projects/iCoop5.2/resources/views/admin/articles/create.blade.php)

Это, вероятно, потому, что Html и форма упаковки из LaravelCollective не обрабатывает массивы. Он ожидает, что каждое поле будет единственным значением.

Update

Тот факт, что вы получаете перенаправлены обратно с ошибками означает, что проверка не удается. Дамп ошибки проверки, если они существуют, чтобы увидеть, работает ли она как ожидалось, до вы получаете форму. Это позволит избежать этой ошибки с помощью FormBuilder, который вы видите. Как только вы сможете подтвердить, что ваша валидация работает должным образом, вы можете перейти к решению этой проблемы с помощью FormBuilder.

+0

Да, но в этом случае мне нужно передать массив, поэтому я задаюсь вопросом, как проверить массив. – Marco

+0

Проверка массива и Помощника формы, пытающихся справиться с полем, - это две разные вещи. Я просто пытаюсь указать, почему вы получаете ошибки, которые вы получаете, чтобы вы могли вернуться к выяснению фактической части валидации :). – lagbox

-2

как говорят Laravel 5.2 документации: https://laravel.com/docs/5.2/validation

Если вы не хотите использовать метод проверки признака ValidatesRequests, вы можете создать экземпляр валидатор вручную с помощью средства проверки фасада. Метод делают на фасаде создает новый экземпляр валидатор:

namespace App\Http\Controllers; 

use Validator; 
use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 

class PostController extends Controller 
{ 
    /** 
    * Store a new blog post. 
    * 
    * @param Request $request 
    * @return Response 
    */ 
    public function store(Request $request) 
    { 
     $validator = Validator::make($request->all(), [ 
      'title' => 'required|unique:posts|max:255', 
      'body' => 'required', 
     ]); 

     if ($validator->fails()) { 
      return redirect('post/create') 
         ->withErrors($validator) 
         ->withInput(); 
     } 

     // Store the blog post... 
    } 
} 
+0

Да, но как сделать проверку массива, а затем в контроллере, если бы вы могли показать код? – Marco

0

плз попробовать, как показано ниже от Laravel Docs

https://laravel.com/docs/5.2/validation

public function store(Request $request) 
{ 
    $this->validate($request, [ 
     'title' => 'required|unique:posts|max:255', 
     'body' => 'required', 
    ]); 

    // The blog post is valid, store in database... 
}