2016-08-03 1 views
3

В мой контроллер я получаю Illuminate\Http\Request запрос, который содержит некоторые данные со значениями, равными пустой строке:Запрос на изменение входных значений из пустой строки в нуль в Laravel

dd($request->input()) 

//output 
array:5 [▼ 
    "_token" => "K43q88mR5zQRqVPAuYX5IWtQ1khQ24JTsuxl8mz4" 
    "param1" => "1" 
    "param2" => "2" 
    "param3" => "" 
    "param4" => "" 
] 

(в основном это происходит, когда пользователь имел сделал не выбор в создании формы, но из-за ограничений в веб-интерфейсе see here, я не умею менять форму запроса так, чтобы исключить пустые строковые значения от отправки на сервер)

Requ est входные данные используются для привязки отношений к моделям. Например:

$book->authors()->attach($request->input('param1')); 

Проблема заключается в том, что, когда входное значение равно пустой строке "" выше линии бросает QueryException, так как он пытается добавить внешний ключ равен "" в сводной таблице.

С другой стороны, я не заметил, что если значение null вместо "", метод attach() не выполняется, и, таким образом, не генерирует исключение, ни обновляет базу данных, которая точно поведение, я хочу, когда пользователь не сделал выбор в форме ввода.

Мой вопрос: Как изменить значения запроса от "" до null? Моя первая мысль заключалась в том, чтобы создать вспомогательную функцию, которая выполняет итерацию над массивом ввода запроса и заменяет «" на нуль и использует его в контроллере, но для меня это не кажется хорошей идеей, потому что это не предотвратит возможные нежелательные ошибки проверки , при использовании проверки запроса формы.

Любые идеи, пожалуйста ???

Спасибо заранее

ответ

6

Примечание: Laravel 5.4 теперь поставляется с этой функцией

https://laravel.com/docs/5.4/requests#input-trimming-and-normalization

Для версий> 5,4 см ниже ответ или просто скопировать официальные промежуточное программное.


HTTP middleware provide a convenient mechanism for filtering HTTP requests entering your application.

Сделать промежуточное программное обеспечение и назначить его на маршрутах или методов контроллера вы хотите, чтобы иметь место.

Пример:

class SanitizeMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     foreach ($request->input() as $key => $value) { 
      if (empty($value)) { 
       $request->request->set($key, null); 
      } 
     } 

     return $next($request); 
    } 
} 
Route::post('/users', function (Request $request) { 

    dd($request->input()); 

})->middleware(SanitizeMiddleware::class); 
+1

Благодарим за это, однако любой, кто использует его, может захотеть проверить экспликацию на строку «0», которая совершенно верна. 'if ($ value! == '0' && empty ($ value)) {' –

0

Разве вы не можете просто проверить, прежде чем добавить товар в сводной таблице?

if(!empty($request->input('paramX'))){ 
    $book->authors()->attach($request->input('paramX')); 
} 
+0

Спасибо за ваш ответ я acctualy с помощью 'если (! $ Request-> вход ('paramX') = "")' для каждого входного параметра. То, что я прошу, - это более «глобальный», без необходимости включать оператор if каждый раз для каждого входного параметра запроса. – ira