Laravelの小ネタ、Tips、ノウハウ集、便利帳、ハック

1つの文書にまとめるものでもないような短いLaravelネタを気づいた時に追加していきます。バージョンによっては使えないものもあるかもしれません。その時はごめんなさい。
目次
- 1 開発サーバのポートを変える
- 2 php artisanのコマンドを忘れたら
- 3 実行したSQLをみたい場合(1)
- 4 実行したSQLをみたい場合(2)
- 5 Bladeファイルで改行させたい場合
- 6 ユーザのパスワードを強制変更
- 7 ログインユーザのIDを取得
- 8 JavaScript側で認証ユーザの情報を取得する
- 9 Bladeファイルのコンパイル後のファイル
- 10 一定期間の日付を取得(カレンダー)
- 11 コードでログイン
- 12 DBから取得した列名変更とSQLで分岐
- 13 年、月、日で検索を行う
- 14 モデルバインディングに失敗した時は
- 15 tinkerを使いこなそう
- 16 JSONデータのnumberがstringになった場合
開発サーバのポートを変える
Laravelをインストールした後にphp artisan serveを実行すると8000で起動します。ポートを指定したい場合は、–portオプションを利用します。
$ php artsan serve --port=80
ポート80だとアクセス権の問題で失敗する時があるのでその時はsudoを使用します。
なぜデフォルトでは8000で8000が使用していると8001に割り当てられますが、これはvendor¥laravel¥framework¥src¥illuminate¥Foundation¥CosoleディレクトリにあるServerCommad.phpに記述されています。
protected function port()
{
$port = $this->input->getOption('port') ?: 8000;
return $port + $this->portOffset;
}

