20200602のlaravelに関する記事は10件です。

マイグレーション実行時にmysqlでユーザーを作成していなかった為エラー

マイグレーション実行時エラー

laravel7で新しくプロジェクトを作成したので
とりあえずマイグレーションの実行ししてみたら

エラー発生

  SQLSTATE[HY000] [1045] Access denied for user 'user_name'@'172.20.0.4' (using password: YES) (SQL: select * from information_schema.tables where table_schema =table_name and table_name = migrations and table_type = 'BASE TABLE')

原因

ただ単に.envに設定したユーザーとパスワードを登録していなかっただけ

解決方法

mysqlでユーザーを作成をする

create user 'user_name' identified by 'pass';

権限の確認
新規作成したユーザには
何も権限がないことを意味するUSAGEが付いている

mysql> show grants for user_name@'%';
+---------------------------------------+
| Grants for phper@%                    |
+---------------------------------------+
| GRANT USAGE ON *.* TO `user_name`@`%` |
+---------------------------------------+
1 row in set (0.00 sec)

全てのDBが対象となるグローバル権限【CREATE権限】の付与

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'user_name'@'%' WITH GRANT OPTION;

実行後もう一度マイグレーションを実行したら成功

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

LaravelプロジェクトからFirebaseAPIを利用する前準備

環境について
OS:AmazonLinux2

1.サービスアカウントキーを作成する

GoogleCloudPlatformの認証サービス画面より
「サービスアカウントキー」を作成する
※APIキーではない

サービスアカウント
「firebase-adminsdk」を選択

キータイプ
「JSON」
を選択して、作成する

2.環境変数を設定する

1.で取得したJSONファイルをLaravelプロジェクトのディレクトリに配置し
環境変数(GOOGLE_APPLICATION_CREDENTIALS)にファイルパスをセットする

export GOOGLE_APPLICATION_CREDENTIALS="Laravelプロジェクトのディレクトリ/*****.json"

3.gRPC For PHPのインストール

こちらのGoogleのガイドを参考にgrpcをインストール

https://cloud.google.com/php/grpc?hl=ja

# pecl install grpc

Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0" install
Installing shared extensions:     /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64/php/modules/
running: find "/var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0" | xargs ls -dils
 9083594     0 drwxr-xr-x 3 root root       17 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0
11304125     0 drwxr-xr-x 3 root root       19 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr
19801702     0 drwxr-xr-x 3 root root       17 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64
27955984     0 drwxr-xr-x 3 root root       21 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64/php
 3604422     0 drwxr-xr-x 2 root root       21 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64/php/modules
 3604421 35144 -rwxr-xr-x 1 root root 35985152 12月 23 20:06 /var/tmp/pear-build-rootyXfFt6/install-grpc-1.26.0/usr/lib64/php/modules/grpc.so

Build process completed successfully
Installing '/usr/lib64/php/modules/grpc.so'
install ok: channel://pecl.php.net/grpc-1.26.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=grpc.so" to php.ini

PHPのgrpc拡張機能を有効にする。

# vi /etc/php.d/20-grpc.ini
; Enable gRPC extension module
extension=grpc.so

# systemctl restart httpd

4.FirebaseAPIライブラリを追加

LaravelプロジェクトにFirebaseAPIライブラリを追加します。

#composer require "grpc/grpc:^v1.1.0"
#composer require "google/protobuf:^v3.3.0"
#composer require google/cloud-firestore

参考資料
https://qiita.com/nirastamo/items/391d4a002dfb2901b268

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

MacでLaravel開発環境構築

概要

  • Homebrewの導入
  • Composerの導入
    • 上記のパッケージ管理システムを利用してPHP&Laravelのインストール

環境

macOS Mojave 10.14.6

Homebrewのインストール

Homebrewとはパッケージのインストールやアンインストールを簡単に行うことのできるパッケージ管理システムのひとつです。

Homebrewページに移動し、インストールコマンドをターミナルで実行します。

スクリーンショット.png

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

インストールできたか確認

