Как заполнить поля из HTML-формы в Laravel?

Я работаю над созданием формы, в которой я хочу заполнить поля, поступающие из формы (которую я назвал posting.blade.php)

Контроллер, который я использовал для этого:

public function store(Request $request)
{
    $this->validate($request, [
    'name' => 'required',
    'email' => 'required|email',
    'number' => 'required',
    'city' => 'required',
    'post' => 'required'
    ]);

    Mail::send('emails.posting-message', [
    'msg'=> $request->message
    ], function($mail) use($request) {
        $mail->from($request->email, $request->name);
        $mail->to('[email protected]')->subject('Contact Message');
    });
    return redirect()->back()->with('flash_message', 'Thank you for your message');
}


Постановка задачи:

Текущий контроллер ничего не возвращает, так как в строке 'msg'=> $request->message нет сообщения в валидации. Но если я использую

'msg'=> $request->name (возвращает имя)

Мне интересно, какие изменения я должен внести в контроллер, чтобы он возвращал каждое поле, присутствующее в проверке.

Я пробовал с этим, но он возвращает только последнее значение, которое является сообщением.

       'msg'=> $request->name,
       'msg'=> $request->email,
       'msg'=> $request->number,
       'msg'=> $request->city,
       'msg'=> $request->post

Использование старого ввода - лучший способ сделать это. ИМО. Поскольку он усилен самим Laravel. laravel.com/docs/5.6/requests

Rafael 22.08.2018 22:43

Что значит ИМО?

flash 22.08.2018 23:04

По моему мнению. :)

Rafael 22.08.2018 23:04

Если честно, я не так много работал над Laravel. Мне интересно, можете ли вы указать мне, какие изменения мне нужно внести в код

flash 22.08.2018 23:07

Чувак, выслушай меня, когда я это скажу, хорошо? Laravel - один из самых проработанных фреймворков, с которыми я работал. Для этого нет ярлыков. Вам нужно это изучить. Я бы порекомендовал следовать руководству, которое они предлагают, в этом laravel-news.com/your-first-laravel-application есть упоминание об использовании функции old() в середине. Потратьте время на это, приятель. Это того стоит.

Rafael 22.08.2018 23:14

У вас есть поле формы с названием "сообщение" ???

Akbar Mirsiddikov 26.08.2018 18:33

Попробуйте добавить правило для сообщения ('message' => 'string');

Aabir Hussain 30.08.2018 14:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
7
4 802
8

Ответы 8

Во-первых, вам нужно добавить ->withInput() в свой редирект:

return redirect()->back()->with('flash_message', 'Thank you for your message')->withInput();

Все отправленные поля формы будут мигать в сеанс.

После перенаправления, чтобы получить значение поля формы с именем, например, title, вы можете использовать помощник old(), например:

<input type = "text" name = "title" value = "{{ old('title') }}">

Вы также можете передать помощнику второй параметр:

<input type = "text" name = "title" value = "{{ old('title', $post->title) }}">

Вы уловили идею.

OP не спрашивает о флэш-сообщении, а спрашивает о сообщении, которое является именем поля в контактной форме и не получает его значение в контроллере.

Veerendra 30.08.2018 14:21

Похоже, вы пытаетесь взять все входные данные из отправки формы и передать их в шаблон лезвия Laravel под названием posting-message, который используется для создания электронной почты.

Если я правильно понимаю, значит, вы почти у цели - для этого вам просто нужно передать больше переменных в свой шаблон электронной почты. На данный момент вы просто проходите через одну переменную под названием сообщение.

Таким образом, раздел Mail вашего контроллера выглядит примерно так:

Mail::send('emails.posting-message', [
    'name'=> $request->name,
    'email'=> $request->email,
    'number'=> $request->number,
    'city'=> $request->city,
    'post'=> $request->post
], function($mail) use($request) {
    $mail->from($request->email, $request->name);
    $mail->to('[email protected]')->subject('Contact Message');
});

Затем в вашем шаблоне электронной почты у вас есть доступ к таким переменным, как {{ $name }}, {{ $email }} и т. д.

p.s. Если вы хотите получить все входные данные и поместить их в массив за один раз в своем контроллере, Laravel предоставляет несколько способов для массового получения входных данных, например:

$allInputs = $request->all();

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

Фрагмент, который вы предоставили, как показано ниже:

   'msg'=> $request->name,
   'msg'=> $request->email,
   'msg'=> $request->number,
   'msg'=> $request->city,
   'msg'=> $request->post

Указывает, что ключ массива msg перезаписывается 4 раза.

