- 投稿日:2020-10-26T23:09:38+09:00
【Laravel】bladeで @(アットマーク)を文字列として出すにはどうすればよかったっけ
こういう名前の表示がしたい
なぜできないのか
bladeで@(アットマーク)を付けると
@if
や@foreach
といったショートカットとして認識されてしまう。なので<div>@{{ $user_name }}</div>このように書いてもうまくいかない。
<div>{{ @$user_name }}</div>これもダメ。
<div>@ {{ $user_name }}</div>空白を入れるとエラーは出ないが空白が出てしまう。
@ antk
解決
<div>{{ '@'.$user_name }}</div>二重括弧(エスケープ)の中で文字列と変数を
.
で接続する。
.
無しだとエラーになります。こんな超基礎的なことでつまづいた(;´Д`)
- 投稿日:2020-10-26T22:22:03+09:00
【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 bash2.以下でインストール
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を無制限で実行することができます。
- 投稿日:2020-10-26T22:05:20+09:00
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'))トップページに遷移しませんでした。
参考にさせていただいた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
- 投稿日:2020-10-26T16:29:43+09:00
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.x
でvendor/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
にします。
- 投稿日:2020-10-26T15:38:44+09:00
DBの文字コードの設定 in Laravel
DBの文字コード
DBの新規作成は、phpmyadminを使って実施。
文字コードはデフォルトのutf8mb4_general_ciを利用。
参考記事中にも今後作るなら、utf8mb4で問題ないとのことなのでこれで良いとした。
一方、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の文字コード設定も気にしようという話。
参考記事
- 投稿日:2020-10-26T15:32:56+09:00
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のバージョンを指定してインストールがされているため、こちらの場合は問題が起こらないようです。
- 投稿日:2020-10-26T15:02:28+09:00
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フォントをダウンロードする。ダウンロードしたフォントを
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'); } }参考サイト
- 投稿日:2020-10-26T14:34:37+09:00
phpunit テスト実行時にエラー General error: 1 no such table テーブル名
エラー内容
tarminalSQLSTATE[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>tarminalPHPUnit 8.5.8 by Sebastian Bergmann and contributors. ... 3 / 3 (100%) Time: 4.47 seconds, Memory: 24.00 MB OK (3 tests, 7 assertions)無事テスト成功しました?
- 投稿日:2020-10-26T12:45:50+09:00
素の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のページが表示されるどうやらversion8からデフォルト画面が変わったっぽい
起動できているのに間違いはなさそうなので、これでよしとする。右下にバージョンも書いてるし。設定する(.env)
調べてみるとこんなページが。
Laravel8をインストールしたらやっていること一覧
保存版!Laravelの.envでできること大全
.envファイルとconfig/app.phpに色々と設定できる項目があるらしい。せっかくなので設定しておくとりあえず、データベース周りと言語周り、時刻関連は設定しておいた。
機能を追加していく
本当はこれ以降に記述する予定だったのだが、思ったより長くなりそうなのでそれぞれ記事を作成して、ここにはリンクだけ貼る、という形にする。
とりあえず新規ページを作成する
laravel8 とりあえずページを作成してみる
ページを作らないことには始まらないと思うのでログイン機能をつけてみる
Laravel8でログイン機能を実装する
jetstream - Livewire を使用したログイン機能周りの実装まとめ
まだまだ手探りの状態なので、間違い等があれば、その時は指摘をお願いします。
また「機能を追加していく」の欄は随時追加していく予定です。
- 投稿日:2020-10-26T11:48:51+09:00
最強の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.ymlmysql
修正箇所
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;'現在時間が表示されれば問題ありません。
最後に
以上で対応完了となります。
誰かの一助になれば幸いです。誤りやもっと良い改修方法があればコメントにてご教示いただけますと幸いです。
よろしくお願いいたします。
- 投稿日:2020-10-26T10:29:05+09:00
タグクラウド、ワードクラウド 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>以上
- 投稿日:2020-10-26T09:37:00+09:00
laradock + atom + xdebug でPHPをステップ実行する
はじめに
こんにちは、普段は業務で求人系サービスの開発や社内向けツールの開発を行なっている@taku-0728です。
今回は laradock + atom + xdebug でPHPのステップ実行を行います。
これができればわざわざprint文を仕込んでデバッグしたりすることがなくなりますので、作業効率の向上につながります。同じように laradock + atom で開発を行っている方は是非参考にしていただければと思います。やること
下の画像のように処理の途中で実行を一時停止しその時点での変数の中身を確認したり、コードを1行ずつ実行して次にどの条件分岐に入るのか確認したりできるようにしていきます。
開発環境
- 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/laradockenvファイルを編集します。
$ vi .env.envWORKSPACE_INSTALL_XDEBUG=false PHP_FPM_INSTALL_XDEBUG=falseこの2行を
.envWORKSPACE_INSTALL_XDEBUG=true PHP_FPM_INSTALL_XDEBUG=trueこう変えます。
次に設定ファイルも変更します。$ vi workspace/xdebug.iniworkspace/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.iniphp-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
と検索し、下記の画像と同じヒットしたパッケージをインストールしてください。
インストールすると、下記の画像のように
atom-debug-ui
というパッケージと、atom-ide-ui
というパッケージをインストールするように求められると思います。この2つのパッケージの役割は今回の記事の内容とは逸れるので割愛しますが、インストールしたphp-debug
を動作させるには必須のパッケージですのでYesを選択してインストールしてください。
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と同じ値)
に設定してください。
次にPath Mappings
の下記の形式を参考にremoteとlocalのパスの設定を行います。
[{"remotePath":"","localPath":""}]
remotePathにはdockerコンテナ内のファイルパスを、localPathにはMacbook内のファイルパスを指定します。
私の場合だと下記のようになります。当然ですが、ご自身の環境に合わせて変えてください。
使用しているPHPのバージョンが7.1以上の場合
インストールするphp-debugのバージョンを変更します。理由は
php-debug 3.5
以上の場合に必須となるatom-ide-ui
にあります。このパッケージはatomにideのような様々な機能を持たせてくれる便利なパッケージなのですが、そのパッケージの機能の1つであるエラー解析がPHP7.0までしか対応していません。そのためPHP7.4から使える下記のような書き方をすると、エラーでないにもかかわらず警告が表示されてしまいます。そのままでも動くといえば動くのですが、警告がうっとうしいので
atom-ide-ui
を必要としない古いバージョンのphp-debug
をインストールしていきます。
私の環境がMacなので、Macを例にしてやっていきます。
左上のメニューからAtom>シェルコマンドをインストール
を選択します。すでにインストールしていて、apmコマンドが使える方は飛ばしてください。
シェルコマンドのインストールが完了すると、apmコマンドが使えるようになるのでターミナルを開いて下記コマンドを入力します。
$ apm install php-debug@0.2.4インストールが完了したら、下記の画像を参考に Path Maps と Server Address を設定してください。
インストールした php-debug のバージョンが古いため、remotePathとlocalPathの形式が異なっています。下記画像を参考に間違えないようにしてください。
結果
ステップ実行ができるようになったので、快適なPHPライフを送りましょう。
参考
- 投稿日:2020-10-26T05:52:20+09:00
【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.phpfunction 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:cache
やphp 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ライフを?