20200915のlaravelに関する記事は8件です。

Laravel 環境構築 AWS EC2(nginx + PHP) + RDS

前提

ec2インスタンス作成済み
sshできる

パッケージアップデート

sudo yum update

PHP

2020/09/11現在
amazon-linux-extras リポジトリにPHP7.4があります

sudo amazon-linux-extras enable php7.4

##こんな出力があります
Now you can install:
 # yum clean metadata
 # yum install php-cli php-pdo php-fpm php-json php-mysqlnd

有効化の後yum を使用してトピックをインストールします。
Now you can install:のコマンド突っ込めば大丈夫です

sudo yum install php-cli php-pdo php-fpm php-json php-mysqlnd -y
php -v
PHP 7.4.9 (cli) (built: Aug 21 2020 21:45:11) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

足りない拡張追加

Laravelのサーバー要件

※Laravel 7.x
PHP >= 7.2.5
BCMath PHP拡張
Ctype PHP拡張
Fileinfo PHP extension
JSON PHP拡張
Mbstring PHP拡張
OpenSSL PHP拡張
PDO PHP拡張
Tokenizer PHP拡張
XML PHP拡張

これに従い追加します
追加済みの拡張を調べます

php -m | grep -e bcmath -e PDO -e ctype -e fileinfo -e json -e mbstring -e openssl -e pdo -e tokenizer -e ^xml$

php -mでインストール済み拡張が出力されます
コマンド | grep [オプション] 検索パターンでコマンドでの出力に対してgrep(絞り込み)
が掛かります
-e 検索パターンをたくさん使用して複数の単語に対して引っかかる検索かけています。

私の環境ですと下記の拡張がインストール済みのようでした。
なので、そのほかをインストールしていきます

ctype
fileinfo
json
openssl
PDO
pdo_mysql
pdo_sqlite
tokenizer

# 足りないもの
# bcmath
# mbstring
# xml

bcmath,mbstring,xmlが足りないので追加します

sudo yum install php-bcmath php-mbstring php-xml -y

opcache

インストール

設定ではないけど、opcacheを入れます

sudo yum install php-opcache

確認

php -v
#PHP 7.4.9 (cli) (built: Aug 21 2020 21:45:11) ( NTS )
#Copyright (c) The PHP Group
#Zend Engine v3.4.0, Copyright (c) Zend Technologies
#    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies

設定値の変更

php.iniの場所を調べます

php --ini
 php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/10-opcache.ini,
/etc/php.d/20-bcmath.ini,
/etc/php.d/20-bz2.ini,
/etc/php.d/20-calendar.ini,
#...

opcache.iniで設定を変えます

sudo vi /etc/php.d/10-opcache.ini

https://www.php.net/manual/ja/opcache.installation.php
推奨設定に合わせて編集します

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

php-fpm

FPMとは、FastCGI Process Managerの略でPHP5.4.0から公式サポートされたPHP標準のアプリケーションサーバです。名前にあるFastCGIというプロトコルで通信するよう実装されています。 FastCGIは、Webサーバとアプリケーションサーバの間で使われるプロトコルの一つで、ここでの例ではnginxとPHP-FPMの間で交わされるプロトコルとなります。

参考
https://hacknote.jp/archives/27419/
https://hackers-high.com/linux/php-fpm-config/

起動

sudo service php-fpm start

確認

 sudo systemctl status php-fpm

 php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2020-09-11 17:15:02 JST; 1 day 17h ago

自動起動

sudo systemctl enable php-fpm

Composer

インストール

https://getcomposer.org/download/

公式のコマンドを叩いていきます

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

移動

sudo mv composer.phar /usr/local/bin/composer

確認

composer

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.10.13 2020-09-09 11:46:34

nginx

インストール

PHPと同様にamazon-linux-extras リポジトリにあります

sudo amazon-linux-extras enable nginx1

##こんな出力があります
Now you can install:
 # yum clean metadata
 # yum install nginx

インストール

sudo yum install nginx -y
nginx -v
nginx version: nginx/1.18.0

起動

インストールしただけだと、起動していない

sudo systemctl start nginx

(上記コマンドを叩いても出力はなにもないです)

起動しているか確認します

sudo systemctl status nginx

nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/nginx.service.d
           └─php-fpm.conf
   Active: active (running) since 金 2020-09-11 08:15:02 UTC; 2s ago

自動起動設定

現状EC2再起動するたび、自力で立ち上げないといけない

sudo systemctl enable nginx 