Вместо этого вам нужен следующий подход:

    $msg['name'] = $request->name;
    $msg['email'] = $request->email;
    $msg['number'] = $request->number;
    $msg['city'] = $request->city;
    $msg['post'] = $request->post;

Во-первых, вам не нужно использовать метод back с redirect, функция back() все равно перенаправит пользователей.

return back()->with('key','Val');

Проверьте это: Старый ввод

Как говорили другие, для отправки строк запроса / входов в файлы cookie используйте функцию withInput() в соответствии с документами, она будет мигать всеми текущими входами:

return back()->with('key','Val')->withInput();

Если бы вы видели блейды регистрации и входа в Laravel по умолчанию, вы бы знали, что можете использовать помощник old() для получения предыдущих значений на основе файлов cookie и сеансов.


   'msg'=> $request->name,
   'msg'=> $request->email,
   'msg'=> $request->number,
   'msg'=> $request->city,
   'msg'=> $request->post

Есть несколько способов присвоить значение массиву, но помните, что никогда не переопределяйте их таким образом!

Вы можете использовать метод автоматической индексации. Если вы используете $msg[] = $request->bar, он будет индексировать значения от 0 до длины ваших назначений.

$data[] = $request->val1;
$data[] = $request->val2;
...

Но также вы можете определить ключ каждого элемента следующим образом:

$data['name'] = $request->name;
$data['email'] = $request->email;
...

В конце концов, если вы хотите отправить все входы в качестве второго параметра, просто используйте $request->all():

Mail::send('emails.posting-message', $request->all(), function($mail) use($request) {
        $mail->from($request->email, $request->name);
        $mail->to('[email protected]')->subject('Contact Message');
});

Некоторое время назад я столкнулся с подобной проблемой, и после нескольких попыток я изменил имя поля с message на comments, и это было решением.

Я подозреваю, что message может быть именем переменной, используемым фреймворком в сеансах или что-то в этом роде.

Я надеюсь, что это помогает.

вам нужно добавить метод withInput() в ваш возвращенный ответ как

return redirect()->back()->with('flash_message', 'Thank you for your message')->withInput();

чтобы сохранить ввод из одного запроса во время следующего запроса, вам нужно использовать помощник old(). См. Документацию здесь https://laravel.com/docs/5.6/requests#old-input

<input type = "text" name = "title" value = "{{ old('username') }}">

Laravel автоматически перенаправит пользователя обратно в его предыдущее местоположение. Кроме того, все ошибки проверки будут автоматически перенесены в сеанс. Проверьте документацию здесь https://laravel.com/docs/5.6/validation#quick-displaying-the-validation-errors. Чтобы отобразить сообщение об ошибке проверки, вы можете использовать это так

@foreach ($errors->all() as $error)
    <li>{{ $error }}</li>
@endforeach

или более конкретно

<input type = "text" name = "title" value = "{{ old('username') }}">
<span class = "error">{{$error->title}}</span>

Первым делом вам нужно проверить имя поля в вашем html, чтобы в его точном сообщении не было пробелов или орфографических ошибок.

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

Нет ничего лучше, если вы не добавили поле при проверке, поэтому вы не получите его в POST.

Но поскольку вы работаете с контактной формой, вы должны оставить поле «сообщение» обязательным и добавить его при проверке. Таким образом вы всегда будете получать данные в поле сообщения.

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

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

$msg = array('name' => $request->name,'email' => $request->email,'number' => $request->number,'city' => $request->city,'post' => $request->post,'message'=>$request->message);

Вы можете использовать массив, например

Mail::send('emails.posting-message', [$msg    
    ], function($mail) use($request) {
        $mail->from($request->email, $request->name);
        $mail->to('[email protected]')->subject('Contact Message');
    });

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

Насколько я понимаю, вы спрашиваете, как отправить входные данные в почтовый шаблон.

попробуй это;

public function store(Request $request)
{
    $this->validate($request, [
        'name' => 'required',
        'email' => 'required|email',
        'number' => 'required',
        'city' => 'required',
        'post' => 'required'
    ]);

    Mail::send('emails.posting-message', $request->all(), function($mail) use($request) {
            $mail->from($request->email, $request->name);
            $mail->to('[email protected]')->subject('Contact Message');
    });
    return redirect()->back()->with('flash_message', 'Thank you for your message');
}

теперь в электронные письма / сообщение-сообщение.blade.php у вас будет доступ к $ name, $ email, $ number, $ city, $ post и любым другим входным данным, которые вы отправили в запросе.


теперь, если вы хотите восстановить ошибки проверки. использовать этот

$validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
]);
if ($validator->fails()) {
    //you can get the errors with $validator->errors. and redirect/mail as you want.
}
//here the inputs are valid.

Другие вопросы по теме