20201026のlaravelに関する記事は13件です。

【Laravel】bladeで @(アットマーク)を文字列として出すにはどうすればよかったっけ

こういう名前の表示がしたい

@antk

なぜできないのか

bladeで@(アットマーク)を付けると @if@foreach といったショートカットとして認識されてしまう。なので

<div>@{{ $user_name }}</div>

このように書いてもうまくいかない。

<div>{{ @$user_name }}</div>

これもダメ。

<div>@ {{ $user_name }}</div>

空白を入れるとエラーは出ないが空白が出てしまう。
@ antk

解決

<div>{{ '@'.$user_name }}</div>

二重括弧(エスケープ)の中で文字列と変数を .で接続する。
. 無しだとエラーになります。

こんな超基礎的なことでつまづいた(;´Д`)

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

【Laravel】composer require時のメモリ不足エラーの対処法【Docker】

概要

Docker環境でcomposerインストール時に表題のエラーが発生しました。
ググっていくつかの方法を試しましたが解決に至るまで少し時間を要したので備忘として残しておきます。

環境

Docker:19.03.8
Laravel:6.19.1

エラー内容

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 327680 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/Decisions.php on line 196

メモリ不足でインストールできないエラーです。

解決方法

1.以下を実行しappコンテナに入る

make app
//もしくは
docker-compose exec app bash

2.以下でインストール

php -d memory_limit=-1 /usr/bin/composer require fruitcake/laravel-cors

-dはdefineの略で、php.iniで指定できる設定値を明示的に設定できるようです。
PHPコマンドラインオプション

このオプションにより php.ini で指定できる設定ディレクティブに カスタム値を設定することができます。構文は以下のようになります。
-d configuration_directive[=value]

-d memory_limit=-1とすることで、メモリlimitを無制限で実行することができます。

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

Laravel:419|PAGE EXPIREDエラーの解決方法

【概要】

1.結論

2.どのように記載していたか

3.そもそもcsrfとは何か

4.開発環境

1.結論

viewに@csrfを追記すればOK!

2.どのように記載していたか

hoge.blade.php
  <form action="/hoge/add" method="post">
  <table>
  @csrf #----❶
    <tr><th>name: </th><td><input type="text" name="name">
        </td></tr>
    <tr><th>mail: </th><td><input type="text" name="mail">
        </td></tr>
    <tr><th>age: </th><td><input type="text" name="age">
        </td></tr>
    <tr><th></th><td><input type="submit" name="send">
        </td></tr>
  </table>
  </form>

❶の"@csrf"の記載がないため、下記の画像のエラーになりました。
送信ボタンを押下してもコントローラーでトップページに戻るコーディングをしても(return redirect('/hoge'))トップページに遷移しませんでした。
スクリーンショット 2020-10-26 21.52.09.png

参考にさせていただいたURL
【Laravel5】たまに出てくる「the page has expired due to inactivity. please refresh and try again」を表示させない

3.そもそもcsrfとは何か

クロスサイトリクエストフォージェリの略で、Webアプリケーションの脆弱性を利用したサイバー攻撃になります。
ログインした利用のあるアカウントで攻撃用のスクリプトが仕込まれた罠サイトにアクセスすることで、csrf対策をしていないWebアプリケーションは勝手に第三者に弄られてしまいます。例えばSNSでコメントを投稿されたり通販サイトで商品を勝手に購入されたりといった被害があります。

4.開発環境

PHP 7.4.10
Laravel 8.9
Apache 2.4.41
Mysql 5.6.47
Sequl Pro 1.1.2

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

composer2.xでLaravelが動かなくなったら

第1の問題

composer2.xがリリースされ、次第にcomposerの2系がビルドの際に落ちてくるようになりました。
その際、以下のようなエラーが出てきたかもしれません。

> @php artisan package:discover --ansi

In PackageManifest.php line 122:

  Undefined index: name

解決するには

Laravelのパッチバージョンを上げれば解決します。

いくつかのpull requestが各バージョンに対して行われています
https://github.com/laravel/framework/pull/32310

なぜこうなったのか

これはcomposer2.xvendor/composer/installed.jsonの形式が少し変わったせいです。

今まではpackagesがjson配列で定義されているだけでした。

[
    {
        "name": "asm89/stack-cors",
        "version": "v2.0.1",
        "version_normalized": "2.0.1.0",
        ...
    },
...
}

こちらが変更されpackagesというキーが上につくようになりました。

{
    "packages": [
        {
            "name": "barryvdh/laravel-debugbar",
            "version": "v3.2.8",
            "version_normalized": "3.2.8.0",
            ...
        },
    ]
...
}

影響はこのせいで、先程のPRでは$packages = $installed['packages'] ?? $installed;とすることで、packagesというキーがあればそれを使うように修正がされているのです。

第2の問題

一部の人だけですが、updateを行おうとするとこんな感じでエラーが出てくるかもしれません。

$ composer update --no-plugins
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires davejamesmiller/laravel-breadcrumbs 5.x, found davejamesmiller/laravel-breadcrumbs[5.3.1] in lock file but not in remote repositories, make sure you avoid updating this package to keep the one from lock file.

これは私の場合はですが、packagist.jpを設定していたからでした。

まずはこれを外します

composer config -g --unset repos.packagist

これで私はupdateをすることが出来ましたが、jpを使いたい人はいると思います。
そんなときはcomposer.jsonのrepositoriesで設定をしましょう。

composer.json
    "repositories": [
        {
            "type": "composer",
            "url": "https://packagist.jp",
            "cannonical": false
        }
    ]

cannonical: falseは2.xからのオプションで公式のではないリポジトリを定義するためのものです。
packagist.jp自体は有志の方が作られたものであるため、falseにします。

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

DBの文字コードの設定 in Laravel

DBの文字コード

DBの新規作成は、phpmyadminを使って実施。
文字コードはデフォルトのutf8mb4_general_ciを利用。
参考記事中にも今後作るなら、utf8mb4で問題ないとのことなのでこれで良いとした。
スクリーンショット 2020-10-26 152231.png
一方、Laravelの方の文字コード設定はいままで何も気にしていなかったのだが、設定する項目があった。

config/database.php
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            // 'collation' => 'utf8mb4_unicode_ci',
            'collation' => 'utf8mb4_general_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

'collation' => 'utf8mb4_unicode_ci''collation' => 'utf8mb4_general_ci'にして、再度マイグレーションしたら、utf8mb4_general_ciでテーブルが作られるようになった。

過去の自分の作品を見てみると、全てDB作成時にはutf8mb4_general_ciを選んでいるが、テーブル自体はutf8mb4_unicode_ciでできていた。

これで問題になることはなさそうだけど、Laravelの文字コード設定も気にしようという話。

参考記事

あたまのなかとっちらかーる - MariaDB(MySQL)の照合順序の話

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

circleciでLaravelのプロジェクトのCIが落ちるようになった

今回の問題

10/23まで問題なかったciが10/26に急にこけるようになった。

> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover

In PackageManifest.php line 122:

  Undefined index: name  


Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1

Exited with code exit status 1
CircleCI received exit code 1

この問題はLaracastでも報告されている。

原因としては10/24にcomposer2がリリースが影響している。

circleciから提供されるコンテナイメージはcomposerをインストールする際に以下のコマンドを実行している

# Install composer
RUN php -r "copy('https://raw.githubusercontent.com/composer/getcomposer.org/master/web/installer', 'composer-setup.php');" &&     php composer-setup.php &&     php -r "unlink('composer-setup.php');" &&     mv composer.phar /usr/local/bin/composer

解決策

composer self-update --1を実行すると1系に更新されるので .circleci/config.yml のステップに以下を追記。

circlci/config.yml
- run: sudo composer self-update --1

追記

circleciから提供されるDockerイメージには circleci/cimg/ の2種類があり、 circleci/ の方はいわゆる旧世代のためなるべく cimg/ を使うべきです。

こちらのイメージを使っている場合
https://github.com/CircleCI-Public/cimg-php/blob/master/7.4/Dockerfile#L26
に記述があるようにcomposerのバージョンを指定してインストールがされているため、こちらの場合は問題が起こらないようです。

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

LaravelでPDFを出力する

概要

Laravelでpdfを扱うケースがあったので、Laravel-mpdfを導入した。
その時の手順を記載する。

dompdfとSnappyも検討したが、以下の理由により断念。

  • dompdfは使えないcssが多すぎる。
  • Snappyは必要なパッケージが多すぎてインストールが難しい。

docker環境のLaravelでSnappyを利用しようと考えましたが、パッケージが足りてなくて利用できなかった…。
本番環境でもパッケージのインストールが必要になると考えると、自分の知識では難しいと判断。

laravel-mpdfのインストール

composer require carlos-meneses/laravel-mpdf

プロバイダーとファサードの追加

config/app.phpに以下のprovidersとaliasesに以下を追加する。

'providers' => [
    // ...
    Meneses\LaravelMpdf\LaravelMpdfServiceProvider::class
]
'aliases' => [
    // ...
    'PDF' => Meneses\LaravelMpdf\Facades\LaravelMpdf::class
]

config

config/pdf.phpを作成して以下を記載する。

return [
    'mode'                 => '',
    'format'               => 'A4',
    'default_font_size'    => '12',
    'default_font'         => 'sans-serif',
    'margin_left'          => 10,
    'margin_right'         => 10,
    'margin_top'           => 10,
    'margin_bottom'        => 10,
    'margin_header'        => 0,
    'margin_footer'        => 0,
    'orientation'          => 'P',
    'title'                => 'Laravel mPDF',
    'author'               => '',
    'watermark'            => '',
    'show_watermark'       => false,
    'watermark_font'       => 'sans-serif',
    'display_mode'         => 'fullpage',
    'watermark_text_alpha' => 0.1,
    'custom_font_dir'      => '',
    'custom_font_data'     => [],
    'auto_language_detection'  => false,
    'temp_dir'               => rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR),
    'pdfa'          => false,
        'pdfaauto'      => false,
];

フォント

今のままでは日本語を扱えないのでフォントを追加して、読み込むようにする。
以下のリンクからIPAフォントをダウンロードする。

https://moji.or.jp/ipafont/

ダウンロードしたフォントをresources/fonts/ipag.ttfに配置する。
config.phpのreturn文に以下を追加する。

'custom_font_dir' => base_path('resources/fonts/'),
'custom_font_data' => [
  'ipafont' => [
    'R'  => 'ipag.ttf',
  ]
]

cssに以下を追加する。
※追加しなくても日本語表示できたので、自動判別されている?

body {
    font-family: 'ipafont', sans-serif;
}

サンプル

ビューは、resources/views/pdfs/test.blade.phpが配置されているとする。

<?php

namespace App\Http\Controllers;

use PDF;
use Illuminate\Http\Request;

class PdfsController extends Controller
{
  public function test (Request $req)
  {
    $data = [
      'name' => $req->name,
      'age' => $req->age,
    ];
    $pdf = PDF::loadView('pdfs.test', $data);

    // 表示させる場合
    // return $pdf->stream('document.pdf');

    // ダウンロードさせる場合
    return $pdf->download('test.pdf');
  }
}

参考サイト

https://github.com/mccarlosen/laravel-mpdf

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

phpunit テスト実行時にエラー General error: 1 no such table テーブル名

エラー内容

tarminal
SQLSTATE[HY000]: General error: 1 no such table: users ...................
........
.....

usersテーブルが無いよ!って返事が北

テーブルあるけどなぁ、、、、
ggったらphpunit.xmlの設定を変えると改善するとのこと

phpunit.xml
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="sqlite"/><!--使用しているDB言語に変更-->
        <server name="DB_DATABASE" value=":memory:"/><!--使用しているDB名に変更-->
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
    </php>


tarminal
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)

Time: 4.47 seconds, Memory: 24.00 MB

OK (3 tests, 7 assertions)

無事テスト成功しました?

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

素のPHPしか触ってなかった人がlaravelを触ってみる

初書:2020/10/26
PC:macOS 10.15.7

タイトル通りですが、素のphp以外でライブラリもフレームワークも使ったことがないんですが、
よく見かけるしちょっと気になったので触ってみようと思った次第。

前提

・composer、homebrewインストール済み

Larabelとは

Laravel は、MVCのWebアプリケーション開発用の無料・オープンソースのPHPで書かれたWebアプリケーションフレームワークである。

Wikipediaより
つまりフレームワークである。
どうやら今phpで一番人気があるフレームワークらしい。

早速使って・・・

みようと思ったのだが、ググってみると
「laravelのインストールから表示まで」か
「機能を追加してみる」という感じの記事が多く、
フレームワークが何かすらなんとなくしか分からなかった自分からすると全然使い方が分からん。

ので、結構調べてみると、次の記事を見つけた
Laravel入門 - 使い方チュートリアル -

これが結構分かりやすかったのだが、フレームワークとは先に用意された一式の中に、自分でコードを書いて作っていくという形なので、今までの素のphpのように書いていくわけではない模様。

インストール

ちなみにcomposerというものを使用するので、composerを先に入れる必要がある。
脳死でインストールする場合は以下をどうぞ

% brew install composer

その後composer -vを実行して、バージョン情報が表示されればインストール完了

そしてlaravelをダウンロードする
公式サイトはこちら

ローカルにのみインストールをする方法もありますが、グローバルにインストーラーをダウンロードして、それをローカルにインストールする方法もあるみたいなので、お好きな方でインストールしてください

% composer global require laravel/installer # これはグローバルにインストール
% laravel new application # アプリケーションの作成。"application"はお好きな名前に

バージョン確認をする

% php artisan --version
Laravel Framework 8.11.2

8.11.2だそうです。

とりあえずサーバーを立てる

% php artisan serve

これで、Laravel development server started: http://127.0.0.1:8000のような感じで表示されるので、後半のurlにアクセスすると、laravelのページが表示される

スクリーンショット 2020-10-23 22.34.58.png
調べたら出てくる、よくみるページでは無い、だと、、、

どうやらversion8からデフォルト画面が変わったっぽい
起動できているのに間違いはなさそうなので、これでよしとする。右下にバージョンも書いてるし。

設定する(.env)

調べてみるとこんなページが。
Laravel8をインストールしたらやっていること一覧
保存版!Laravelの.envでできること大全
.envファイルとconfig/app.phpに色々と設定できる項目があるらしい。せっかくなので設定しておく

とりあえず、データベース周りと言語周り、時刻関連は設定しておいた。

機能を追加していく

本当はこれ以降に記述する予定だったのだが、思ったより長くなりそうなのでそれぞれ記事を作成して、ここにはリンクだけ貼る、という形にする。

とりあえず新規ページを作成する

laravel8 とりあえずページを作成してみる
ページを作らないことには始まらないと思うので

ログイン機能をつけてみる

Laravel8でログイン機能を実装する
jetstream - Livewire を使用したログイン機能周りの実装

まとめ

まだまだ手探りの状態なので、間違い等があれば、その時は指摘をお願いします。
また「機能を追加していく」の欄は随時追加していく予定です。

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

最強のLaravel開発環境(Docker)を日本時間にする

はじめに(開発環境構築)

https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4

こちらの神リポジトリをcloneし、利用しようとしたときに、
TimeZoneがUTCだったため、日本時間に修正した際の備忘録となります。

下記構成内のDockerfileを修正します。
コンテナを立ち上げたことがあるものに対して実施する際には、
コンテナ停止時にDockerfileを修正し、再ビルドを実施してください。

ディレクトリ構成

├── backend # Laravelプロジェクトのルートディレクトリ
├── infra
│     └── docker
│          ├── mysql
│          │   ├── Dockerfile
│          │   └── my.cnf
│          ├── nginx
│          │   ├── Dockerfile
│          │   └── default.conf
│          └── php
│              ├── Dockerfile
│              ├── php-fpm.d
│              │   └── zzz-www.conf => unixドメインソケットの設定ファイル
│              └── php.ini
├── Makefile
└── docker-compose.yml

mysql

修正箇所

docker-laravel\infra\docker\mysql\Dockerfile
# ENV TZを変更する(4行目付近)
# ENV TZ=UTC \
ENV TZ=Asia/Tokyo \

確認方法

build、コンテナ立ち上げ(up)が完了後、の作業になります。

shell
$ make db
# $ docker-compose exec db bash (上記makeコマンドの内容)
root@XXXXXXX:# mysql -u root -p -h 127.0.0.1
Enter password: secret
# Dockerfileに記載されている8行目付近のPWを記入してください。
#  MYSQL_ROOT_PASSWORD=secret
#                       ̄ ̄ ̄ ̄
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.01 sec)

system_time_zoneにJSTが表示されれば問題ありません。

nginx

修正箇所

docker-laravel\infra\docker\nginx\Dockerfile
# ENV TZを変更する(6行目付近)
# ENV TZ=UTC
ENV TZ=Asia/Tokyo

確認方法

build、コンテナ立ち上げ(up)が完了後、の作業になります。

shell
$ make web
# $ docker-compose exec web ash  (上記makeコマンドの内容)
/work/backend# date

現在時間が表示されれば問題ありません。

php

修正箇所

docker-laravel\infra\docker\php\Dockerfile
# timezone environmentを変更する(5行目付近)
# ENV TZ=UTC \
  # locale
#  LANG=en_US.UTF-8 \
#  LANGUAGE=en_US:en \
#  LC_ALL=en_US.UTF-8 \
ENV TZ=Asia/Tokyo \
  # locale
  LANG=ja_JP.UTF-8 \
  LANGUAGE=ja_JP:ja \
  LC_ALL=ja_JP.UTF-8 \
docker-laravel\infra\docker\php\Dockerfile
# localの設定を変更(36行目付近)
#  locale-gen en_US.UTF-8 && \
#  localedef -f UTF-8 -i en_US en_US.UTF-8 && \

  locale-gen ja_JP.UTF-8 && \
  localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \

確認方法

build、コンテナ立ち上げ(up)が完了後、の作業になります。

shell
$ make app
# $ docker-compose exec app bash (上記makeコマンドの内容)
root@XXXXXXX:/work/backend# php -r 'echo date("Y/m/d H:i:s"),PHP_EOL;'

現在時間が表示されれば問題ありません。

最後に

以上で対応完了となります。
誰かの一助になれば幸いです。

誤りやもっと良い改修方法があればコメントにてご教示いただけますと幸いです。
よろしくお願いいたします。

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

タグクラウド、ワードクラウド laravel と vue.js を添えて

タグクラウド作りてぇ。
ということでライブラリと作り方を紹介

海外では タグクラウド ではなく、 ワードクラウドというのだろうか。

インストール

https://github.com/feifang/vue-wordcloud

npm install vue-wordcloud

コピペで動く

<style>

    div.tooltip {
        position: absolute;
        width: 210px !important;
        height: 70px !important;
        padding: 16px;
        font: 18px Arial;
        line-height: 24px;
        color: white;
        background: black;
        border: 0px;
        border-radius: 2px;
        pointer-events: none;
    }

</style>

<template>
    <div>

        <div class="cloud">

            <wordcloud
                    :data="defaultWords"
                    nameKey="name"
                    valueKey="value"
                    :showTooltip="true"
                    :wordClick="wordClickHandler">
            </wordcloud>

        </div>


    </div>
</template>

<script>



    import wordcloud from 'vue-wordcloud'

    export default {
        components: {
            wordcloud
        },

        data () {

            return {

                myColors: ['#1f77b4', '#629fc9', '#94bedb', '#c9e0ef'],
                defaultWords: [
                    {
                    "name": "りんご",
                    "value": 26
                },
                    {
                        "name": "みかん",
                        "value": 19
                    },
                    {
                        "name": "おれんじ",
                        "value": 18
                    },
                    {
                        "name": "look",
                        "value": 16
                    },
                    {
                        "name": "two",
                        "value": 15
                    },
                    {
                        "name": "fun",
                        "value": 9
                    },
                    {
                        "name": "know",
                        "value": 9
                    },
                    {
                        "name": "good",
                        "value": 9
                    },
                    {
                        "name": "play",
                        "value": 6
                    }
                ],
            };
        },

        methods: {
            wordClickHandler(name, value, vm) {
                console.log('クリックされたよ', name, value, vm);
            },
        }




    }
</script>


以上

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

laradock + atom + xdebug でPHPをステップ実行する

はじめに

こんにちは、普段は業務で求人系サービスの開発や社内向けツールの開発を行なっている@taku-0728です。
今回は laradock + atom + xdebug でPHPのステップ実行を行います。
これができればわざわざprint文を仕込んでデバッグしたりすることがなくなりますので、作業効率の向上につながります。同じように laradock + atom で開発を行っている方は是非参考にしていただければと思います。

やること

下の画像のように処理の途中で実行を一時停止しその時点での変数の中身を確認したり、コードを1行ずつ実行して次にどの条件分岐に入るのか確認したりできるようにしていきます。

ステップ実行 (2).gif

開発環境

  • OS:macOS Catalina 10.15.6
  • PHP:7.4.11
  • Laravel:6.18.26
  • Docker:19.03.13

前提条件

Laravelプロジェクトを作成していること
laradockで必要なコンテナを立ち上げてブラウザからアクセスできること

実装

1. laradockの設定

まずlaradockの必要な設定を行います。
laradockのファイルが置いてあるディレクトリに遷移します。

$ cd xxxxxxx/laradock

envファイルを編集します。

$ vi .env
.env
WORKSPACE_INSTALL_XDEBUG=false

PHP_FPM_INSTALL_XDEBUG=false

この2行を

.env
WORKSPACE_INSTALL_XDEBUG=true

PHP_FPM_INSTALL_XDEBUG=true

こう変えます。
次に設定ファイルも変更します。

$ vi workspace/xdebug.ini
workspace/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back=0
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM

xdebug.remote_autostart=0
xdebug.remote_enable=0
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1

内容に多少差異はあると思いますが、大体こんな感じになっていると思います。
ここを下記のように書き換えます。
コメントアウトしていますが、別に消してもらってもかまいません。

workspace/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host=host.docker.internal
xdebug.remote_connect_back=0
xdebug.remote_port=9002
;xdebug.idekey=PHPSTORM

xdebug.remote_autostart=1
xdebug.remote_enable=1
;xdebug.cli_color=0
;xdebug.profiler_enable=0
;xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

;xdebug.var_display_max_children=-1
;xdebug.var_display_max_data=-1
;xdebug.var_display_max_depth=-1

似たようなことをもう一回やります。

$ vi php-fpm/xdebug.ini
php-fpm/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back=0
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM

xdebug.remote_autostart=0
xdebug.remote_enable=0
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1

ここも大体こんな感じになっていると思いますので、下記のように書き換えます。
コメントアウトしていますが、別に消してもらってもかまいません。

php-fpm/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host=host.docker.internal
xdebug.remote_connect_back=0
xdebug.remote_port=9002
;xdebug.idekey=PHPSTORM

xdebug.remote_autostart=1
xdebug.remote_enable=1
;xdebug.cli_color=0
;xdebug.profiler_enable=0
;xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

;xdebug.var_display_max_children=-1
;xdebug.var_display_max_data=-1
;xdebug.var_display_max_depth=-1

ここまでできたら、コンテナを起動します。自分の環境にあわせて適宜変えてください。

$ docker-compose up -d nginx mysql redis

※私の環境ではxdebug.iniの設定を変更する前にコンテナを起動していた場合、ステップ実行が正常に動作しませんでした。色々試しましたが最終的に一度イメージを削除して再度コンテナを起動すると正常に動作したので、もし正常に動作しなかった場合は一度イメージを削除して再度コンテナを起動してみてください。

ここまでいけば、laradock側の設定は終了です。

2. atom側の設定

laradock側の設定が終わったので、次にatom側の設定を行っていきます。
理由は後述しますがここからは使用するPHPのバージョンによってやることが変わるので、使用しているPHPのバージョンに合わせて変えてください。

使用しているPHPのバージョンが7.0以下の場合

パッケージの検索画面でphp-debugと検索し、下記の画像と同じヒットしたパッケージをインストールしてください。
スクリーンショット 2020-10-13 22.21.01.png

インストールすると、下記の画像のようにatom-debug-uiというパッケージと、atom-ide-uiというパッケージをインストールするように求められると思います。この2つのパッケージの役割は今回の記事の内容とは逸れるので割愛しますが、インストールしたphp-debugを動作させるには必須のパッケージですのでYesを選択してインストールしてください。
スクリーンショット 2020-10-13 22.21.43.png

php-debug,atom-debug-ui,atom-ide-uiの3つのパッケージをインストールしたらphp-debugの設定画面を開いてください。
まずはPortの設定を行います。
下記の画像を参考にServer Listen Portを9002番(php-fpm/xdebug.ini xdebug.remote_port, workspace/xdebug.ini xdebug.remote_portと同じ値)に設定してください。
スクリーンショット 2020-10-13 22.32.58.png
次にPath Mappingsの下記の形式を参考にremoteとlocalのパスの設定を行います。
[{"remotePath":"","localPath":""}]
remotePathにはdockerコンテナ内のファイルパスを、localPathにはMacbook内のファイルパスを指定します。
私の場合だと下記のようになります。当然ですが、ご自身の環境に合わせて変えてください。
スクリーンショット 2020-10-13 22.44.06.png

使用しているPHPのバージョンが7.1以上の場合

インストールするphp-debugのバージョンを変更します。理由はphp-debug 3.5以上の場合に必須となるatom-ide-uiにあります。このパッケージはatomにideのような様々な機能を持たせてくれる便利なパッケージなのですが、そのパッケージの機能の1つであるエラー解析がPHP7.0までしか対応していません。そのためPHP7.4から使える下記のような書き方をすると、エラーでないにもかかわらず警告が表示されてしまいます。

スクリーンショット 2020-10-14 0.16.29.png

そのままでも動くといえば動くのですが、警告がうっとうしいのでatom-ide-uiを必要としない古いバージョンのphp-debugをインストールしていきます。
私の環境がMacなので、Macを例にしてやっていきます。
左上のメニューから Atom>シェルコマンドをインストール を選択します。すでにインストールしていて、apmコマンドが使える方は飛ばしてください。
スクリーンショット 2020-10-14 0.29.22.png

シェルコマンドのインストールが完了すると、apmコマンドが使えるようになるのでターミナルを開いて下記コマンドを入力します。

$ apm install php-debug@0.2.4

インストールが完了したら、下記の画像を参考に Path Maps と Server Address を設定してください。
インストールした php-debug のバージョンが古いため、remotePathとlocalPathの形式が異なっています。下記画像を参考に間違えないようにしてください。
スクリーンショット 2020-10-14 1.00.51.png

結果

ステップ実行ができるようになったので、快適なPHPライフを送りましょう。
ステップ実行 (2).gif

参考

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

【Laravel】開発環境では「php artisan config:cache」をするべきではない

Q. なぜ?

A. ドキュメントにそう書いてある。

The command should not be run during local development as configuration options will frequently need to be changed during the course of your application's development.

(意訳)アプリケーションの開発中には設定を頻繁に変更する必要があるので、ローカル開発環境ではこのコマンドは実行するべきではありません。

Q. そう書いてある、では納得できない!

A. 一度php artisan config:cacheを実行すると、それ以降(キャッシュを消去しない限り)configディレクトリ配下の設定ファイルを修正するたびにphp artisan config:cacheを実行しなければ設定が反映されなくなるため。

解説

とある機能を実装しようとして、サンプルコードを実装してみたところ設定が反映されずなぜか動かない。。php artisan config:cacheもしくはphp artisan config:clearをしたら動きました!という経験、一度はありませんか?
これは前述した通り、一度設定ファイルをキャッシュするとキャッシュされた設定ファイルを優先的に読みにいくのでconfigディレクトリ配下の設定ファイルが読み込まれないために発生します。
ドキュメントにも記載がある通り開発中は設定ファイルが頻繁に編集されるため、その度にコマンドを打って反映させるのは煩雑です。そのため開発環境では設定ファイルをキャッシュするべきではないのです。

結論から言ってしまえば以上!なのですが、この記事ではほんの少しLaravel内部のコードを追うことで設定ファイルがどう読み込まれているかを見ていきます。

設定ファイルの読み込み

設定ファイルの読み込みは/Illuminate/Foundation/Bootstrap/LoadConfiguration.phpのbootstrapメソッド内で行われています。

Illuminate/Foundation/Bootstrap/LoadConfiguration.php
~~省略~~
class LoadConfiguration
{
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        $items = [];

        // First we will see if we have a cache configuration file. If we do, we'll load
        // the configuration items from that file so that it is very quick. Otherwise
        // we will need to spin through every configuration file and load them all.
        if (file_exists($cached = $app->getCachedConfigPath())) {
            $items = require $cached;

            $loadedFromCache = true;
        }

        // Next we will spin through all of the configuration files in the configuration
        // directory and load each one into the repository. This will make all of the
        // options available to the developer for use in various parts of this app.
        $app->instance('config', $config = new Repository($items));

        if (!isset($loadedFromCache)) {
            $this->loadConfigurationFiles($app, $config);
        }
~~省略~~

まずif (file_exists($cached = $app->getCachedConfigPath()))でキャッシュされたファイルがあるかどうか確認します。
$app->getCachedConfigPath()は特に設定を変更していない場合{your-project-path}/bootstrap/cache/config.phpという文字列が返されます。

実際にphp artisan config:cacheを打つとbootstrap/cache配下にconfig.phpが生成されているのがわかるかと思いますが、これこそが上述したキャッシュされた設定ファイルです。このconfig.phpは全設定をArray形式で返します。このファイルをrequireして\$items変数に代入し、$item変数を元にRepositoryクラス(/Illuminate/Config/Repository.php)をnewします。これでキャッシュがある場合の読み込みが完了です。

設定値にアクセスするためのヘルパ関数であるconfig()は、このRepositoryインスタンスのgetメソッドを呼び出すことで設定値を返してくれるのです。

helpers.php
    function config($key = null, $default = null)
    {
        if (is_null($key)) {
            return app('config');
        }

        if (is_array($key)) {
            return app('config')->set($key);
        }

        return app('config')->get($key, $default);
    }

if (file_exists($cached = $app->getCachedConfigPath()))がfalse、つまり設定ファイルが見つからない場合は\$itemsは空のままRepositoryクラスがnewされたあとに、$this->loadConfigurationFiles()によって設定値が読み込まれます。

Illuminate/Foundation/Bootstrap/LoadConfiguration.php
    /**
     * Load the configuration items from all of the files.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  \Illuminate\Contracts\Config\Repository  $repository
     * @return void
     *
     * @throws \Exception
     */
    protected function loadConfigurationFiles(Application $app, RepositoryContract $repository)
    {
        $files = $this->getConfigurationFiles($app);

        if (!isset($files['app'])) {
            throw new Exception('Unable to load the "app" configuration file.');
        }

        foreach ($files as $key => $path) {
            $repository->set($key, require $path);
        }
    }

このメソッドの内部ではconfigディレクトリ配下のファイルからkeyとvalueを取り出し、repositoryインスタンス(先ほどnewしたRepositoryクラスのインスタンス)のsetメソッドによって設定値を一つづつ読み込んでいます。

要するに、キャッシュのあるなしでは読み込むファイルが異なるのです。
- キャッシュがある(bootsrap/cache/config.phpが存在する)場合
- bootstrap/cache/config.phpが返す配列を読み込む
- キャッシュがない(bootsrap/cache/config.phpが存在しない)場合
- configディレクトリ配下の各phpファイルから配列を読み込む

ここで、一度php artisan config:cacheをして設定ファイルをキャッシュした後に、configディレクトリ配下のphpファイル(例えばauth.phpやmail.phpなど)の値を変更した場合はどうなるでしょうか?

Laravelはphp artisan config:cacheによって生成されたbootstrap/cache/config.phpを読み込みますが、変更前の値しか保持していないので当然変更は反映されません。この場合、再度php artisan config:cacheを打ってbootstrap/cache/config.phpを再生成するか、php artisan config:clearを打ってbootstrap/cache/config.phpを削除し、configディレクトリ配下の各phpファイルを読みにいくようにすることで設定が反映されるようになります。

以上、Laravelで設定がどのように読み込まれるか、php artisan config:cachephp artisan config:clearをすることで設定ファイルが反映される流れを解説しました。

ちなみにドキュメントによるとプロダクション環境ではパフォーマンス向上のためにphp artisan config:cacheをするべきだとしています。

To give your application a speed boost, you should cache all of your configuration files into a single file using the config:cache Artisan command. This will combine all of the configuration options for your application into a single file which will be loaded quickly by the framework.

You should typically run the php artisan config:cache command as part of your production deployment routine.

まとめ

  • 開発環境で作業している場合
    • php artisan config:cacheは実行しない
    • すでにphp artisan config:cacheを実行済みでbootstrap/cache/config.phpが生成されている場合はphp artisan config:clearで削除する
  • プロダクション環境にデプロイした場合
    • php artisan config:cacheで設定ファイルをキャッシュする

それではHappyなLaravelライフを?

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