画面確認

EC2のIPをブラウザで入力

スクリーンショット 2020-09-13 1.06.04.png

Gitインストール

sudo yum install git
git --version
# >git version 2.23.3

PHP + nginx設定

両方のインストールが終わったので疎通していきます

php-fpm設定

設定変更する前にコピーとっておくと良いかもしれません

sudo vi /etc/php-fpm.d/www.conf

下記の内容に更新します
それぞれ/検索ワードとかで検索して書き換えましょう

user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

# 以下はお好み
pm = static
pm.max_children = 5
pm.max_requests = 1500

ちなみに、pm関係の設定値はデフォルトでも良いです
下記が参考になるので、チューニングしたい方はどうぞ
https://hackers-high.com/linux/php-fpm-config/

nginx設定

sudo vi /etc/nginx/nginx.conf

ドキュメントルートは自由に

 server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www;
        index  index.php index.html index.htm;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            root           /var/www;
            fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
#~中略~

確認

sudo mkdir /var/www
sudo chmod 777 /var/www
cd /var/www
echo "<?php phpinfo(); " > index.php

ドキュメントルートの内phpinfo()だけの、index.php作ってます
IPをブラウザで確認して、表示されてればPHP使えるようになりました

スクリーンショット 2020-09-13 14.33.29.png

RDS

