20200523のlaravelに関する記事は9件です。

【Laravel】マイグレーションコマンド

コマンド集

migrationファイル作成

php artisan make:migration create_xxxxx_table

migrate

php artisan migrate

migrate & seed

php artisan migrate --seed

migrate やり直し

php artisan migrate:refresh

migrate やり直し & seed

php artisan migrate:refresh --seed

DBリセット

php artisan migrate:reset
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel-mix調査の備忘録

概要

Laravel-Mix調査で知らない単語がたくさん出てきたのでそれのメモ。
そもそもLaravel-Mixなんで使うの?って理由ですが

  • 複数のjsファイルを一つにバンドルしたい
  • キャッシュが原因でjs, cssの変更が反映されない問題を解決したい
  • npmコマンド叩きたい(今の主流はyarnらしいですが...)

上記のような理由です。

参照ページ

Laravel Mixとは

Laravel 公式ドキュメントより

Laravel Mixは多くの一般的なCSSとJavaScriptのプリプロセッサを使用し、Laravelアプリケーションために、構築過程をwebpackでスラスラと定義できるAPIを提供しています。シンプルなメソッドチェーンを使用しているため、アセットパイプラインを流暢に定義できます。例を見てください。

全然わからん。こちとらwebpackが何者なのかすら理解できていない。
色々調べたが大体こんな感じ。

  1. webpack君は複数ファイルを一つにまとめてくれるモジュールバンドラツール
  2. webpack君をそのまま使うのはダルい
  3. 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"
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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を用いて導入

前提情報

概要

  1. バッチファイルの作成
  2. メール用のビューファイル設定
  3. 確認

概要

  1. バッチファイルの作成

    1. アプリ名ディレクトリで下記コマンドを実行してバッチファイル(コマンドファイル)を作成する。ファイル名を「SendMailCommand.php」とする。

      $ php artisan make:command SendMailCommand
      
    2. アプリ名ディレクトリで下記コマンドを実行して先に作成したコマンドファイルを開く。

      $ vi app/Console/Commands/SendMailCommand.php
      
    3. 開いたコマンドファイルを下記の様に修正する。(開いたファイルで作成するコマンドでメールの送信処理を行う)

      アプリ名ディレクトリ/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());
              }
              //上記までを追加・修正する
          }
      }
      
  2. メール用のビューファイル設定

    1. アプリ名ディレクトリで下記コマンドを実行してビューファイルをメールで使用するためのクラス(Mailable)ファイルを用意する。

      $ php artisan make:mail SendMail
      
    2. アプリ名ディレクトリで下記コマンドを実行して先に作成したメール送信専用のクラスファイルを開く

      $ vi app/Mail/SendMail.php
      
    3. 開いたクラスファイルを下記の様に修正する。

      アプリ名ディレクトリ/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');
          }
      }
      
    4. アプリ名ディレクトリで下記コマンドを実行してメールとして表示したいビューファイルを格納するディレクトリを作成する。

      $ mkdir resources/views/mails
      
    5. アプリ名で下記コマンドを実行してメールとして表示したいビューファイル作成する。

      $ vi resources/views/mails/test.blade.php
      
    6. 開いたメールとして表示したいビューファイルを下記の様に編集する。

      アプリ名ディレクトリ/resources/views/mails/test.blade.php
      これはテストメールです
      
  3. 確認

    1. アプリ名ディレクトリで下記コマンドを実行してコマンドが追加されている事を確認する。

      $ php artisan list
      
    2. 先のコマンドの出力の中にapp:send_mail_usersがある事を確認する。

    3. アプリ名ディレクトリで下記コマンドを実行してバッチ処理が正常に動作するか確認する。(実際にメールが送信されるため注意する!!!)

      $ php artisan app:send_mail_users
      
    4. usersテーブルに登録されているメールアドレスの受信ボックスを確認し、下記の様なメールが届いていれば実装完了である。

      Test_Mail_-_shun_okawa_gmail_com_-_Gmail-2.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】マジックナンバーの解決方法

マジックナンバーとは

プログラムにおけるマジックナンバー(英: magic number、魔法の数字)とは、何らかの識別子もしくは定数として用いられる、プログラムのソースコード中に書かれた具体的な数値である。

ex)

UserController
public 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;
}

UserController
public 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;
}
UserController
public function store()
{
    User::create(['user_type' => UserType::Admin);
}

Config

usertype.php
<?php

return [
    'Admin' => 1,
    'Normal' => 2,
    'Zako' => 3,
];
UserController
public function store()
{
    User::create(['user_type' => config('usertype.Admin')]);
}

不備、より良い方法有りましたら教えていただけますと助かります

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Larave】マジックナンバーの解決方法

マジックナンバーとは

プログラムにおけるマジックナンバー(英: magic number、魔法の数字)とは、何らかの識別子もしくは定数として用いられる、プログラムのソースコード中に書かれた具体的な数値である。

ex)