$ brew -v
Homebrew 2.2.15
Homebrew/homebrew-core (git revision 5385; last commit 2020-05-05)

HomebrewでPHPをインストールする

以下のコマンドでインストールするPHPパッケージを確認する。

$ brew search php
==> Formulae
brew-php-switcher  php-code-sniffer   php@7.2 ✔          phplint            phpmyadmin         phpunit
php                php-cs-fixer       php@7.3 ✔          phpmd              phpstan
==> Casks
homebrew/cask/eclipse-php 

導入したいバージョンのPHPをインストールする。

$ brew install php@7.3

インストールできたか確認

$ php -v

Composerをインストールする

Composerとは、PHP向けのパッケージ管理システムです。

Homebrewでインストールする

$ brew install composer

インストールできたか確認

$ composer -V

※直接Composerをインストールする方法

Homebrewを利用せずこちらでComposerファイルを直接ダウンロードして配置する方法もあります。
スクリーンショット 2020-06-02 17.20.16.png

ここから、最新バージョンのリンクをクリックしてください。
composer.pharというファイルがダウンロードフォルダにダウンロードされます。
続いて以下のコマンドを実行します。

$ cd ~/Download/
$ sudo mv composer.phar /usr/local/bin/composer

これでいつでもcomposerが呼び出せるようになりました。

配置したcomposerのパーミッション(アクセス権)を変更します。

$ chmod a+x /usr/local/bin/composer

これでcomposerが実行できるようになりました。

Homebrewでインストールした時と同様に、
「composer -V」
で正常にインストールできているか確認しましょう。

Laravelのインストール

Composerを用いてLaravelをインストールします。

#Laravelインストール
$ composer global require "laravel/installer"

環境変数PATHの設定

$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile source ~/.bash_profile

laravelのバージョン確認

$ php artisan -V

以上で、Laravel開発環境の構築は終了です。
お疲れ様でした。

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

LaravelでどうしてもSESSIONが追加できないときにすること

こんなにもシンプルなSESSIONが追加できない

app/Http/Controllers/HogeController.php
  public function show()
  {
    if (!Session::has('token')) {
      Session::put('token', 'token!');
      var_dump('saved!');
    }
    var_dump(Session::get('token'));
    return view('welcome');
  }

初回のみ「saved!token!」と表示され、2回目以降は「token!」となってほしい。
しかし、何度試しても「saved!token!」が表示される。

不用意にダンプしたらダメなんだってさ

https://laracasts.com/discuss/channels/laravel/sessions-are-not-saving?page=1

sessions work fine, but only if your code exits normally and runs the terminable middleware. If you dd() in your code then the session is not saved

https://laravel.com/docs/5.5/middleware#terminable-middleware

you should also run php artisan route:list and check that you have web against each route, once only per route

テストコードのvar_dumpを削除したらセッションにちゃんと保存できた。

app/Http/Controllers/HogeController.php
  public function show()
  {
    if (!Session::has('token')) {
      Session::put('token', token!);
    }
    return view('welcome');
  }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Laravel上でスーパーグローバル「$_SERVER」を参照する。

メモとして残します。

$_SERVERでも普通に参照できますが、フレームワークを使っている以上、スーパーグローバル変数を直接参照するのはどうかということで、一応、お作法にのっとって、Laravel上でスマートに参照する方法を紹介。

下記の例ではLaravelのヘルパrequestを使用して、帰ってきたオブジェクトのserverプロパティを参照しています。

■確認方法

$_SERVER要素全て

request()->server;
//↓実行結果