AWSにログインしRDS on MySQLでDBを作成しておきます
(参考 -> https://noumenon-th.net/programming/2020/04/10/ec2-rds-laravel/

エンドポイントと、ユーザーとパスワードを用いるのでとっておきましょう

スクリーンショット 2020-09-14 1.41.37.png

EC2にSSH接続し、下記コマンドでmysqlをインストールします

sudo yum install mysql -y

終わったら、エンドポイントとユーザー、パスワードを用いて接続します
うまくつながらなかったら、だいたいセキュリティグループとかなので、AWSのRDS等見直してみてください

mysql -h エンドポイント -u ユーザー名 -p
Enter password:

つながればOK

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 8.0.17 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

データベースを作成していなかったら(RDS作成時に指定できる)
CREATE DATABASEで作成してください
(参考 => https://www.dbonline.jp/mysql/database/index1.html#section1)

Laravel

これまででLaravelの下準備は整っています
デプロイの場合もgitからcloneすれば良いので大丈夫です

まずはドキュメントルートに移動します
nginxで/var/wwwを指定していたのでそこに移動します

cd /var/www

ComposerからLaravelを入れます

composer create-project --prefer-dist laravel/laravel 【名前】

【名前】は自由に
今回はlaravel-appにしました
ちなみに、Laravelのバージョン指定したい場合、【名前】のあとに、5.8とか6.xとか入れたら良いです
 

メモリ足りなくて下記のようなエラー出たら、下記の記事の手順でswapを作成してください
https://qiita.com/ntm718/items/88d3fc787f4f18ad1f20

mmap() failed: [12] Cannot allocate memory

mmap() failed: [12] Cannot allocate memory

インストールしたら、指定した名前のディレクトリに移動します
私はlaravel-appにしたので、今後置き換えてお読みください

cd laravel-app
php artisan key:generate --ansi
sudo chmod -R 777 storag
sudo chmod -R 777 bootstrap/cache/

この段階でブラウザで下記のようにアクセスすると、Laravelの初期画面が出ます
ipアドレス/laravel-app/public

スクリーンショット 2020-09-14 2.47.27.png

ここまで来たら、あと少しです

vi .env

DBの接続情報を書き換えます

.env
DB_CONNECTION=mysql
DB_HOST=エンドポイント名
DB_PORT=3306
DB_DATABASE=作ったDBDB_USERNAME=ユーザー名
DB_PASSWORD=パスワード

保存し、php artisan migrateします
ちゃんと実行されたらOK

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (51.33ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (38.25ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (39.88ms)

最後にドキュメントルートを変更しましょう
現状だとipアドレス/laravel-app/publicなので、laravel-app/publicまでをドキュメントルートに設定したら良さそうですね

sudo vi /etc/nginx/nginx.conf

laravelpublicがドキュメントルートに来るように修正します

server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/laravel/public;
        index  index.php index.html index.htm;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            root /var/www/laravel/public;
            fastcgi_pass   unix:/run/php-fpm/www.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

~中略~

再起動

sudo systemctl restart nginx

ipアドレスにアクセスしたら、laravelの画面が出たら終了

Route53でドメイン設定して、SSLしたらそれっぽくなるはず

ドメイン設定編(事前にEC2とElastic IPを紐付けておく必要あり)
https://qiita.com/ntm718/items/c01fa4fc47d21893974e

終わりに

Docker使うならECR ECSのがいいんだろうか
そもそも、個人でやるにはAWSは料金が怖すぎて無料期間あるやつしか使う気がしない...
勉強で作ったらVPSとかのがいいんでしょうか...

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

PHPUnitでテストデータを使用する際の準備

はじめに

日々学習していて、最近はアプリケーション開発を行っています。しかし、恥ずかしながら今までテストコードを書いたことがありませんでした。

学習用の小さなアプリケーションのため、後回しにしてしまい今に至ります。
実務で基本的に使われると思うので、この小さなアプリケーションの開発だからこそなれるために書いていこうと思います!

とはいっても、この記事では具体的に書いたコードを説明するわけではなくテストコードを書く前段階の準備等についてまとめていきます。

対象者:テストコード書いたことがない初心者

バージョン

・PHP:7.3.19
・Laravel:7.20.0

PHPUnitについて

PHPUnitとは、PHPのテスト用ツールである。
今回使用するLaravel7.20.0には標準でPHPUnitが使えるためこちらを使用していく!

テストコードを書くメリットは?

テストコードを書くことでいろいろなメリットがあると思います。いくつか挙げてみると

  • 仕様変更等を行ったときに、その変更によって想定外のエラーが発生した際などに早く気付くことが出来る
  • 挙動が仕様と合致しているか確認できる
  • 繰り返しテストを行うことが出来る
  • テストである程度の品質は確認できるため安心して開発に取り組める

などなど。

やってみよう

まずは、Artisanコマンドでスケルトンの作成

php artisan make:test PracticeTest

なにも指定しないとtests/Feature配下に作成される。
Unitテスト用のファイル(tests/Unit配下)を作成したい場合は

php artisan make:test PracticeTest --unit

と記載することでできる。

FeatureとUnitの違いとしては、
Unit:関数やメソッド単位でテストを行う
Feature:URL単位の一連の動作に対するテストを行う
というイメージ?

※テストファイルの命名規則は、アッパーキャメルケース(単語の最初の文字が大文字)であること。あとは、テストしたいクラス名+Testが基本。

テスト用のデータベースを準備しよう!

テストする際、本番環境のデータベースを使用するのは非常に危険!!!
そのため、テスト用のデータベースを準備する必要があります。

1. まずはテスト用のDBを作成
2.phpunit.xmlでテスト用DBについて記載する

phpunit.xml
<server name="DB_CONNECTION" value="mysql"/> //今回はMySQLを使用するため追加
<server name="DB_DATABASE" value="テスト用DB名"/> 

3.テスト実行時に、テスト用のDBを使用するようにテスト用の.envファイル(.env.testing)を作成する
.env.exampleの内容をコピー

変更点

env.testing
APP_ENV=testing #localからtestingに変更
APP_KEY= 空で #のちに新しく作成する

DB_DATABASE=テスト用DB

APP_KEYを新規で作成しないと、.envファイルのAPP_KEYを参照してしまうらしい。

php artisan key:generate --env=testing

参考

アプリケーションキーを作った後は、下記コマンドを実行しておこう。

php artisan config:clear

あとは、テストコードを書いていけばいける!と思いテストを行ってみましたがいくつか躓いたので記載します。

〇テストデータの削除

テスト用のデータベースを扱う場合、テスト実行後にそのテストデータを削除する必要があります。というのも、テストデータが残っていると、これが原因でエラーが起こる可能性があるためである。

Laravel7系公式ドキュメント

Laravel7系では、RefreshDatabaseを使用することでDBをリセットできる。
RefreshDatabaseとは、各テストの後にDBをリセットしてくれるトレイト。
使用方法は、下記の通りに記載する。

[PracticeTest]
use Illuminate\Foundation\Testing\RefreshDatabase;

class PracticeTest extends TestCase
{
    use RefreshDatabase;
}

〇Error: Call to a member function connection() on null

調べてみると、Unitテストクラスのひな形のTestCaseが別のクラスを指していることが原因とのこと。下記のように修正することで解決できました。

[PracticeTest]
use Tests\TestCase; // PHPUnit\Framework\TestCaseでは×

参考サイト

まとめ

ざっくりにはなりますが、PHPUnit使用にあたって必要なことをまとめました。
引き続きテストコードも書いていきたいと思います!

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

【Windows10】Laragon で Laravel8 (Jetstream + Inertia + Vue) を動かす

Windows環境でLaravelを動かすには色々と方法がある。

  • Homesteadを使って仮想環境を立てる(公式推奨?)
  • Dockerを使う
  • XAMPPでPHPを動かす
  • etc ...

今のトレンドだとDockerで環境ごと保存するのが一番?
でも個人的に準備などが面倒臭くて手が出しにくい…
(立ち上げるのが面倒だったり、リソースを食い散らかしたり...)

Nodeみたいにローカルで開発できないかなぁ...
XAMPP使うかぁ?という時に Laragon というものを見つけた。

  • 様々な言語に対応(PHP, Node.js, Python, Java, Go, Ruby)
  • 内部でDBを立ち上げて管理してくれる(mysql, PostgreSQL, mongoDBなど)
  • SSLに対応(証明書は無い?)
  • 環境変更はボタン一つ
    • 新しい構成を追加することも可能
  • ポータブルな設計なので移動が簡単
    • 要らなくなったらフォルダ削除でOK
    • 追加も配置するだけ
    • データもプログラムも
  • 滅茶苦茶早くて軽い
    • 本当に秒で起動する
    • フルインスコで130MBのディスク使用量
    • 実行時のメモリ使用量も4MB未満らしい
  • 設定でhostsを自動的に書き換えてくれる
    • ***.testのリンクを作成(デフォルト)
  • ngrokを用いたローカルデータの一時的な公開が可能
    • 40 connections / minute

と使わない理由が無い内容だったので、折角なのでLaravel8の開発環境で採用してみた。
(個人的にhosts書き換えがGOD)

以下のソフトウェアの使用が強制されるのが注意点?
アップデートで使用するソフトウェアを切り替えれるようになると神になると思う。

公式サイト
Laravel - ウェブ職人のためのPHPフレームワーク
Laragon - portable, isolated, fast & powerful universal development environment for PHP, Node.js, Python, Java, Go, Ruby.

Introduction | Laravel Jetstream
Inertia.js - The Modern Monolith

Laragon のインストール

Download | Laragon

上記リンクからLaragonをインストールする。
LiteはNode系が無いバージョンだが、後で簡単に追加できるのでお好みで。
(今回はLaravelでVueを使用したいのでProを採用(Liteだとコンパイルできない...))

image.png

  • 起動
  • 「▶全て開始」をクリック
  • 「?ウェブ」をクリックしてLaragonのページが開けたら成功 image.png

Laravel8 のインストール

  • 「右クリック」>「クイックアプリ作成」>「構成」をクリック
  • 勝手にNotepad++が起動する(いつの間に入ったんだろ...)
    • Laravel8=composer create-project "laravel/laravel=8.*" %s --prefer-dist を追記
    • ver 8に固定させるため一応...
  • 「右クリック」>「クイックアプリ作成」>「Laravel8」をクリック
  • 「右クリック」>「www」> 「<作成したプロジェクト名>」を選択
  • Laravelのページが開けたら成功

php artisan serve は必要ない。(そのためのLaragon)
image.png

以下のエラーはPHPのversionが足りてないので最新のを取ってくる。

[InvalidArgumentException]
Could not find package laravel/laravel with version 8.* in a version installable using your PHP version 7.2.19.
  • Laravel8の必要環境はPHP >= 7.3
  • Laragonのupdateはzipを持ってくるだけでOK
  • 以下のリンクからPHPのzipを落とす
    • https://windows.php.net/download
    • 初期に入っていたのはx64のThread Safety版だった
    • zipを解凍して「%laragon%/bin/php」に置く
    • 「右クリック」>「PHP」>「バージョン[xxx]」>「<導入したversion>」を選択
    • リアルタイムに環境が更新されるはず

Laravel Jetstream(Inertia) の導入

DBやjavascriptとの連携を確認したいので認証のテンプレまで入れてみる。
従来の認証周りは8ではJetstreamが担うらしい。
Introduction | Laravel Jetstream

Jetstream では2つのフロントエンドスタックがある。

今回はVueを使いたいのでInertiaを選択。

  • 「◼ターミナル」をクリック
  • 勝手にCmderが開く
cd <プロジェクトdir>

// インストール
composer require laravel/jetstream
php artisan jetstream:install inertia

// DB構築
php artisan migrate

// nodeセットアップ
npm install
npm run dev
  • Laravelのページの右上に login / register が表示されていれば完成

image.png

以下のエラーはデータベースが存在しないので作成しよう。

Illuminate\Database\QueryException
SQLSTATE[HY000] [1049] Unknown database 'laravel'
  • Laragonの初期設定ではプロジェクト名のデータベースが作成される
  • root / no password

所見

適当に垢作ってログインするとテンプレートのダッシュボードが表示される。
標準で二段階認証やセッション管理、API tokenなどが用意されているのは流石。
新たにTeamというroleみたいな仕組みがあるらしいが調査中。

image.png

このように手軽に遊んだりテストしたりにはLaragonは最適かもしれない。
仮想環境と別の手段として覚えておいても良いかも。
Laravelいいよ!Laragonいいよ!
(Laragonの由来ってもしかしてLaravel…?)

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

【Curlコマンド】 忘れがちなAPIの動作確認の方法

本記事の目的

アプリ開発をしているとサーバサイドでAPIを開発する機会が多いと思います。
また外部サービスともAPIを通じて連携する機会も多いと思います。
備忘録も兼ねてAPIの疎通を確認する際に使用するCurlコマンドについて記載していきます。

おまけになりますがLaravelでのBearerトークンの受取る方法なども記載しております。

基礎:POSTリクエスト

# -X POSTを指定することでPOSTでリクエストすることが出来ます。
# -d パラメータを指定することが出来ます。(複数のパラメータを指定する場合は&で繋ぐこと)
$ curl -X POST https://hogehoge/api/v1/sample -d "name=tester&age=24"

基礎:GETリクエスト

# -X GETを指定することでGETでリクエストすることが出来ます。
$ curl -X POST https://hogehoge/api/v1/sample?name=tester&age=24

基礎:HTTP Headerを指定する

# -H HTTP Headerを付与することが出来ます。(複数ある場合は-Hを複数記載する)
$ curl -X POST 'https://hogehoge/api/v1/sample' -H 'Content-Type: application/json;charset=utf-8' -H 'Accept-Charset: utf-8'

基礎:Bearer Tokenを指定する

$ curl -X POST 'https://hogehoge/api/v1/sample' -H 'Content-Type: application/json;charset=utf-8'  -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

基礎:JSONパラメータを指定する

$ curl -X POST 'https://hogehoge/api/v1/sample' -H 'Content-Type: application/json;charset=utf-8' -d '{"name":"tester", "age":"24"}'     

応用:Bearer Token + JSONパラメータを指定する

$ curl -X POST 'https://hogehoge/api/v1/sample' -H 'Content-Type: application/json;charset=utf-8'  -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -d '{"name":"tester", "age":"24"}'

豆知識:[Laravel] Bearer Tokenの取得方法

# HTTPヘッダーからBearer Tokenを取得する。
$bearer_token = $request->bearerToken();

豆知識:[Laravel] パラメーターの取得方法

# パラメーターを取得する。
$name = $request->name;
$age = $request->age;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8 AppかApp\ModelsにModelファイルがない場合にdatabase/factoryは同じフォルダ構成にしないと動かない

Laravel 8にアップグレードして、testを実行したところfactoryのファイルが見つからないとエラーが出ました。
(ModelにHasFactoryは追加済)
Class 'Database\Factories\Infrastructure\Eloquents\Models\PostFactory' not found

実際ファイルは下記のように配置していたのでパスが一致してません。
Database\Factories\PostFactory

修正前PostFactory.php
<?php declare(strict_types=1);

// Factoriesの直下に配置
namespace Database\Factories;

use App\Infrastructure\Eloquents\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Post::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name'=> 'test'
         ];
    }
}

エラーの該当箇所を見ると、AppかApp\Models以外にmodel.phpが置かれている場合にエラーになるようです。
今回のプロジェクトではInfrastructure\Eloquents\Models配下にModel類を置いているので今更変えるのは難しいです。

Factory.php
public static function resolveFactoryName(string $modelName)
    {
        $resolver = static::$factoryNameResolver ?: function (string $modelName) {
            $modelName = Str::startsWith($modelName, 'App\\Models\\')
                ? Str::after($modelName, 'App\\Models\\')
                : Str::after($modelName, 'App\\');

            return static::$namespace.$modelName.'Factory';
        };

        return $resolver($modelName);
    }

参考記事にあるようにDatabase\Factories配下にModelフォルダと同じフォルダ構成を作成すれば良さそう。

PostFactory.php
<?php declare(strict_types=1);

// PostModelの配置場所と同じ構成にする
namespace Database\Factories\Infrastructure\Eloquents\Models;

use App\Infrastructure\Eloquents\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Post::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name'=> 'test'
         ];
    }
}

