Laravel: как сделать недействительным обновление, если пропущено неизвестное поле - PullRequest
2 голосов
/ 06 июня 2019

У меня есть пользовательский валидатор:

    $validator = Validator::make($request->all(), [
        'name' => 'sometimes|unique:stock.containers|max:255',
    ]);

Я хотел бы выдать ошибку, если я сделаю:

 PUT:localhost/my/model?description=foobar

Поскольку я хочу принять только name в этом случае,Тогда я бы гарантировал, что мои $validator->valid() содержат только принятые поля.

Вот мой контроллер:

class ContainerController extends Controller
{
    public function update($id, Request $request) {
        $container = Container::find($id);

        $rules = ['name' => 'max:255'];

        $validator = Validator::make($request->all(), $rules);

        if ($validator->fails()) {
            return response()->json($validator->errors(), 422);  //i'm not getting any
        }

        $container->update($validator->valid());
    }
}

И с вышеупомянутым запросом я достигаю $container->update.Я хотел бы ограничить поле теми, которые упомянуты в моих правилах.

Ответы [ 3 ]

2 голосов
/ 06 июня 2019

Вы можете использовать встроенный validate метод контроллера вместо создания нового экземпляра Validator.

public function update($id, Request $request) {
    $valid = $this->validate($request, [
        'name' => 'max:255',
    ]);

    dd($valid);
}

Так что даже если кто-то отправляет другие параметры, которые не включены в правила,он не будет включен.

В нашем случае, если вы выполните запрос curl, как упомянуто, $valid вернет пустой массив.

И затем вы можете проверить, является ли массив пустымили нет:

if (empty($valid)) {
    // Do what you want
}

Примечание:

Я заметил, что вы используете Container::find($id);, но вы также можете использовать привязку встроенной модели в файле маршрутов:

Route::put('your-path/{container}', 'ContainerController@update');

Вместо

Route::put('your-path/{id}', 'ContainerController@update');

Что бы разрешить это в вашем контроллере:

public function update(Container $container, Request $request)
{
    // $container would be the Container instance already
}

Обновление

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

$validator = \Validator::make($request->all(), $rules);


if ($validator->fails()) {
    // ...
}

if (! $valid = $validator->validated()) {
    // Nothing has been validated
}

В основном вам следует использовать $validator->validated() вместо $validator->valid(), чтобы получить поля только из ваших правил.

1 голос
/ 06 июня 2019

Вы можете просто использовать метод ->only():

class ContainerController extends Controller
{
    public function update($id, Request $request) {
        $container = Container::find($id);

        $rules = ['name' => 'max:255'];

        $validator = Validator::make($request->all(), $rules);

        if ($validator->fails()) {
            return response()->json($validator->errors(), 422);  //i'm not getting any
        }

        $container->update($request->only(['name']));
    }
}

Из документов:

Единственный метод возвращает все запрошенные вами пары ключ / значение;однако он не будет возвращать пары ключ / значение, которые отсутствуют в запросе.

1 голос
/ 06 июня 2019

Что вы можете сделать, это сделать тип запроса, который отфильтровывает нежелательные параметры, чтобы вы могли передать его в свой контроллер, например: private function myfunction(MyCustomRequest $request), так что к тому времени, когда он достигнет вашего валидатора, недопустимые параметрыуже были удалены.

В вашем MyCustomRequest вы можете иметь список допустимых параметров, например:

 $validParameters = ["name"]; // add as many as you need

Итак, вы хотите проверить, что находится в запросе, чтовы можете увидеть, используя $request->all().Вы можете перебирать свои действительные параметры и передавать только те значения запросов, которые соответствуют вашему пользовательскому списку.

 $requestData = $request->all();

 $goodRequestData = [];

 foreach ($validParameters as $validParameter) {
      if (array_key_exists($validParameter, $requestData) {
           $goodRequestData[] = $requestData[$validParameter];
      }
 }

 return $goodRequestData;

Подробнее о пользовательских запросах вы можете прочитать в документации по Laravel здесь: https://laravel.com/docs/5.8/validation#creating-form-requests

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