Создание простой контактной формы в Laravel 5.4

Я работаю над веб-сайтом, на котором я создаю простую контактную форму в Laravel 5.4.

В классе SendMailable я использовал следующее:

<?php
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendMailable extends Mailable
{
    use Queueable, SerializesModels;
    public $fullname,$phone,$email,$description;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($fullname, $phone, $email,$description)
    {
        $this->fullname = $fullname;
        $this->phone = $phone;
        $this->email = $email;
        $this->description = $description;
    }
    /**
     * Build the message. THIS WILL FORMAT YOUR OUTPUT
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('email.posting-message')->subject('Contact Us Subject');
    }
}

А в контроллере я использую следующее:

<?php 
Namespace App\Http\Controllers;
use View;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\Controller;
use App\Mail\SendMailable;
use Illuminate\Support\Facades\Redirect; 

class PostingMessageController extends Controller
{
    public function showContactUs()
    {
        $data = [];
       return View::make('emails.posting-message',$data);
    }

    public function doContactUs(Request $r)
    {
     $fullname = $r->get('fullName');
     $phone    = $r->get('phone');
     $email    = $r->get('email');
     $description = $r->get('message');
     Mail::to('RECEIVER_EMAIL_ADDRESS')->send(new SendMailable($fullname, $phone, $email, $description));

      if (Mail::failures())
      {
        $message1 = " Something Went Wrong.";
      }
      else
      {
        $message2 = " Message Sent Successfully.";
      }


   return redirect()->route('route_name')->with([
            'warning' => $message1,
            'success' => $message2
        ]);
   }
}

Блейд-сообщение emails.posting-message имеет следующее содержимое:

<div> 
<p>Fullname : {{ $this->fullname }}</p> 
<p>Phone No. : {{ $this->phone }}</p> 
<p>Email Address : {{ $this->email }}</p> 
<p>Destination : {{ $this->destination }}</p> 
<p>Description : {{ $this->description }}</p> 
<hr> 
<p>Thank you for your Query. We'll get back to you within 24 Hours. </p> 
</div>

В маршрутах я использую следующее:

Route::get('posting-message', 'PostingMessageController@showContactUs')->name('route_name');
Route::post('posting-message', 'PostingMessageController@doContactUs')->name('route_name');


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

Ошибка, которую я получаю сейчас, - это Undefined property: Illuminate\View\Engines\CompilerEngine::$fullname (View: /home/vagrant/code/search/resources/views/emails/posting-message.blade.php). Я не уверен, почему я получаю эту ошибку, поскольку я дал ее определение.

$this в вашем файле Blade не является экземпляром PostingMessageController, поэтому доступ к $this->fullName пытается получить доступ к свойству CompilerEngine (класс рендеринга файла .blade.php). Вам нужно передать его этому представлению как переменную, скажем, $that, а затем получить доступ к $that->fullName. (Или похожие)
Tim Lewis 29.08.2018 18:06

@TimLewis Я меняю $ this на $ that в лезвии. Есть ли еще что-нибудь, что мне нужно для внесения изменений?

john 29.08.2018 18:12

Да, также необходимо передать that вашему представлению, поэтому return $this->view('email.layoutOne', ["that" => $this])... Примечание: это правильное имя файла? Разве это не должно быть emails.posting-message?

Tim Lewis 29.08.2018 18:13

@TimLewis Исправлено. Он по-прежнему говорит, что неопределенная переменная.

john 29.08.2018 18:14
$this->view('email.posting-message', ["that" => $this])? Напоминаем, что раньше я не использовал этот формат для отправки электронных писем, поэтому подпись может отличаться для $this->view(), view()->with(...) и т. д.
Tim Lewis 29.08.2018 18:15

@TimLewis Может быть, я что-то упускаю.

john 29.08.2018 18:16

Позвольте нам продолжить обсуждение в чате.

john 29.08.2018 18:16
Стоит ли изучать 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 и хотите разрабатывать...
0
7
754
1

Ответы 1

Согласно документация, свойства в вашем классе SendMailable, которые являются public, будут автоматически доступны в вашем файле лезвия.

Затем вы можете получить доступ к этим свойствам, как если бы вы передали их в массиве данных, то есть в своем блейд-файле измените $this->fullname на просто $fullname.

Ваш файл лезвия должен выглядеть примерно так:

<div>
    <p>Fullname : {{ $fullname }}</p>
    <p>Phone No. : {{ $phone }}</p>
    <p>Email Address : {{ $email }}</p>
    <p>Destination : {{ $destination }}</p>
    <p>Description : {{ $description }}</p>
    <hr>
    <p>Thank you for your Query. We'll get back to you within 24 Hours. </p>
</div>

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

public function showContactUs()
{
    $data = [
        'fullname'    => 'John Doe',
        'phone'       => '123456',
        'email'       => '[email protected]',
        'destination' => 'somewhere far, far away',
        'description' => 'blah blah blah',
    ];

   return View::make('emails.posting-message',$data);
}

Я скопировал код лезвия как есть, и, похоже, он не работает.

john 29.08.2018 20:15

@john Вы определенно делаете запрос post или просто просматриваете его в браузере?

Rwd 29.08.2018 20:15

@john Я видел маршруты, которые вы добавили в свой вопрос, однако у вас также есть запрос GET, который не передает в представление ничего, что могло бы вызвать ошибку, поэтому я просто хотел убедиться, что вы определенно сделать запрос POST на этот маршрут, то есть с помощью ajax или отправки формы? Или вы просто просматриваете его в браузере?

Rwd 29.08.2018 20:19

Сейчас я просматриваю в браузере, но в будущем у меня будет форма это.

john 29.08.2018 20:21

@john Тогда я предполагаю, что именно в этом ваша проблема. Если вы просто собираетесь на /posting-message в браузере, он будет делать запрос GET (а не запрос POST), поэтому в этом случае он будет использовать метод showContactUs в контроллере и массив $data, который вы передаете вашему представлению. пусто. Я добавлю обновление к своему ответу.

Rwd 29.08.2018 20:26

@john Это ответ на ваш вопрос или все еще не работает?

Rwd 30.08.2018 08:24

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