無事テストが通過するようになりました!

参考記事
https://laracasts.com/discuss/channels/laravel/laravel-8-model-factory-namespaces

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

laravelでbootstrapテンプレートを使うときに学んだメモ

ビューファイルは、resources/viewsの中に入れることで読み込む。

css,jsなどは、publicに入れることで読み込む。

htmlファイルは、.blade.phpに変換することで@csrfなど直接phpコードを書き込む事ができる。
※ .phpではダメで、.blade.php出ないと@csrfなどは使う事ができない。

bootstrapテンプレートなどを使ってlaravel使う場合は以下のようになる。

  1. DLしたテンプレートをプロジェクト内に入れる。
  2. テンプレート内のviewファイルをresources/viewsに入れる。
  3. 残りを全てpublicに入れる。
  4. htmlファイルを、.blade.phpに変換する。
  5. 要らないファイルなどがあれば整理する。
  6. ディレクトリ階層が変わるので、viewのimgタグなどを修正する。(描画して検証にかけるとエラーを吐くのでそこを修正していくと早い)

これでテンプレートを使う事ができるはず。

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

LaravelのdispatchNowでObject of class App\Jobs\XXX could not be converted to string

問題

Jobを即時実行しようとして

$xxx = new XXX($param);
XXX::dispatchNow($xxx);

