Подтвердить что ты не робот

Проверить или удалить дополнительные поля в laravel

Можно ли проверять запрос с правилами для дополнительных полей или удалять эти поля из запроса?

Простой пример: у меня есть объект FormRequest с правилами:

public function rules() {
        return [
            'id' => 'required|integer',
            'company_name' => 'required|max:255',
        ];
    }

И когда я получаю почтовый запрос с любыми другими полями, я хочу получить ошибку/исключение в контроллере, или я хочу получить только поля id и company_name, без каких-либо других. Это какая-то особенность в laravel с этим, или я должен сделать это на моем пути?

4b9b3361

Ответ 1

Чтобы удалить ключ из запроса в Laravel, используйте:

$request->request->remove('key')

Ответ 2

В вашем почтовом запросе с laravel есть больше материала, чем только ваш ввод формы, поэтому вам нужно проверить запрос, чтобы увидеть, что внутри.

Чтобы получить только нужные поля, вы можете использовать:

$request->only(['fieldname1', 'fieldname2', 'fieldname3']);

или

$request->except(['fieldnameYouDontWant1', 'fieldnameYouDontWant2', 'fieldnameYouDontWant3']);

чтобы исключить те, которые вы не хотите.

Ответ 3

Начиная с Laravel 5.5 вы можете сделать это в своем контроллере:

public function store(StoreCompanyRequest $request)
{
    Company::create($request->validated());
}

Функция validated() возвращает только проверенные вами поля и удаляет все остальное.

Ответ 4

У меня есть новое решение для этого, создайте новую функцию в вашем классе запроса формы:

public function onlyInRules()
{
    return $this->only(array_keys($this->rules()));
}

Затем в вашем контроллере вызовите $request->onlyInRules() вместо $request->all()

Ответ 5

Все становится немного сложнее, когда вы начинаете получать проверки вложенных элементов массива, особенно если задействованы подстановочные знаки. Поместите это в свой собственный класс Request и введите его в свой метод контроллера. Должен охватывать все случаи.

public function authorize()
{
    //Dot notation makes it possible to parse nested values without recursion
    $original = array_dot($this->all());
    $filtered = [];
    $rules = collect($this->rules());
    $keys = $rules->keys();
    $rules->each(function ($rules, $key) use ($original, $keys, &$filtered) {
        //Allow for array or pipe-delimited rule-sets
        if (is_string($rules)) {
            $rules = explode('|', $rules);
        }
        //In case a rule requires an element to be an array, look for nested rules
        $nestedRules = $keys->filter(function ($otherKey) use ($key) {
            return (strpos($otherKey, "$key.") === 0);
        });
        //If the input must be an array, default missing nested rules to a wildcard
        if (in_array('array', $rules) && $nestedRules->isEmpty()) {
            $key .= ".*";
        }

        foreach ($original as $dotIndex => $element) {
            //fnmatch respects wildcard asterisks
            if (fnmatch($key, $dotIndex)) {
                //array_set respects dot-notation, building out a normal array
                array_set($filtered, $dotIndex, $element);
            }
        }
    });

    //Replace all input values with the filtered set
    $this->replace($filtered);

    //If field changes were attempted, but non were permitted, send back a 403
    return (empty($original) || !empty($this->all()));
}

Ответ 6

Вы можете использовать кроме метода запроса, который даст вам поля, за исключением заданных полей

$request = $request->except('your_field');

Если вы хотите удалить несколько полей из запроса, вы можете передать массив полей

$request = $request->except(['field_1','field_2',...])

Ссылка: запросы Laravel

Ответ 7

Я сделал это, переопределив метод validate() в классе FormRequest.

abstract class MyFormRequest extends FormRequest {
    public function validate() {
        foreach ($this->request->all() as $key => $value) {
            if (!array_key_exists($key, $this->rules())) {
                throw new ValidationException("Field " . $key . " is not allowed.");
            }
        }
        parent::validate();
    }
}

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

Ответ 8

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

public function store(Request $request)
{
    ModelName::create($request->only(['id','company_name']));
    return redirect('RouteName');
}

Ответ 9

Начальная форма Laravel 5.5 вы можете вызвать метод validate прямо на Request например.

class YourController extends Controller
{

    public function store(Request $request) {

      $cleanData = $request->validate([
        'id' => 'required|integer',
        'company_name' => 'required|max:255',
      ]);

      // Now you may safely pass $cleanData right to your model
      // because it ONLY contains fields that in your rules e.g

      $yourModel->create($cleanData);
  }
}

Ответ 10

$request->validated(); 

вернет только проверенные данные.

В вашем методе контроллера:

public function myController(ValidationRequest $request) {
    $data = $request->validated();
}

Ответ 11

К сожалению, большинство ответов здесь упущено из оригинального вопроса. Таким образом, вы хотите указать поля, которые необходимо проверить, в вашем классе FormRequest, а затем в вашем контроллере:

Something::create($request->validated());

Однако может случиться так, что вы хотите проверить определенное поле, но не передать его методу create в вашем контроллере. Проблема с выполнением $request->only() или $request->except() заключается в том, что вам нужно повторить поля из вашего класса FormRequest или повторить их в свойстве $guarded вашей модели.

К сожалению, единственный способ сделать то, что вы хотите, был следующим:

Something::create(collect($request->validated())->forget('field_you_dont_want')->toArray());