Как проверить массив в Laravel и вернуть его отфильтрованные значения? - PullRequest
0 голосов
/ 13 мая 2018

Таким образом, Laravel не удаляет вложенные элементы в проверке массива. Это проблема для меня, потому что я пытаюсь динамически обновлять отношения. Если пользователь подделывает другой Элемент, Laravel взрывается и выдает мне ошибку:

 SQLSTATE[HY000]: General error: 1 no such column: country

Я проверил, где проблема, и это происходит:

$request->validated()

Если вы хотите проверить это, вот мой метод теста:

/** @test */
public function test() {
    $result = $this->json('GET', route('test'), [
       'test' => ['a' => 'test a', 'b' => 'I should not be here'], 
       'isIgnored' => 'no one is seeing that']
    )->json());
}

В контроллере вы подтверждаете:

public function update()
{
   $validatedData = request()->validate([
       'test.a' => 'required'
     ]);
}   

Результат $ validatedData равен

array:1 [
  "test" => array:2 [
       "a" => "test a"
       "b" => "I should not be here"
  ]
]

Возможно, вы видите, что "isIgnored" был проигнорирован, но test.b нет. После этого мой контроллер пытается обновить модель с

$user->$relation()->update($values);

и взрывается. И я думал об использовании защищенного $ fillable, но все еще безуспешно. Это просто не игнорирует это.

Я использую sqlite для тестирования на Laravel 5.6.

1 Ответ

0 голосов
/ 13 мая 2018

Если вы проверите источник Laravel ValidatesRequests, вы увидите следующий код:

/**
 * Validate the given request with the given rules.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  array  $rules
 * @param  array  $messages
 * @param  array  $customAttributes
 * @return array
 */
public function validate(Request $request, array $rules,
                         array $messages = [], array $customAttributes = [])
{
    $this->getValidationFactory()
         ->make($request->all(), $rules, $messages, $customAttributes)
         ->validate();

    return $this->extractInputFromRules($request, $rules);
}

/**
 * Get the request input based on the given validation rules.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  array  $rules
 * @return array
 */
protected function extractInputFromRules(Request $request, array $rules)
{
    return $request->only(collect($rules)->keys()->map(function ($rule) {
        return Str::contains($rule, '.') ? explode('.', $rule)[0] : $rule;
    })->unique()->toArray());
}

То, что вы видите, вызвано этой строкой в ​​методе map():

return Str::contains($rule, '.') ? explode('.', $rule)[0] : $rule;

Если ключ содержит ., будет использоваться только первый элемент этой разнесенной строки.Так что в вашем случае он вернет все данные под ключом test.

Этот метод не позволяет вам отфильтровывать определенные элементы массива, вам придется сделать это самостоятельно.Вы уже знаете, что хотите проверить, в вашем случае a, поэтому не составит труда удалить ненужные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...