// "MIBDIRS" => "C:/hoge/php/extras/mibs"
// "MYSQL_HOME" => "\xampp\mysql\bin"
// "OPENSSL_CONF" => "C:/hoge/apache/bin/openssl.cnf"
// "PHP_PEAR_SYSCONF_DIR" => "\xampp\php"
// "PHPRC" => "\xampp\php"
// "TMP" => "\xampp\tmp"
// "HTTP_HOST" => "hoge.www.com"
// "HTTP_CONNECTION" => "keep-alive"
// "HTTP_PRAGMA" => "no-cache"
// "HTTP_CACHE_CONTROL" => "no-cache"
// "HTTP_UPGRADE_INSECURE_REQUESTS" => "1"
// "HTTP_USER_AGENT" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
// "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
// "HTTP_REFERER" => "http://hoge.www.com/"
// "HTTP_ACCEPT_ENCODING" => "gzip, deflate"
// "HTTP_ACCEPT_LANGUAGE" => "ja,en-US;q=0.9,en;q=0.8"
// "HTTP_COOKIE" => "remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d=eyJpdiI6IjBIU1JxWVFCeG96T1RWeDFBcUtrVVE9PSIsInZhbHVlIjoieU5pRnVudTJub1wvTzJpUndLZlQ4MzNlaVlqdEZqK24xUTlQNX ▶"
// "PATH" => "hoge"
// "SystemRoot" => "C:\WINDOWS"
// "COMSPEC" => "C:\WINDOWS\system32\cmd.exe"
// "PATHEXT" => ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
// "WINDIR" => "C:\WINDOWS"
// "SERVER_SIGNATURE" => "<address>Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.8 Server at hoge.www.com Port 80</address>"
// "SERVER_SOFTWARE" => "Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.8"
// "SERVER_NAME" => "hoge.www.com"
// "SERVER_ADDR" => "127.0.0.1"
// "SERVER_PORT" => "80"
// "REMOTE_ADDR" => "127.0.0.1"
// "DOCUMENT_ROOT" => "C:/Develop/hogeproject/public"
// "REQUEST_SCHEME" => "http"
// "CONTEXT_PREFIX" => ""
// "CONTEXT_DOCUMENT_ROOT" => "C:/Develop/hogeproject/public"
// "SERVER_ADMIN" => "hoge@hoge.test.com"
// "SCRIPT_FILENAME" => "C:/Develop/hogeproject/public/index.php"
// "REMOTE_PORT" => "59332"
// "GATEWAY_INTERFACE" => "CGI/1.1"
// "SERVER_PROTOCOL" => "HTTP/1.1"
// "REQUEST_METHOD" => "GET"
// "QUERY_STRING" => ""
// "REQUEST_URI" => "/"
// "SCRIPT_NAME" => "/index.php"
// "PHP_SELF" => "/index.php"
// "REQUEST_TIME_FLOAT" => 1591082776.119
// "REQUEST_TIME" => 1591082776

要素を指定して参照

//request()->server->get('要素名');//SERVER_NAMEなど
request()->server->get('SERVER_NAME');
//↓実行結果
//localhost.hoge.com

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

LaravelでFirebase Admin SDK for PHPを利用する

インストール

composer require kreait/firebase-php
composer require kreait/laravel-firebase

Laravelに設定追加

config/app.php
        /*
         * Package Service Providers...
         */
        Kreait\Laravel\Firebase\ServiceProvider::class,
.env
APP_NAME=Laravel
APP_ENV=local
# ... 省略 ...
FIREBASE_CREDENTIALS=../firebase_credentials.json

config配下に設定ファイルを作る

php artisan vendor:publish --provider="Kreait\Laravel\Firebase\ServiceProvider" --tag=config

config/firebase.phpが作成される。

試してみる

app/Http/Controllers/FireTestController.php
<?php

namespace App\Http\Controllers;
use Kreait\Firebase\Auth;

class FireTestController extends Controller
{
    private $auth;

    public function __construct(Auth $auth)
    {
        $this->auth = $auth;
    }

    public function show()
    {
        $anonymous = $this->auth->signInAnonymously();
        print_r([$anonymous->idToken(), $anonymous->firebaseUserId()]);

        return view('welcome');
    }
}

これで、idTokenとfirebaseUserIdが取得できました。
あとはトークン使って好きなように。

idTokenは有効期限が1時間のアレ。
firebaseUserIdは、FirebaseConsoleのAuthenticationページでユーザーUIDと表示されているヤツ。

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

Laravelの認証でwebとapiの両方を使う

LaravelでのAPIの認証は、こちをご参照ください。
LaravelでのJWT認証

