Я пытаюсь сделать контактную форму. Основная идея заключается в том, что пользователь будет отправлять данные, я сохраню данные в базе данных, я получу данные из базы данных, я отправлю данные по электронной почте.
Я следовал руководству -> https://www.positronx.io/laravel-contact-form-example-tutorial/
Когда я попытался получить доступ к классам на своем контроллере, он не смог его найти.
Когда я запускаю код, у меня есть это -> Невозможно создать экземпляр абстрактного класса Illuminate\Database\Eloquent\Model
ContactUsFormController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use app\Models\Contact;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Mail;
class ContactUsFormController extends Controller
{
//create contact form
public function createForm(Request $req){
return view('contact');
}
//store contact form data
public function ContactUsForm(Request $req){
//form validation
$this->validate($req,[
'name' => 'required',
'email' => 'required | email',
'subject' => 'required',
'message' => 'required'
]);
//store data in database
Model::create($req->All());
//send mail to admin
Mail::send('mail',array(
'name' => $req->get('name'),
'email' => $req->get('email'),
'subject' => $req->get('subject'),
'message' => $req->get('message')
),function($message) use ($req){
$message->from($req->email);
$message->to('MyMail@example.com','admin')->subject($req->get('subject'));
});
return back()->with('success', 'We have recieved your message');
}
}
Это заставляет меня задуматься. В туториале он не написал ни одного кода в этот файл, но все равно вызывал класс оттуда. приложение\Почта\contact.php
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class contact extends Mailable
{
use Queueable, SerializesModels;
public function __construct()
{
//
}
public function build()
{
return $this->view('view.name');
}
}
приложение\Модели\Контакт.php
namespace App\Mail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Contact extends Model
{
use HasFactory;
public $fillable = ['name', 'email', 'subject', 'message'];
}
У меня опечатка? Что мне не хватает? Извините, я новичок
проблема, которую вы называете Model::create();
моделью, - это просто абстрактный класс, а не ваша конкретная модель
заменять
Model::create($req->All());
с
Contact::create($req->All());
также измените namespace App\Mail;
в вашей модели контактов на пространство имен App\Models;
чтобы узнать больше о Почтовом фасаде, проверьте это
https://laravel.com/docs/9.x/mail#отправка-почты
Я надеюсь, что это полезно
@NervousDev да, измените namespace App\Mail;
в своей модели контактов на namespace App\Models;
Ладно, я понял логику. У меня есть еще один вопрос. Поскольку я вызываю класс Mail::send(')
на app\Mails\contact.php
, у меня нет класса с именем send()
Как добавить make, как это работает в учебнике?
send() - это метод, а не класс, и вы используете Почтовый фасад, а не контактный почтовый ящик, проверьте этот laravel.com/docs/9.x/mail#отправка почты
Это не полностью решило мою проблему из-за моего незавершенного кода, но если вы отредактируете свой ответ с пространствами имен и упомянутыми фьючерсами, я могу принять это как ответ.
Я редактирую свой ответ, в курсе не использовался класс Contact Mail, поэтому я думаю, что он вам не понадобится.
Да, я так думаю. Я решил узнать больше о структуре mvc, прежде чем углубляться в подобные вещи. Спасибо за помощь.
Он по-прежнему говорит, что приложение неопределенного типа \ Models \ Contact for
Contact::create($req->All());
Я начинаю думать, может быть, это что-то о пространствах имен? что ты думаешь? Потому что он использует одно и то же пространство имен для обоих файлов контактов.