- 投稿日:2020-05-23T23:09:28+09:00
【Laravel】マイグレーションコマンド
- 投稿日:2020-05-23T20:27:32+09:00
laravel-mix調査の備忘録
概要
Laravel-Mix調査で知らない単語がたくさん出てきたのでそれのメモ。
そもそもLaravel-Mixなんで使うの?って理由ですが
- 複数のjsファイルを一つにバンドルしたい
- キャッシュが原因でjs, cssの変更が反映されない問題を解決したい
- npmコマンド叩きたい(今の主流はyarnらしいですが...)
上記のような理由です。
参照ページ
- https://qiita.com/minato-naka/items/0db285f4a3ba5adb6498
- https://qiita.com/minato-naka/items/bfc3bbd9a388084e6f17
- https://qiita.com/kamykn/items/45fb4690ace32216ca25
- https://readouble.com/laravel/6.x/ja/mix.html
Laravel Mixとは
Laravel 公式ドキュメントより
Laravel Mixは多くの一般的なCSSとJavaScriptのプリプロセッサを使用し、Laravelアプリケーションために、構築過程をwebpackでスラスラと定義できるAPIを提供しています。シンプルなメソッドチェーンを使用しているため、アセットパイプラインを流暢に定義できます。例を見てください。
全然わからん。こちとらwebpackが何者なのかすら理解できていない。
色々調べたが大体こんな感じ。
- webpack君は複数ファイルを一つにまとめてくれるモジュールバンドラツール
- webpack君をそのまま使うのはダルい
- Laravel Mixを使うと簡単に書ける
完全に理解した。
browserSyncとは
コードを変更、保存したら自動でブラウザを更新してくれる賢いヤツ。
Laravel-Mixだと簡単に書ける。mix.browserSync({ proxy: '192.168.99.100', open: false, // ブラウザを自動で開かない files: [ // 監視対象のファイル 'resources/**/*', ], watchOptions: { usePolling: true, interval: 500, }, })自前のdocker環境用の書き方だけどざっくりこんな感じです。
resources配下のファイルを変更した際に画面が自動reloadされます。
bladeの変更がリロードなしで即反映されるので開発が捗る捗る。UglifyJSとは
JavaScriptのコードを圧縮、軽量化(minify)したり難読化するためのツールです。
Laravel-mixの場合、コマンドによってminifyされるか否かが決まります。
npm run dev
⇒ minifyされない
npm run prod
⇒ minifyされる"scripts": { "dev": "npm run development", "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", "watch": "npm run development -- --watch", "watch-poll": "npm run watch -- --watch-poll", "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js", "prod": "npm run production", "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" }
- 投稿日:2020-05-23T19:58:16+09:00
Laravel 7 バッチ処理でusersテーブルのメールアドレスにビューファイルをベースとしたメールを送る
目的
- ビューファイルを用いたメールをバッチファイルから送信する方法をまとめる
実施環境
- ハードウェア環境(下記の二つの環境で確認)
項目 情報 OS macOS Catalina(10.15.3) ハードウェア MacBook Pro (16-inch ,2019) プロセッサ 2.6 GHz 6コアIntel Core i7 メモリ 16 GB 2667 MHz DDR4 グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.3 Homwbrewを用いて導入 Laravel バージョン 7.0.8 commposerを用いて導入 MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入 前提情報
- 下記、または下記に準ずる方法でバッチ処理を行うLaravelアプリでAuthによるユーザ認証機能が実装されていること。
- Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する
- 認証機能実装後、受信可能なメールアドレスでLaravelアプリにユーザ登録されていること。
- 下記の作業がすでに完了しているものとして今回の記事ではメール送信サーバの設定は行わない。
- 下記に目を通していただくと理解が早いかもしれない。
概要
- バッチファイルの作成
- メール用のビューファイル設定
- 確認
概要
バッチファイルの作成
アプリ名ディレクトリで下記コマンドを実行してバッチファイル(コマンドファイル)を作成する。ファイル名を「SendMailCommand.php」とする。
$ php artisan make:command SendMailCommandアプリ名ディレクトリで下記コマンドを実行して先に作成したコマンドファイルを開く。
$ vi app/Console/Commands/SendMailCommand.php開いたコマンドファイルを下記の様に修正する。(開いたファイルで作成するコマンドでメールの送信処理を行う)
アプリ名ディレクトリ/app/Console/Commands/SendMailCommand.php<?php namespace App\Console\Commands; use Illuminate\Console\Command; //下記を追加する //usersテーブル用のモデルファイルを紐づける use App\User; //メール送信用ファサードを紐づける use Illuminate\Support\Facades\Mail; use App\Mail\SendMail; //上記までを追加する class SendMailCommand extends Command { /** * The name and signature of the console command. * * @var string */ //下記を修正する protected $signature = 'app:send_mail_users'; /** * The console command description. * * @var string */ //下記を修正する protected $description = 'usersテーブルのemail全てにメールを送信する'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { //下記を追加・修正する $users_infos = User::all(); foreach ($users_infos as $users_info) { echo $users_info['email']."\n"; Mail::to($users_info['email'])->send(new SendMail()); } //上記までを追加・修正する } }メール用のビューファイル設定
アプリ名ディレクトリで下記コマンドを実行してビューファイルをメールで使用するためのクラス(Mailable)ファイルを用意する。
$ php artisan make:mail SendMailアプリ名ディレクトリで下記コマンドを実行して先に作成したメール送信専用のクラスファイルを開く
$ vi app/Mail/SendMail.php開いたクラスファイルを下記の様に修正する。
アプリ名ディレクトリ/app/Mail/SendMail.php<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class SendMail extends Mailable { use Queueable, SerializesModels; /** * Create a new message instance. * * @return void */ public function __construct() { } /** * Build the message. * * @return $this */ public function build() { //下記を追記 return $this->view('mails.test'); } }アプリ名ディレクトリで下記コマンドを実行してメールとして表示したいビューファイルを格納するディレクトリを作成する。
$ mkdir resources/views/mailsアプリ名で下記コマンドを実行してメールとして表示したいビューファイル作成する。
$ vi resources/views/mails/test.blade.php開いたメールとして表示したいビューファイルを下記の様に編集する。
アプリ名ディレクトリ/resources/views/mails/test.blade.phpこれはテストメールです確認
- 投稿日:2020-05-23T18:21:47+09:00
【Laravel】マジックナンバーの解決方法
マジックナンバーとは
プログラムにおけるマジックナンバー(英: magic number、魔法の数字)とは、何らかの識別子もしくは定数として用いられる、プログラムのソースコード中に書かれた具体的な数値である。
ex)
UserControllerpublic function store() { User::create(['user_type' => 1); }あとあと1ってなによ?となる
解決方法
1 定数
クラス定数として定義しておいて、使いたいところで呼び出す
User<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $fillable = [ 'user_type', ]; const ADMIN = 1; const NORMAL = 2; const ZAKO = 3; }UserControllerpublic function store() { User::create(['user_type' => User::ADMIN); }Enum
列挙型
PHPにはないので、パッケージなりで導入
色々あるので用途に合うやつ選択数が多いならこっちがよさげ...?
composer require bensampo/laravel-enum<?php namespace App\Enums; use BenSampo\Enum\Enum; final class UserType extends Enum { const Admin = 1; const Normal = 2; const Zako = 3; }UserControllerpublic function store() { User::create(['user_type' => UserType::Admin); }Config
usertype.php<?php return [ 'Admin' => 1, 'Normal' => 2, 'Zako' => 3, ];UserControllerpublic function store() { User::create(['user_type' => config('usertype.Admin')]); }不備、より良い方法有りましたら教えていただけますと助かります
- 投稿日:2020-05-23T18:21:47+09:00
【Larave】マジックナンバーの解決方法
マジックナンバーとは
プログラムにおけるマジックナンバー(英: magic number、魔法の数字)とは、何らかの識別子もしくは定数として用いられる、プログラムのソースコード中に書かれた具体的な数値である。
ex)
UserControllerpublic function store() { User::create(['user_type' => 1); }あとあと1ってなによ?となる
解決方法
1 定数
クラス定数として定義しておいて、使いたいところで呼び出す
User<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $fillable = [ 'user_type', ]; const ADMIN = 1; const NORMAL = 2; const ZAKO = 3; }UserControllerpublic function store() { User::create(['user_type' => User::ADMIN); }Enum
列挙型
PHPにはないので、パッケージなりで導入
色々あるので用途に合うやつ選択数が多いならこっちがよさげ...?
composer require bensampo/laravel-enum<?php namespace App\Enums; use BenSampo\Enum\Enum; final class UserType extends Enum { const Admin = 1; const Normal = 2; const Zako = 3; }UserControllerpublic function store() { User::create(['user_type' => UserType::Admin); }Config
usertype.php<?php return [ 'Admin' => 1, 'Normal' => 2, 'Zako' => 3, ];UserControllerpublic function store() { User::create(['user_type' => config('usertype.Admin')]); }不備、より良い方法有りましたら教えていただけますと助かります
- 投稿日:2020-05-23T14:14:03+09:00
Laravelのアクセサ
はじめに
例えばviewで人の氏名を実装する時
苗字+名前
といちいち実装するのは手間がかかりますよね。
今回のお題であるアクセサというLaravelの機能を用いれば、Modelに苗字+名前
と定義しておくだけで、viewで呼び出す時は氏名
で一気にフルネームを呼び出すことができます。アクセサを使って実装する
そもそもアクセサとは
アクセサを定義するには、アクセスしたいカラム名が「studlyケース(Upper Camel Case)」でFooの場合、getFooAttributeメソッドをモデルに作成します。以下の例では、first_name属性のアクセサを定義しています。first_name属性の値にアクセスが起きると、Eloquentは自動的にこのアクセサを呼び出します。
Eloquent:ミューテタ 7.x LaravelLaravelの公式ドキュメントには上記のように定義されています。
簡単にまとめるとModelにget〜Attribute
(今回の場合はgetFullNameAttribute)というメソッドを定義すると、それをuseしたControllerやviewでfull_name
(今回の場合は$this->full_name)属性の値で呼び出せます。Modelnamespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * ユーザーのフルネームを取得 * * @return string */ public function getFullNameAttribute() { return this->last_name . this->first_name; } }view<?php {{ $this->full_name }}おわりに
いかがでしたでしょうか。
今回のようにModelに定義しておくことでフルネームを表示するに「山田花子」「山田 花子」「山田 花子」みたいに人によってスペース開けたり開けなかったり、半角スペースだったりすると思うので、まとめて定義しておくと保守性が上がるでしょう。
- 投稿日:2020-05-23T12:43:27+09:00
DockerでApache + Laravel の環境を構築する時にNot Foundで泣いた話
この記事の対象者
DockerでApache + Laravelの環境を作りたい初心者(←重要)
Laravelで開発してるけど青売りケーションの仕組みを実はよくわかっていない初心者
DockerもLaravelも長年使っていて未熟者のワシにアドバイスくれる先輩
ソースコードはここに載せてます
https://github.com/maip0902/DockerApachePHP環境
MacOS
Docker 19.03.2なんで泣いたのか
Laravel + nginx の構成でしか開発を行ったことがなく、初めてApacheで構築しようとしたら
ドキュメントルート違ってるやーん ><
ということでこれを直します
せっかくなのでどういう仕組みでアプリケーションの画面が表示されるかにも少し触れながら環境構築を行います〜ディレクトリ構成
apache-laravel-app という名前のプロジェクトを作成するものとして、最終的に以下のようなディレクトリ構造になります。
├ apache-laravel-app // Laravelで作られるファイル | ├ ── php | └ php.ini // なくてもいい | ├ Dockerfile | ├ docker-compose.ymlDockerfile
今回使うイメージは
php:7.2-apache
です。Dockerfile# ① FROM php:7.2-apache # ②ドキュメントルートをデフォルトから修正 ENV APACHE_DOCUMENT_ROOT /var/www/html/apache-laravel-app/public RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf # php.iniを独自で設定するときだけ COPY ./phhp/php.ini /etc # ③モジュールのinstall RUN apt-get update \ && apt-get install -y zlib1g-dev libpq-dev unzip git vim curl\ && docker-php-ext-install pdo_mysql zip # ④Composer入れる # マルチステージビルドを採用cpm COPY --from=composer /usr/bin/composer /usr/bin/composer① 公式からイメージを持ってくる
FROM php:7.2-apachephp:(version)-apacheを使うとapacheにphpのモジュールが入っている状態を持ってこれます。
② ドキュメントルートの修正
ENV APACHE_DOCUMENT_ROOT /var/www/html/apache-laravel-app/public RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf今回のポイント。
apacheの設定ファイルは/etc/apache2
配下にあるのですが、その中でもドキュメントルートを指定しているファイルがあって、その部分のみ環境変数で置き換えるということをしました。Apche起動後にドキュメントルート書き換えたり、独自の.confを使ってRUN rm /etc/apache2/sites-available/000-default.conf COPY ./000-default.conf etc/apache2/sites-availableともできるんですけど(最初自分もこれ考えましたが)環境変数にぶっこんだ方がスマートですね。
まあ公式に書いてあったんですけどねw ⬇️
https://hub.docker.com/_/phpsedコマンドに関しては以下参照。
sedでこういう時はどう書く?また、なぜドキュメントルートが
/var/www/html/apache-laravel-app/public
なのかという話ですが、これはLaravelのプロジェクトを作るとプロジェクト内のpublic配下にindex.phpが作られるためです。また、Apacheの設定で一番最初に見に行くファイルがindex.phpになっています。
実際にindex.phpと書かれているファイルを検索して見てみます。root@be20b535a937:/var/www/html# grep index.php -rl /etc/apache2 /etc/apache2/mods-available/dir.conf # 利用可能なモジュールのディレクトリに関するファイル /etc/apache2/conf-available/docker-php.conf # phpが読み込まれた時の処理に関するファイルということでphpの処理がApacheでどう行われているかを以下のコマンドで見ます。
root@be20b535a937:/var/www/html# less /etc/apache2/conf-available/docker-php.conf <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> DirectoryIndex disabled DirectoryIndex index.php index.html <Directory ${APACHE_DOCUMENT_ROOT}> Options -Indexes AllowOverride All </Directory>DirectryIndexは最初に見に行くファイルで、それにindex.phpが指定されていることがわかりました。Laravelはindex.phpから始まるので、このファイルが置いてある
/var/www/html/プロジェクト名/public
をドキュメントルートに指定する必要があります。③ モジュールのインストール
# ③モジュールのinstall RUN apt-get update \ && apt-get install -y zlib1g-dev libpq-dev unzip git vim curl\ && docker-php-ext-install pdo_mysql zip
RUN apt-get update
はインストール可能なパッケージの一覧の更新だけが行われます。upgradeにするとパッケージ自体の更新がされます。
apt-get install -y
も必要なもののインストールです。-y は何か請求があったとき全部YESと答えるという意味です。
docker-php-ext-install
の方はphp の拡張機能をインストールしているのですが、このイメージだとmysqli
とか入れようとするとエラーになってしまったんですよね、、ここの原因はまだ不明です、、、、④ Composer入れる
Composer入れます。
こちら参考。
商用環境でも使っている Laravel 用 php-fpm イメージの Dockerfile レシピ# ④Composer入れる # マルチステージビルドを採用 COPY --from=composer /usr/bin/composer /usr/bin/composerdocker-compose.yml
docker-compose.ymlversion: "3.7" services: app: build: . container_name: php-apache-app ports: - 80:80 volumes: - ./apache-laravel-app:/var/www/html db: image: mysql:5.7 container_name: php-apache-database ports: - 3306:3306 environment: - MYSQL_DATABASE=apache_laravel_db - MYSQL_ROOT_PASSWORD=rootコンテナ立ち上げる
$ docker-compose up -dDockerfileで指定すると拡張モジュールがうまく入らないものがあるので手動で入れる。
$ docker exec -it php-apache-app bash root@be20b535a937:/var/www/html# docker-php-ext-install mysqli ~ 処理が走る root@be20b535a937:/var/www/html# php -m // モジュール一覧表示 mysqliがあることを確認なんで手動だとできるのかもまだ謎、、
プロジェクトを作成します。
root@be20b535a937:/var/www/html# composer create-project laravel/laravel apache-laravel-app --prefer-dist "6.*Laravelの画面を開く
http://localhost
にアクセスしてlaravelのページが開ければオッケーです!
でも!以前nginx + Laravel でホーム以外のページの404エラー解決に投稿したみたいにApacheでも同じこと起こるんじゃないかと思って、Auth入れた後に /login にアクセスしてみた結果、、、ビンゴ!(泣)
ドキュメントルートの問題じゃないのになぜなの。。。ホーム以外が見れない原因
ApacheでLaravelを動かす時には
.htaccess
を読ませないといけないのですが、.htaccess<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>のようになっていて、
mod_rewrite
というモジュールが有効でないと動かないんです。そこで、コンテナ内でroot@be20b535a937:/etc# a2enmod rewriteを実行します。
もしこれでも動かない場合は.htaccess
自体が読み込まれない設定になっている可能性があるのでドキュメントルートでAllowOverride
がAll
になっているか確かめてください!最後に
本来であればDocker関連のファイルはプロジェクトと同じ階層にあると思うのでドキュメントルートはよしなに変えてください。
参考にさせていただいた記事など
ubuntuでapache2のDocumentRootを変更するまで
【find・grep】特定の文字列を含むファイルのリストを取得する方法。
https://gist.github.com/chronon/95911d21928cff786e306c23e7d1d3f3
- 投稿日:2020-05-23T10:03:49+09:00
Laravelのログイン機能にSNS認証を追加する(socialite)
socialiteでSNSログインを実装
Laravelで、SNSのアカウントを使ったログインの実装をした時のメモです。
socialiteとは
soscialiteとは、Laravelで簡単にOAuth(SNS認証)を可能にするパッケージツールです。
はじめに、composerを使って
socialite
をインストールします。$ composer require laravel/socialiteコンフィグレーション
Socialiteを使用する前に、アプリケーションが使用するOAuthサービスの認証情報を設定します。
services.phpの設定
認証情報を必要とする各プロバイダーの設定を行います。
config/services.phpreturn [ 'github' => [ 'client_id' => env('GITHUB_CLIENT_ID'), 'client_secret' => env('GITHUB_CLIENT_SECRET'), 'redirect' => env('APP_URL') . '/login/github/callback', ], 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('APP_URL') . '/login/google/callback', ], 'facebook' => [ 'client_id' => env('FACEBOOK_APP_ID'), 'client_secret' => env('FACEBOOK_APP_SECRET'), 'redirect' => env('APP_URL') . '/login/facebook/callback', ], ];
app.php
でsocialiteの設定を行います。config/app.php'providers' => [ // 追加 Laravel\Socialite\SocialiteServiceProvider::class, ], 'aliases' => [ // 追加 'Socialite' => Laravel\Socialite\Facades\Socialite::class, ],ルーティング
次に、ユーザーを認証する準備ができました。2つのルートが必要になります。
1つはユーザをOAuthプロバイダにリダイレクトするためのもので、もう1つは認証後にプロバイダからのコールバックを受け取るためのものです。
Socialite ファサードを使って Socialite にアクセスします。
Controllerの設定
設定した情報からSNS認証ログインを実装します。
App/Http/Controllers/Auth/LoginController.php<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Hash; use Auth; use Socialite; use App\User; class LoginController extends Controller { use AuthenticatesUsers; protected $redirectTo = '/home'; public function __construct() { $this->middleware('guest')->except('logout'); } public function redirectToProvider($social) { return Socialite::driver($social)->redirect(); } public function handleProviderCallback($social) { $socialUser = Socialite::driver($social)->user(); // 第一引数の配列内の条件に合致するものがなければ、第二引数の配列内のkeyとvalueでDBへ作成 $user = User::firstOrCreate( ['provider_id' => $socialUser->getId()], ['name' => $socialUser->getName(), 'provider' => $social, 'provider_id' => $socialUser->getId(), ] ); Auth::login($user, true); return redirect('/home'); } }Userクラスの設定
ログイン時に新規作成するUserテーブルは、挿入できるように追記しておきます。
App/User.phpclass User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', 'provider_id', 'provider', // カラムを追記 ];マイグレーションの設定
emailやpasswordがなくてもユーザー登録ができるように、nullable()を追記します。
database/migrations/2014_10_12_000000_create_users_table.phpclass CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('provider')->nullable(); $table->string('provider_id')->nullable(); $table->unique(['provider', 'provider_id']); $table->string('name'); $table->string('email')->unique()->nullable(); $table->string('password')->nullable(); $table->rememberToken(); $table->timestamps(); }); }web.phpの設定
web.php
にてログイン画面でボタンをクリックしたときのリンクを設定します。たとえば、シンプルにGitHubだけで実装する場合には下記のようになります。
web.phpAuth::routes(); Route::get('/home', 'HomeController@index')->name('home'); Route::get('login/github', 'Auth\LoginController@redirectToProvider'); Route::get('login/github/callback', 'Auth\LoginController@handleProviderCallback');複数のプロバイダーで認証を実装する場合は、引数に変数を用いて変換します。
web.php// SNS認証 ログインボタンのリンク Route::get('/login/{social}', 'Auth\LoginController@redirectToProvider')->where('social', 'github|google|facebook'); // コールバック用 Route::get('/login/{social}/callback', 'Auth\LoginController@handleProviderCallback')->where('social', 'github|google|facebook');Viewの設定
ログイン画面のテンプレートに追記します。
(※下記の例では、Bootstrapを使用しています。)login.blade.php<div class="form-group row mt-5"> <label for="name" class="col-sm-4 col-form-label text-md-right">SNSログイン</label> <div class="col-md-6"> <a href="{{ url('login/google')}}" class="btn btn-danger"><i class="fa fa-google"> Google</i></a> <a href="{{ url('login/facebook')}}" class="btn btn-primary"><i class="fa fa-facebook"> Facebook</i></a> <a href="{{ url('login/github')}}" class="btn btn-secondary"><i class="fa fa-github"> GitHub</i></a> </div> </div>デフォルトのログインテンプレートに追記すると、このように表示されます。
.envの設定
.envファイルにて各SNSで取得したクライアントIDとシークレットIDを設定。
GITHUB_CLIENT_ID=xxxxxxxxxxxxxxxxxxxx GITHUB_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GOOGLE_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com GOOGLE_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxx FACEBOOK_APP_ID=xxxxxxxxxxxxxxx FACEBOOK_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx参考
- 投稿日:2020-05-23T02:29:28+09:00
Laravelでメールを送信する
参考:Laravelのmailableクラスでメール送信を行う[導入/入門編]
mailableクラス
$ php artisan make:mail sampleMailClass.phpを実行後、以下のように記述
laravel-project/app/Mail/sampleMailClass.php<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use App\Encyclopedia; class sampleMailClass extends Mailable { use Queueable, SerializesModels; protected $name; // メンバ変数 protected $content; /** * Create a new message instance. * * @return void */ public function __construct($mailData) // コンストラクタ { $this->name = $mailData['name']; $this->content = $mailData['content']; } /** * Build the message. * * @return $this */ public function build() { $this->text('view.page') // メール本文のイメージを記述したview 後ほど記述 ->subject('お問い合わせが届きました')// メールタイトル ->with([ 'name' => $this->name, 'content' => $this->content ]); // viewに渡す引数 } }簡単なビューページ
page.blade.php<form action="controller"> <label for="name">名前:</label> <input type="text" name="name" value=""> <br> <label for="content">内容</label> <textarea name="content" value=""></textarea> <br> <button type="submit" class="btn btn-primary"> 送信 </button> メールを送りました!! 名前:{{$name ?? ''}} {{-- 空チェック --}} <br> 本文{{$content ?? ''}} {{-- 空チェック --}}ルーティング
ルーティングは以下のように設定
web.phpRoute::get('controller', 'Controller@notification');コントローラー
$ php artisan make:controller Controller実行後、以下のように記述
laravel-project/app/Mail/Controller.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail; use App\Mail\SendContact; class Controller extends Controller { public function notification(Request $request) { $contactData = [ 'name' => $request->name, 'content' => $request->content ]; $name = $request->name; $content = $request->content; $to = 'utsupedia@gmail.com'; Mail::to($to)->send(new SendContact($contactData)); return view('contact.result', ['contactData' => $contactData]); } }