UserController
public 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;
}

UserController
public 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;
}
UserController
public function store()
{
    User::create(['user_type' => UserType::Admin);
}

Config

usertype.php
<?php

return [
    'Admin' => 1,
    'Normal' => 2,
    'Zako' => 3,
];
UserController
public function store()
{
    User::create(['user_type' => config('usertype.Admin')]);
}

不備、より良い方法有りましたら教えていただけますと助かります

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのアクセサ

はじめに

例えばviewで人の氏名を実装する時苗字+名前といちいち実装するのは手間がかかりますよね。
今回のお題であるアクセサというLaravelの機能を用いれば、Modelに苗字+名前と定義しておくだけで、viewで呼び出す時は氏名で一気にフルネームを呼び出すことができます。

アクセサを使って実装する

そもそもアクセサとは

アクセサを定義するには、アクセスしたいカラム名が「studlyケース(Upper Camel Case)」でFooの場合、getFooAttributeメソッドをモデルに作成します。以下の例では、first_name属性のアクセサを定義しています。first_name属性の値にアクセスが起きると、Eloquentは自動的にこのアクセサを呼び出します。
Eloquent:ミューテタ 7.x Laravel

Laravelの公式ドキュメントには上記のように定義されています。
簡単にまとめるとModelにget〜Attribute(今回の場合はgetFullNameAttribute)というメソッドを定義すると、それをuseしたControllerやviewでfull_name(今回の場合は$this->full_name)属性の値で呼び出せます。

Model
namespace 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に定義しておくことでフルネームを表示するに「山田花子」「山田 花子」「山田 花子」みたいに人によってスペース開けたり開けなかったり、半角スペースだったりすると思うので、まとめて定義しておくと保守性が上がるでしょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでApache + Laravel の環境を構築する時にNot Foundで泣いた話

この記事の対象者

  • DockerでApache + Laravelの環境を作りたい初心者(←重要)

  • Laravelで開発してるけど青売りケーションの仕組みを実はよくわかっていない初心者

  • DockerもLaravelも長年使っていて未熟者のワシにアドバイスくれる先輩

ソースコードはここに載せてます
https://github.com/maip0902/DockerApachePHP

環境

MacOS
Docker 19.03.2

なんで泣いたのか

Laravel + nginx の構成でしか開発を行ったことがなく、初めてApacheで構築しようとしたら

スクリーンショット 2020-05-23 1.23.23.png

ドキュメントルート違ってるやーん ><
ということでこれを直します
せっかくなのでどういう仕組みでアプリケーションの画面が表示されるかにも少し触れながら環境構築を行います〜

ディレクトリ構成

apache-laravel-app という名前のプロジェクトを作成するものとして、最終的に以下のようなディレクトリ構造になります。

  ├ apache-laravel-app   // Laravelで作られるファイル
  |
  ├ ── php 
  |     └ php.ini // なくてもいい  
  |
  ├ Dockerfile
  |
  ├ docker-compose.yml

Dockerfile

今回使うイメージは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-apache

php:(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/_/php

sedコマンドに関しては以下参照。
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/composer

docker-compose.yml

docker-compose.yml
version: "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 -d

Dockerfileで指定すると拡張モジュールがうまく入らないものがあるので手動で入れる。

$ 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 にアクセスしてみた結果、、、

スクリーンショット 2020-05-23 1.23.23.png

ビンゴ!(泣)
ドキュメントルートの問題じゃないのになぜなの。。。

ホーム以外が見れない原因

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自体が読み込まれない設定になっている可能性があるのでドキュメントルートでAllowOverrideAllになっているか確かめてください!

最後に

本来であればDocker関連のファイルはプロジェクトと同じ階層にあると思うのでドキュメントルートはよしなに変えてください。

参考にさせていただいた記事など

ubuntuでapache2のDocumentRootを変更するまで
【find・grep】特定の文字列を含むファイルのリストを取得する方法。
https://gist.github.com/chronon/95911d21928cff786e306c23e7d1d3f3

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのログイン機能にSNS認証を追加する(socialite)

socialiteでSNSログインを実装

Laravelで、SNSのアカウントを使ったログインの実装をした時のメモです。

socialiteとは

soscialiteとは、Laravelで簡単にOAuth(SNS認証)を可能にするパッケージツールです。

はじめに、composerを使ってsocialiteをインストールします。

$ composer require laravel/socialite

コンフィグレーション

Socialiteを使用する前に、アプリケーションが使用するOAuthサービスの認証情報を設定します。

services.phpの設定

認証情報を必要とする各プロバイダーの設定を行います。

config/services.php
return [

    '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.php
class 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.php
class 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.php
Auth::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>

デフォルトのログインテンプレートに追記すると、このように表示されます。
スクリーンショット 0032-05-23 8.16.02.png

.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

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.php
Route::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]);
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む