Ответ 1
Чтобы удалить ключ из запроса в Laravel, используйте:
$request->request->remove('key')
Можно ли проверять запрос с правилами для дополнительных полей или удалять эти поля из запроса?
Простой пример: у меня есть объект FormRequest с правилами:
public function rules() {
return [
'id' => 'required|integer',
'company_name' => 'required|max:255',
];
}
И когда я получаю почтовый запрос с любыми другими полями, я хочу получить ошибку/исключение в контроллере, или я хочу получить только поля id и company_name, без каких-либо других. Это какая-то особенность в laravel с этим, или я должен сделать это на моем пути?
Чтобы удалить ключ из запроса в Laravel, используйте:
$request->request->remove('key')
В вашем почтовом запросе с laravel есть больше материала, чем только ваш ввод формы, поэтому вам нужно проверить запрос, чтобы увидеть, что внутри.
Чтобы получить только нужные поля, вы можете использовать:
$request->only(['fieldname1', 'fieldname2', 'fieldname3']);
или
$request->except(['fieldnameYouDontWant1', 'fieldnameYouDontWant2', 'fieldnameYouDontWant3']);
чтобы исключить те, которые вы не хотите.
Начиная с Laravel 5.5 вы можете сделать это в своем контроллере:
public function store(StoreCompanyRequest $request)
{
Company::create($request->validated());
}
Функция validated() возвращает только проверенные вами поля и удаляет все остальное.
У меня есть новое решение для этого, создайте новую функцию в вашем классе запроса формы:
public function onlyInRules()
{
return $this->only(array_keys($this->rules()));
}
Затем в вашем контроллере вызовите $request->onlyInRules()
вместо $request->all()
Все становится немного сложнее, когда вы начинаете получать проверки вложенных элементов массива, особенно если задействованы подстановочные знаки. Поместите это в свой собственный класс 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()));
}
Вы можете использовать кроме метода запроса, который даст вам поля, за исключением заданных полей
$request = $request->except('your_field');
Если вы хотите удалить несколько полей из запроса, вы можете передать массив полей
$request = $request->except(['field_1','field_2',...])
Я сделал это, переопределив метод 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();
}
}
Я думаю, что это не лучший способ, но он работает. Я должен обновить его, чтобы сразу отображать информацию обо всех неправильных полях:)
Вы можете сделать это через свой контроллер. Вы можете отправить только два или несколько полей в базу данных. Используйте $request->only()
вместо $request->all()
и передайте массив данных, которые вы хотите сохранить в базе данных. Ваш метод controller
store()
должен выглядеть следующим образом:
public function store(Request $request)
{
ModelName::create($request->only(['id','company_name']));
return redirect('RouteName');
}
Начальная форма 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);
}
}
$request->validated();
вернет только проверенные данные.
В вашем методе контроллера:
public function myController(ValidationRequest $request) {
$data = $request->validated();
}
К сожалению, большинство ответов здесь упущено из оригинального вопроса. Таким образом, вы хотите указать поля, которые необходимо проверить, в вашем классе FormRequest, а затем в вашем контроллере:
Something::create($request->validated());
Однако может случиться так, что вы хотите проверить определенное поле, но не передать его методу create
в вашем контроллере. Проблема с выполнением $request->only()
или $request->except()
заключается в том, что вам нужно повторить поля из вашего класса FormRequest или повторить их в свойстве $guarded
вашей модели.
К сожалению, единственный способ сделать то, что вы хотите, был следующим:
Something::create(collect($request->validated())->forget('field_you_dont_want')->toArray());