としたら

Object of class App\Jobs\XXX could not be converted to string

と怒られた。

本来paramが入ってきてほしいSQLのバインドパラメータになぜかxxxが入ってきており、それが文字列に変換できなくて怒られているようだ。

解決方法

XXX::dispatchNow($param);

まじか。

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

laravel-admin でRowAction の表示方式を変更する

環境

  • Laravel Framework 8.2.0
  • laravel-admin 1.8.4

経緯

laravel-admin 1.8.4 では RowAction はハンバーガーメニューみたいな形式になってるが、ドキュメントの TOP のスクリーンショットにあるようなリンク形式にしたくて若干ハマった。
2020-09-14 23_40_02-Window.png
こんなの

変更方法

config/admin.php
    /*
    |--------------------------------------------------------------------------
    | The global Grid action display class.
    |--------------------------------------------------------------------------
    */
    'grid_action_class' => \Encore\Admin\Grid\Displayers\DropdownActions::class,

config/admin.php 内の grid_action_class\Encore\Admin\Grid\Displayers\Actions::class に変更するだけで良かった。

改めてドキュメントを見るとこの辺で grid_action_class について書いてるけど古い方式だから(?)触れられていないのかな?
https://laravel-admin.org/docs/en/model-grid-custom-actions#Old%20version%20compatible