Laravelの認証は、config/auth.phpにのguardにて設定しますが、defaultをapiに設定するとwebでの認証ができなくなってしまいます。

config/auth.php
    'defaults' => [
        'guard' => 'api', // ← ここです。
        'passwords' => 'users',
    ],

一つのLaravelプロジェクトで、webとapiの両方を実装したいときの対応になります。

Laravelではauth()や、Auth::login()などで使用する認証は、guardのデフォルトの方となるようです。
デフォルト以外のものを使うときは、Auth::guard('[guard名]')->login()とguardを指定して使用します。
そうすることで、webとapiの両立を実現します。

defaultの設定

guardのdefaultはwebにしておきます。
make:authのコントローラーもそのまま使えるので便利です。

config/auth.php
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

API側の認証のコントローラにてguardを指定する

実装例のAuthControllerは、LaravelでのJWT認証で使用したものです。
Quick startで紹介されているものから少しだけ修正しています。
それに対して、上記のようにauth()Auth::guard('api')に変更します。

app/Http/Controllers/Api/AuthController.php
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
//        $this->middleware('auth:api', ['except' => ['login']]);
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = Auth::guard('api')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth()->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        Auth::guard('api')->logout();

        return response()->json(['message' => 'Successfully logged out']);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        try {
            return $this->respondWithToken(Auth::guard('api')->refresh());
        } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => Auth::guard('api')->factory()->getTTL() * 60
        ]);
    }
}

認証後のコントローラー

auth()->user()は、変更しなくてもユーザー情報の取得はできているようなので、この認証を使って作成するAPI側は特にguardの指定はしなくてもよさそうです。

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

firebase Cloud Messaging + Laravel + Vue.js、 PWAで web push 対応のリアルタイムな チャットを作る 作例編

以前の 製作事例公開内容となり、他ブログ等で公開済ですが。こちらにも記事残したいと思います
概要的な内容が多く、コード説明等が少ないので、紹介程度の記事となります

概要

firebase Cloud Messaging, Notification API 等で
web push通知対応のチャット機能の作成となります。

参考のコード / GitHub

https://github.com/kuc-arc-f/lara58a_6chat

構成

firebase Cloud Messaging / FCM
Progressive Web Apps / PWA
Notification API
Laravel 5.8
Vue.js
nginx
mysql

画面

PC版 / PWA チャット画面
ss-chat-webpush-receive.png

PC版 / web push 受信 : winタスクバーの通知画面と、通知音出ます。
ss-notify.png

android版 / PWA チャット画面
Screenshot_2020-06-02-09-37-54.jpg

FCM, PWAの、注意点など

・HTTPで使用できない。 設置環境はSSL化しておく必要あり
・ブラウザの通知設定を。許可に変更する必要あり

設計面での、注意点

・Cloud messageのサンプル等見ると、メンバー(自分以外) に、web pushする例が無かった気がしましたが。
web push送信時に、送信先トークンを指定する必要があり。管理方法含めて検討する必要がありました
・例として、DBに参加チャット 各メンバーのトークンを保存し。送信時に利用する事にしました。
 送信時には、送信者に 自分のトークンを含めない仕様にしています。

実装など

web push

function fcm_send(send_title, send_body, IID_TOKEN, FCM_SERVER_KEY){

    if(IID_TOKEN.length < 1){ return; }
    var key = FCM_SERVER_KEY;
    var to = IID_TOKEN;
    var notification = {
        'title': send_title,
        'body': send_body,
        'icon': 'firebase-logo.png',
        'click_action': 'http://hoge'
    };
    fetch('https://fcm.googleapis.com/fcm/send', {
    'method': 'POST',
    'headers': {
        'Authorization': 'key=' + key,
        'Content-Type': 'application/json'
    },
    'body': JSON.stringify({
        'notification': notification,
        'to': to,
        })
    }).then(function(response) {
    }).catch(function(error) {
        console.error(error);
    })
};