php artisanのコマンドを忘れたら
php artisan listを実行して、どんなコマンドがあったか確認しましょう。
$ php artisan list
listの結果出てきたコマンドの詳細を知りたい場合は、php atisan helpコマンドを使用しましょう。
$ php artisan help コマンド名
コマンドの実行に使われるファイルは下記のディレクトリに保存されています。
vendor¥laravel¥framework¥src¥illuminate¥Foundation¥Console
実行したSQLをみたい場合(1)
下記のようにddメソッドをつければデバッグすることができます。
$user = User::where('name','John Doe')->dd();
"select * from `users` where `name` = ?"
array:1 [▼
0 => "John Doe"
]
実行したSQLをみたい場合(2)
実行したいSQLを見たい場合はAppServiceProvider.phpを利用することもできます。
bootメソッドにDB::listenを下記のように記述することで実行したSQLがログファイルに書き込まれます。ログファイルはstorage/logs/の下に作成されます。
public function boot()
{
\DB::listen(function ($query) {
logger()->info($query->sql);
logger()->info($query->bindings);
logger()->info($query->time);
});
}
Laravelのトップページにアクセスするとログファイルには以下の情報が書き込まれます。
[2019-08-31 01:12:00] local.INFO: select * from `users` where `id` = ? limit 1
[2019-08-31 01:12:00] local.INFO: array (
0 => 2,
)
[2019-08-31 01:12:00] local.INFO: 14.88
Bladeファイルで改行させたい場合
textareaタグで入力した文章で改行がある場合そのまま{{ $text }}を記述したも改行されません。nl2brは\nなどの改行文字の前に改行タグ<br>を入れてくれます。
{!! nl2br(e($text)) !!}
ユーザのパスワードを強制変更
登録したユーザのパスワードを強制的に変更したい場合は、tinkerを使って行うことができます。
tinkerを起動して、パスワードしたユーザ情報を取得して、Hashファサードを使って12356789のパスワードに変更しています。
$ php artisan tinker
>>> $user = App\User::where('email','john@example.com')->first();
=> App\User {#2963
id: 2,
name: "john doe",
email: "john@example.com",
email_verified_at: null,
created_at: "2019-08-31 00:32:35",
updated_at: "2019-08-31 00:32:35",
}
>>> $user->password = Hash::make('123456789');
=> "$2y$10$.BCHxBV3rD3pHMdbMa.W.O08JNFWGLwDqehdZKE5kh8PNSADSuSha"
>>> $user->save();
=> true
ログインユーザのIDを取得
ログインしているユーザのIDを取得したい場合はAuthファサードまたはヘルパー関数のauth()を利用することができます。
Auth::user()-id;
Auth::id();
auth()->user()->id;
auth()->id();
JavaScript側で認証ユーザの情報を取得する
JavaScriptやvue.jsなどで認証したユーザ情報を取得したい場合は以下のscriptタグを使うことで取得することができます。
<script>
window.user = {!! json_encode([ 'user' => auth()->check() ? auth()->user() : null,]) !!}
</script>
userのidだけが必要な場合は、下記とすればユーザのidだけ取得することができます。
<script>
window.user = {!! json_encode([ 'user' => auth()->check() ? auth()->user()->id : null,]) !!}
</script>
こちらでも取得できます。
<script>
window.user = {!! auth()->user() !!};
</script>
使用したい場合は、windows.userで可能です。
Bladeファイルのコンパイル後のファイル
LaravelではBladeファイルを使ってHTMLを作成しますがブラウザがBladeファイルを認識できるようにコンパイルを行っています。
そのファイルが/straoge/framework/viewsの下に保存されています。Bladeファイルで使われる@freachなどの構文がどのようなPHPのコードに変換されているかを確認することができます。
一定期間の日付を取得(カレンダー)
カレンダーのようにある期間の連続した日付を取得したい場合はCarbonではなくCarbonPeriodが便利です。
$start_date = '2020-01-01';
$end_date = '2020-12-31';
$period = CarbonPeriod::create($start_date,$end_date);
foreach($period as $date){
echo $date->format('Y-m-d';
}
日付だけではなく曜日だって取得できます。
$week = [ "日", "月", "火", "水", "木", "金", "土"];
foreach($period as $date){
echo $date->format('Y-m-d');
echo $date->format('w'); //曜日番号
echon $week[$date->format('w')] //曜日:日本語
}
コードでログイン
ログイン画面からログインせずコード上でログイン処理を行いたい場合はloginUsingId(id)メソッドが使えます。
auth()->loginUsingId(1); //user id 1でログイン
auth()->logout(); //ログアウト
DBから取得した列名変更とSQLで分岐
データベースから取得した列の名前を変更したい場合はrawメソッドを利用することができます。例えばcalendarsというテーブルはdateという列を持っています。この列名を変更したい場合はrawメソッドを利用することができます。
$dates = DB::table('calendars')->select(DB::raw("date as start_date"))->get();
テーブル名ではなく列の値に定数を設定したい場合にもrawメソッドを利用することはできます。
$dates = DB::table('calendars')->select(DB::raw("date as start_date, '今日は晴れ' as weather "))->get();
テーブルに保存された値によってif文のような分岐処理を行うことができます。その場合はCASE WHEN ELSEを利用できます。holiday列には0か1の値が入っています。
$dates = DB::table('calendars')->select(DB::raw("date as start,(CASE WHEN holiday = 1 THEN '休日' ELSE '休日でない' END) as name"))->get();
年、月、日で検索を行う
例えばdate型で設定して日付に対して2020年の1月のみデータを取得したい場合はどうしていますか。Laravelでは年、月、日を利用して検索を行うメソッドがあります。実際に下記のように検索を行うことができます。date列に入った2020年の1月のデータのみ取得することができます。他にどうのようなメソッドがあるか気になった場合はvendar\laravel\framework\src\illuminate\Database\Query\Builder.phpファイルを除いてみてください。これまで利用していけなかった新しい発見があるかもしません。
$dates = DB::table('calendars')->whereYear('date','2020')->whereMonth('date','01')->get();
モデルバインディングに失敗した時は
モデルバインディングに失敗した時はメソッドで指定している変数名がphp artisan route:listで表示されている{変数名}と同じなることを確認してください。
apiルーティングでapiResource/syste_maintenanceと設定した場合。
Route::middleware('auth:sanctum')->apiResource('/system_maintenance', systemMentenanceController::class);
モデルバインディングがうまくいかなかった場合はphp artisan route:listでルーティングのパスを確認してからモデルバインディングの変数を設定してください。$system_maintenanceを短縮系の$sys_mainなどにしないでください。
public function update(SystemMaintenace $system_maintenance , Request $request){
tinkerを使いこなそう
userのパスワードを強制的に変更したい場合にphp artisan tinkerが使えることを説明しました。その他にもLaravelのアプリケーションにアクセスしたい場合はapp()を実行することでLaravelの情報を確認することができます。
$ php artisan tinker
Psy Shell v0.10.6 (PHP 7.4.13 ― cli) by Justin Hileman
>>> app()
=> Illuminate\Foundation\Application {#2
configurationIsCached: false,
environment: "local",
environmentFile: ".env",
isLocal: true,
routesAreCached: false,
runningUnitTests: false,
version: "8.29.0",
path: "/home/reffect/laravel/app",
basePath: "/home/red0410/redhearts.co.jp/groupware",
configPath: "/home/reffect/laravel/config",
databasePath: "/home/reffect/laravel/database",
langPath: "/home/reffect/laravel/resources/lang",
publicPath: "/home/reffect/laravel/public",
storagePath: "/home/reffect/laravel/storage",
bootstrapPath: "/home/reffect/laravel/bootstrap",
}
テーブルに保存されているデータにアクセスすることも可能です。
>>> App\Models\User::all();
=> Illuminate\Database\Eloquent\Collection {#4414
all: [
App\Models\User {#337
id: 1,
name: "john doe",
email: "john@example.com",
email_verified_at: null,
created_at: "2021-03-13 16:13:47",
updated_at: "2021-03-13 16:14:08",
},
JSONデータのnumberがstringになった場合
Laravelから戻されるJSONデータの数値が文字列になっている場合は以下のようにJSON_NUMERIC_CHECKをつけることで文字列ではなく数値としてデータを戻すことができます。
return response()->json($users,200, [], JSON_NUMERIC_CHECK);
随時追加中