もう少しカスタマイズする

Actions::render(View|Edit|Delete) をオーバーライドする。

renderDelete はクラスやデータ属性を下手に消すと削除用のスクリプトが動かなくなるので注意。

CustomActions.php
<?php

namespace App\Admin\Grid\Displayers;

use Encore\Admin\Grid\Displayers\Actions;

class CustomActions extends Actions
{
    protected function renderView()
    {
        return <<<EOT
<a href="{$this->getResource()}/{$this->getRouteKey()}" class="{$this->grid->getGridRowName()}-view btn btn-sm btn-default">
    <i class="fa fa-eye"></i> View
</a>
EOT;
    }

    protected function renderEdit()
    {
        return <<<EOT
<a href="{$this->getResource()}/{$this->getRouteKey()}/edit" class="{$this->grid->getGridRowName()}-edit btn btn-sm btn-default">
    <i class="fa fa-edit"></i> Edit
</a>
EOT;
    }

    protected function renderDelete()
    {
        $this->setupDeleteScript();

        return <<<EOT
<a href="javascript:void(0);" data-id="{$this->getKey()}" class="{$this->grid->getGridRowName()}-delete btn btn-sm btn-default">
    <i class="fa fa-trash"></i> Delete
</a>
EOT;
    }
}

config/admin.php を修正。

     /*
     |--------------------------------------------------------------------------
     | The global Grid action display class.
     |--------------------------------------------------------------------------
     */
-    'grid_action_class' => \Encore\Admin\Grid\Displayers\Actions::class,
+    'grid_action_class' => \App\Admin\Grid\Displayers\CustomActions::class,

127.0.0.1_8000_admin_auth_permissions(iPad).png

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