・web push 受信する
messaging.onMessage コールバックで、受信後の通知、再描画等

    messaging.onMessage((payload) => {
        var notify = payload.notification;
        recv_pushMessage("", notify.body);
        var data = {
            'id' : 0,
            'chat_id': CHAT_ID ,
            'user_id': 0,
            'body': notify.body,
            'created_at': null,
        };
        console.log(notify.body );
    });

・ Notification API で、通知

function recv_pushMessage(title, body){
    if (!('Notification' in window)) {//対応してない場合
        alert('未対応のブラウザです');
    }
    else {
        // 許可を求める
        Notification.requestPermission()
        .then((permission) => {
            if (permission === 'granted') {// 許可
                var options ={
                    body: body,
                    icon: 'https://hoge.net/icon.png',                                      
                    tag: ''
                };
                var n = new Notification(title,options);
                console.log(n);
                setTimeout(n.close.bind(n), 5000);
            }
            else if (permission == 'denied') {// 拒否
            }
            else if (permission == 'default') {// 無視
            }
        });
    }  
}

参考のページ

https://knaka0209.hatenablog.com/entry/lara58_13chat


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

Laravelのコレクションでユーザー(グループ)ごとに最新のメッセージを取得

うちでLaravelで質問回答アプリを実装しています。
対話者のメッセージボックスを作りたい、要件をまとめました:スクリーンショット 2020-06-02 6.44.49.png

ログイン中のユーザーはuser_meとし、他のユーザーごとに一番新しいメッセージを提示するメッセージリストを作りたいです。
そこでクリックしたら、そのユーザーとのメッセージモダルに飛ぶ。
ユーザー名は相手の名前、メッセージは対話中の一番新しいメッセージ(自分からメッセージのも含む)

SQLよりLaravelのコレクションはもっと使いやすいと思い、以下で案を。
まずuser_meと関わる全てのメッセージを時間順に並べて取得、

次に対話両方をグループとし、一番新しいメッセージだけ、リストにプッシュする。
リストに登録済のグループのメッセージはプッシュしません。

以下はMessageRepositoriesのメソッドの一部です。

namespace App\Repositories;


public function selectMessageByEachUser()
    {
        $me_id = user('api')->id;
        $messages = Message::with(['fromUser', 'toUser'])
            ->where('to_user_id', $me_id)
            ->orwhere('from_user_id', $me_id)
            ->orderBy('created_at', 'desc')
            ->get();

        $chat_room_groups = [];
        $new_messages = collect();
        foreach ($messages as $message) {
            $match_ids_1 = [$message->from_user_id, $message->to_user_id];
            $match_ids_2 = [$message->to_user_id, $message->from_user_id];
            if ($new_messages->isEmpty()) {
                $new_messages->push($message);
                array_push($chat_room_groups, $match_ids_1);
            } else {
                $res = !in_array($match_ids_1, $chat_room_groups, true)
                    && !in_array($match_ids_2, $chat_room_groups, true);
                if ($res) {
                    $new_messages->push($message);
                    array_push($chat_room_groups, $match_ids_1);
                }
            }
        }
        return $new_messages;
    }

次にメッセージコントローラは処理したリストをもらい、APIリソースをフロントエンドに発信

namespace App\Http\Controllers;

public function messageList()
    {
        $message=$this->message->selectMessageByEachUser();
        return new MessageCollection($message);
    }

どうせチャットルームグループは必要なら、グループに入るユーザーのIDと最新メッセージを保存するチャットルームのテーブルを作る方がいいかも?
メーセージを送信する際、新しいメッセージをテーブルに保存し、後処理はなしで、効率は上がります。

今は勉強でLaravelとVue.jsで質問回答アプリを実装しています。
ソースコードは以下に公開:
https://github.com/joychoinjapan/syukudai.net
興味があれば、ご覧ください。

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

[docker-compose, laravel, Xdebug, VSCode, mac]ようやくブレークポイントで止まった

ようやく止まった

ようやく止まった・・

こんにちはkamotetuと申します

普段仕事ではPhpStormというエディタで作業しているのですが、自宅ではVSCodeを使用しています
それでようやくVSCodeでブレークポイントで止まってくれたので記事にしたいと思います

