laravel　お問い合わせ機能

#やろうとしていること

laravel5.5でWEBアプリを作っています。
お問い合わせ機能を作成しております。
想定している機能は、ユーザーからお問い合わせがあった場合には、管理者とユーザーにそれぞれメールを送ります。
また、ログインしているユーザーの場合は、登録されているメールアドレスを自動的にDBに格納、ログインしていないユーザーはmailを入力してもらう仕様にします。

#お問い合わせ機能を導入する手順
①routeに問い合わせ機能のを追加
②migrationファイルを作成
③mailbleクラスの作成
④お問い合わせ機能のコントローラーを追加(例、ContactController.php)
⑤お問い合わせのモデルを作成(例、Contact.php)
⑥メールドライバの設定
⑦viewを作成
⑧メール本文を作成

##①routeに問い合わせ機能のを追加
以下コードはお問い合わせページヘのrouteとユーザーが問い合わせたときの場合のpost処理があります。

```php
Route::get('contact', 'ContactController@contactForm')->name('contact.contactForm');
Route::post('contact', 'ContactController@contact')->name('contact.contact');
```

##②migrationファイルを作成
ポイントはstatusカラムです。
trueなら未対応で、falseなら対応済み　のようにすると管理できます。

```php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateContacts extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('contacts', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
            $table->string('content');
            $table->boolean('status');
            $table->string('email');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('contacts');
    }
}
```

##③mailbleクラスの作成

mailクラスの作成は以下のコマンドを入力すると作成できます。

```php
php artisan make:mail ContactAdmin
```

メールクラスの処理はbuildメソッドの中に記載します。
buildメッソドの中では以下のようなメソッドを使用する事ができる。
・from(送信する側のメールアドレス)
 ※記述がなかったらconfig/mail.phpのメールアドレスが自動的に反映される
・view(viewファイルのパス)
・with(配列でviewにわたすデータを記述)
・attach(ファイルパス)添付ファイルを入れる事ができる.
・to(送信相手のメールアドレス)
・subject(メールの件名)

```php
<?php

namespace App\Mail;

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

class ContactAdmin extends Mailable
{
    use Queueable, SerializesModels;

		protected $email;
		protected $content;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($email, $content)
    {
						$this->email = $email;
						$this->content = $content;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->to($this->email, '問い合わせがきました')->view('contact.mail_admin')->with(['content' => $this->content]);
    }
}
```

##④お問い合わせ機能のコントローラーを追加(例、ContactController.php)

Mailクラスのファザードでsendを使用して作成したメールクラスの呼び出しを行います。

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Contact;
use Illuminate\Support\Facades\Auth;
use App\Admin;
use Mail;
use App\Mail\ContactAdmin;
use App\Mail\ContactUser;

class ContactController extends Controller
{
    public function contactForm()
    {
        return view('contact.contact');
    }

    public function contact(Request $request)
    {
        $contact = new Contact();
        $admin = Admin::find(1);
        $contact->addContactContent($request);
        Mail::send(new ContactAdmin($admin->email, $request->input('content')));
        Mail::send(new ContactUser($contact->email, $request->input('content')));
        session()->flash('flash_message', 'お問い合わせありがとうございます');
        return redirect()->route('post.index');
    }

    public function contactChange(Request $request)
    {
        $contact = Contact::findOrFail($request->input('id'));
        $contact->updateStatus();
        return redirect()->route('contact.index');
    }
}
```

##⑤お問い合わせのモデルを作成(例、Contact.php)

【メモ】fillableはホワイトリストで
　　　　guardedがブラックリストです。

モデルではログインしていた場合は登録されているメールをcontactsテーブルに格納するようにしております。

```php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use App\Admin;

class Contact extends Model
{
    protected $table = 'contacts';
    protected $guarded = [
        'id',
        'created_at',
        'updated_at',
    ];
    protected $fillable = [
        'content',
        'status',
        'email',
    ];

   

    public function addContactContent($request)
    {
        if (Auth::check()) {
            $user = Auth::user();
            $this->email = $user->email;
        } else {
            $this->email = $request->input('email');
        }
                                
        $this->content = $request->input('content');
        $this->save();
    }

    public function updateStatus()
    {
        $this->status = 1;
        $this->save();
    }
}
```

##⑥メールドライバの設定

[yahooメールの設定方法](https://prglog.info/home/?p=286)
[gmailの設定方法](https://qiita.com/KZ-taran/items/ffa60ac6353bc4dcc759)

.env
```php
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mail.yahoo.co.jp
MAIL_PORT=465
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME=
```

##⑦viewを作成

```php
@extends('layouts.app')

@section('content')
<h1>お問い合わせフォーム</h1>
<div class="contact-main">
<form enctype="multipart/form-data" action="{{route('contact.contact')}}" method="POST" >
{{ csrf_field() }}
@guest

<p>メールアドレス</p>
<input class="contact-mail" type="email" name="email" size-"200" required >
@endguest
<p>問い合わせ内容</p>
<textarea class="contact-content" cols="50" rows="5" typ="text" name="content">
</textarea>
<input class="contact-btn" type="submit" value="問い合わせる">
</form> 
</div>

@endsection
```

##⑧メール本文を作成

```php
@extends('layouts.app')

@section('content')
<h1>お問い合わせ完了のご案内</h1>
<p>問い合わせ内容</p>
<p>{{$content}}</p>

<p>運営からの返信をお待ち下さい</p>

@endsection
```

参考にした記事
https://www.ritolab.com/entry/38
https://readouble.com/laravel/5.5/ja/mail.html
https://qiita.com/sayama0402/items/dd10cdb2aa22c8a035b3