というても
https://qiita.com/gigosa/items/90431be7a6a79db78480
を参考に(ほとんど同じ)でやったので、設定などは↑の記事を参考にしてください(いや本当助かりました)

じゃあお前なんなん?

て感じですが、実際に止まったときのVSCodeの状況を含めて紹介します

os:mac

自分のディレクトリ構成
(記事に必要な分だけ記載します)

app //<- この中にlaravelのファイル郡が入ってます
docker
   ┗ php
     ┝ Dockerfile
     ┗ php.ini
docker-compose.yml

とりあえず

紹介した記事のとおりやっていきます

Dockerfileを作成

自分は

FROM php:7.3-apache-stretch

RUN apt-get update && \
    apt-get install -y libzip-dev zlib1g-dev sudo nano && \
    docker-php-ext-install mysqli pdo_mysql zip && \
    a2enmod rewrite

RUN pecl install xdebug \
  && docker-php-ext-enable xdebug

こんな感じで作成しました

docker-compose.ymlを作成

docker-compose.yml
version: "3.4"

services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    restart: always
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./app:/var/www/html/
    ports:
      - 8080:80
    depends_on:
      - mysql
      - mail

  mysql:
    image: mysql:5.7
    restart: always
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
    command:
      - --sql-mode=NO_ENGINE_SUBSTITUTION
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USER=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=${DB_USERNAME}
      - PMA_PASSWORD=${DB_PASSWORD}
    ports:
      - 4040:80
    depends_on:
      - mysql
  mail:
    image: mailhog/mailhog
    restart: always
    ports:
      - "8025:8025"

mysql以下は今回無視してください

php.ini作成

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = Off
mbstring.detect_order = auto
display_errors = On

upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 1200
memory_limit = 512M

[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9000 //<-記事では9001になっています
xdebug.remote_log=/tmp/xdebug.log

[xdebug]以下は記事のコピペ

VSCodeの設定

ひとまずPHP Debugをインストール(画面ではインストール済)
スクリーンショット 2020-06-02 2.42.45.png

虫のアイコンをクリック
スクリーンショット 2020-06-02 2.44.45.png

自分のVSCodeではこんなアイコン
バージョン?によっては違うアイコンになってると思いますが、明らか虫だろってアイコンがあればそれと同じです(多分)
これをクリックすると、「~~~.jsonを作成」というリンク?が表示されるのでそれをクリック(画像撮り忘れてしまいましたすいません)

launch.jsonを編集
クリックした先に

launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
        },
//上はもともと作成されている(はず)
//以下は記事のコピペ
        {
            "name": "XDebug on docker",
            "type": "php",
            "request": "launch",
            "port": 9000, //<- php.iniのxdebug.remote_portと同じポート番号
            "pathMappings": {
                "/var/www/html":"/Users/ユーザーの名前/Documents/my_app/laravel_app/app/app" <- dockerのルートディレクトリとアプリケーションのローカルルートディレクトリを設定します
            }
        }
    ]
}

とりあえずこれで設定は完了

実際に止まらせる

*ここからは自分が適当にやってできた内容なのでスマートな方法かわかりません!

スクリーンショット 2020-06-02 2.59.50.png

虫のアイコンをクリックすると↑のような画面になりますが、画像のように「Xdebug on docker」を選択してください

で、その左にある再生ボタンをクリックすると

スクリーンショット 2020-06-02 3.01.33.png

こんなメニューが表示されます

次にブレークポイントを設定します
スクリーンショット 2020-06-02 3.03.53.png

適当な位置にブレークポイントを設定します(コードの行番号の左にカーソルを持っていくと選択できます。あと、箇所によっては止まらないかも)

この状態でブラウザでブレークポイントを通過する処理を実行します
(自分のルーティングでは「http://localhost:8080/public/article/store」)
すると

スクリーンショット 2020-06-02 3.10.07.png

こんな感じで止まってくれました

ありがたや

止まらなかったら

止まるまでいろんな記事を参考にトライするのみです!

おやすみなさい

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