- 投稿日:2020-02-14T23:24:14+09:00
Laravel HTML::linkやHTML::linkActionメソッドが使えない件(LaravelCollective)
環境
- PHP 7.4.1
- Composer 1.9.3
- Laravel Framework 6.14.0
- laravelcollective/html v6.0.3
結論
LaravelCollective/html v5.4から記法が変更になっています。
v5.4以降を使用する場合は、link_toやlink_to_actionメソッドを使いましょう。
完全にRailsに寄せてきてますね。
https://laravelcollective.com/docs/6.0/html#generating-urlslink_to('foo/bar', $title = null, $attributes = [], $secure = null) link_to_action('HomeController@getIndex', $title = null, $parameters = [], $attributes = [])参考(公式)
・LaravelCollective | HTML v5.3
https://laravelcollective.com/docs/5.3/html#generating-urls・LaravelCollective | HTML v5.4
https://laravelcollective.com/docs/5.4/html#generating-urls余談
以下の記事が更新されておらず、自分の環境だけかな?とめっちゃ焦りました。
以下のサイトに編集リクエストみたいなのが出せる人がいたら是非お願いします。・Laravel Recipes日本語版 | HTMLリンクを生成する
http://recipes.laravel.jp/recipe/250・Laravel Recipes日本語版 | コントローラのアクションへのHTMLリンクを生成する
http://recipes.laravel.jp/recipe/246
- 投稿日:2020-02-14T22:09:10+09:00
Laravel foreachで配列回して送信したcheckboxのoldを取得する
環境
- PHP 7.4.1
- Composer 1.9.3
- Laravel Framework 6.14.0
- laravelcollective/html v6.0.3
結論
laravelcollective/html入れてFormファサード使ったら、勝手に直前の入力値をcheckedにしてくれました。
便利すぎて震えた。Composer
composer require laravelcollective/htmlView
<form method="post" action="{{ action('HogeController@fuga') }}"> {{ csrf_field() }} <input type="submit"> <ul> @foreach($items as $item) <li> {{ Form::checkbox('item_ids[]', $item->id) }} </li> @endforeach </ul> {{-- バリデーションエラー確認用 --}} @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif </form>Controller
public function fuga(Request $request) { $this->validate($request, [ 'item_ids' => 'required|array', 'item_ids.*' => 'email' // わざとバリデーションをエラーにして確認. integerにする ]); dd($request->item_ids); }余談
もちろん、Formファサードを使用しない以下のコードはcheckedされません。
<input type="checkbox" name="item_ids[]" value="{{ $item->id }}">
- 投稿日:2020-02-14T21:55:40+09:00
Laravel Homestead環境のログファイルの場所
- 投稿日:2020-02-14T03:41:27+09:00
laravel-async-queueでLaravelの非同期キューを小さく使い始める
Laravelでキューを使うにはキューワーカーを立てる必要がありますが、キューワーカーのプロセス監視方法や、キューワーカーを使用しているアプリケーションのデプロイ方法を考える必要があり、結構面倒臭いです。
キューワーカーが不要な同期キュードライバもありますが、これだと非同期処理の旨味がありません。laravel-async-queue
https://github.com/barryvdh/laravel-async-queue
laravel-async-queueというパッケージが非同期キュードライバを提供しています。
この非同期キュードライバを使うと、ジョブをバックグラウンドプロセスで即時に実行できるようになり、キューワーカーを立てることなく非同期処理の旨味を得ることができます。インストール方法
なお、この記事では下記のバージョンのソフトウェアを使用しています。
ソフトウェア バージョン PHP 7.2.12 Laravel 5.5.44 laravel-async-queue v0.7.3 laravel-async-queueをComposerでインストールします。
composer require barryvdh/laravel-async-queue
config/app.php
にサービスプロバイダを追加します。config/app.phpBarryvdh\Queue\AsyncServiceProvider::class,
config/queue.php
のdefault
オプションをasync
に変更します。config/queue.php'default' => 'async',さらに
connections
オプションに非同期キュードライバ用の設定を追加します。config/queue.php'async' => [ 'driver' => 'async', 'table' => 'jobs', 'queue' => 'default', 'expire' => 60, ],動作テスト
動作テストをしてみます。
テスト用のコントローラとイベントリスナーとイベントを用意します。
app/Http/Controllers/TestController.php<?php namespace App\Http\Controllers; use App\Events\TestEvent; use App\Http\Controllers\Controller; use Log; class TestController extends Controller { public function test() { Log::debug('1'); event(new TestEvent()); Log::debug('3'); } }app/Listeners/TestListener.php<?php namespace App\Listeners; use App\Events\TestEvent; use Illuminate\Contracts\Queue\ShouldQueue; use Log; class TestListener implements ShouldQueue { public function handle(TestEvent $event) { Log::debug('2') } }app/Events/TestEvent<?php namespace App\Events; class TestEvent { }app/Providers/EventServiceProvider.phpprotected $listen = [ 'App\Events\TestEvent' => [ 'App\Listeners\TestListener', ], ];コントローラのアクションを実行すると、下記のようなログが出力されます。
[2020-02-13 23:36:45] local.APP.DEBUG: 1 [] {"uid":"93eb38d","process_id":1017} [2020-02-13 23:36:45] local.APP.DEBUG: 3 [] {"uid":"93eb38d","process_id":1017} [2020-02-13 23:36:47] local.APP.DEBUG: 2 [] {"uid":"535fd9a","process_id":1046}1→3→2となっており、非同期処理されていることがわかります。
プロセスIDとUIDもコントローラとイベントリスナーで別になっています。ちなみに同期ドライバの場合です。
[2020-02-13 23:38:22] local.APP.DEBUG: 1 [] {"uid":"a9173e4","process_id":1020} [2020-02-13 23:38:22] local.APP.DEBUG: 2 [] {"uid":"a9173e4","process_id":1020} [2020-02-13 23:38:22] local.APP.DEBUG: 3 [] {"uid":"a9173e4","process_id":1020}1→2→3となっており、同期処理です。
もちろんプロセスIDとUIDもコントローラとイベントリスナーで同じです。失敗ジョブを扱えるようにする
非同期キュードライバは、キューワーカーを使っていないため、ジョブが1回失敗すると自動ではリトライされません。
また、ジョブ失敗ベントが発行されず、失敗したジョブは
jobs
テーブルに残ったままで、failed_jobs
テーブルに入りません。これだと運用がつらいので、ジョブ失敗をSlackに通知したりできるように、ジョブ失敗イベントが発行されるようにします。
イベントリスナーの
$tires
プロパティを1
に設定すると、ジョブ失敗ベントが発行されるようになります1。class TestListener implements ShouldQueue { public $tires = 1; ... }トレイトにしておくと便利かもしれません。
trait AsyncQueueable { public $tires = 1; }class TestListener implements ShouldQueue { use AsyncQueueable; ... }これでジョブ失敗イベントが発生するようになります。
同時に、失敗ジョブがjobs
テーブルから消えるようになります。ただ、このままだと失敗ジョブが
jobs
テーブルにもfailed_jobs
テーブルにも残らなくなってしまうので、失敗ジョブをfailed_jobs
テーブルに入れる処理をジョブ失敗イベントのコールバックとして書くことにします。
これはAppServiceProvider
のboot
メソッドに書くのがいいと思います。app/Providers/AppServiceProvider\Illuminate\Support\Facades\Queue::failing(function (\Illuminate\Queue\Events\JobFailed $event) { if ($event->job->getConnectionName() == 'async') { // 失敗ジョブをfaled_jobsテーブルに保存する $id = $this->app['queue.failer']->log( $event->connectionName, $event->job->getQueue(), $event->job->getRawBody(), $event->exception ); } // Slackへの通知など ... });ちなみに、
log
メソッドはfailed_jobs
テーブルのIDが返ってきます。
Slackに通知する時に使うと、後でジョブを手動でリトライする際に便利でいいと思います。これで失敗ジョブが
failed_jobs
テーブルに入るようになります。リトライが必要な場合は、下記のArtisanコマンドを実行します。
artisan queue:retry <failed_jobsテーブルのID>これで
failed_jobs
テーブルの失敗ジョブがjobs
テーブルに戻ります。さらに下記のArtisanコマンドを実行するとジョブを実行できます。
artisan queue:async <jobsテーブルのID>
- 投稿日:2020-02-14T03:41:27+09:00
Laravelのキューを小さく使い始める
Laravelでキューを使うにはキューワーカーを立てる必要がありますが、キューワーカーのプロセス監視方法や、キューワーカーを使用しているアプリケーションのデプロイ方法を考える必要があり、結構面倒臭いです。
キューワーカーが不要な同期キュードライバもありますが、これだと非同期処理の旨味がありません。laravel-async-queue
https://github.com/barryvdh/laravel-async-queue
laravel-async-queueというパッケージが非同期キュードライバを提供しています。
この非同期キュードライバを使うと、ジョブをバックグラウンドプロセスで即時に実行できるようになり、キューワーカーを立てることなく非同期処理の旨味を得ることができます。インストール方法
なお、この記事では下記のバージョンのソフトウェアを使用しています。
ソフトウェア バージョン PHP 7.2.12 Laravel 5.5.44 laravel-async-queue v0.7.3 laravel-async-queueをComposerでインストールします。
composer require barryvdh/laravel-async-queue
config/app.php
にサービスプロバイダを追加します。config/app.phpBarryvdh\Queue\AsyncServiceProvider::class,
config/queue.php
のdefault
オプションをasync
に変更します。config/queue.php'default' => 'async',さらに
connections
オプションに非同期キュードライバ用の設定を追加します。config/queue.php'async' => [ 'driver' => 'async', 'table' => 'jobs', 'queue' => 'default', 'expire' => 60, ],動作テスト
動作テストをしてみます。
テスト用のコントローラとイベントリスナーとイベントを用意します。
app/Http/Controllers/TestController.php<?php namespace App\Http\Controllers; use App\Events\TestEvent; use App\Http\Controllers\Controller; use Log; class TestController extends Controller { public function test() { Log::debug('1'); event(new TestEvent()); Log::debug('3'); } }app/Listeners/TestListener.php<?php namespace App\Listeners; use App\Events\TestEvent; use Illuminate\Contracts\Queue\ShouldQueue; use Log; class TestListener implements ShouldQueue { public function handle(TestEvent $event) { Log::debug('2') } }app/Events/TestEvent<?php namespace App\Events; class TestEvent { }app/Providers/EventServiceProvider.phpprotected $listen = [ 'App\Events\TestEvent' => [ 'App\Listeners\TestListener', ], ];コントローラのアクションを実行すると、下記のようなログが出力されます。
[2020-02-13 23:36:45] local.APP.DEBUG: 1 [] {"uid":"93eb38d","process_id":1017} [2020-02-13 23:36:45] local.APP.DEBUG: 3 [] {"uid":"93eb38d","process_id":1017} [2020-02-13 23:36:47] local.APP.DEBUG: 2 [] {"uid":"535fd9a","process_id":1046}1→3→2となっており、非同期処理されていることがわかります。
プロセスIDとUIDもコントローラとイベントリスナーで別になっています。ちなみに同期ドライバの場合です。
[2020-02-13 23:38:22] local.APP.DEBUG: 1 [] {"uid":"a9173e4","process_id":1020} [2020-02-13 23:38:22] local.APP.DEBUG: 2 [] {"uid":"a9173e4","process_id":1020} [2020-02-13 23:38:22] local.APP.DEBUG: 3 [] {"uid":"a9173e4","process_id":1020}1→2→3となっており、同期処理です。
もちろんプロセスIDとUIDもコントローラとイベントリスナーで同じです。失敗ジョブを扱えるようにする
非同期キュードライバは、キューワーカーを使っていないため、ジョブが1回失敗すると自動ではリトライされません。
また、ジョブ失敗ベントが発行されず、失敗したジョブは
jobs
テーブルに残ったままで、failed_jobs
テーブルに入りません。これだと運用がつらいので、ジョブ失敗をSlackに通知したりできるように、ジョブ失敗イベントが発行されるようにします。
イベントリスナーの
$tires
プロパティを1
に設定すると、ジョブ失敗ベントが発行されるようになります1。class TestListener implements ShouldQueue { public $tires = 1; ... }トレイトにしておくと便利かもしれません。
trait AsyncQueueable { public $tires = 1; }class TestListener implements ShouldQueue { use AsyncQueueable; ... }これでジョブ失敗イベントが発生するようになります。
同時に、失敗ジョブがjobs
テーブルから消えるようになります。ただ、このままだと失敗ジョブが
jobs
テーブルにもfailed_jobs
テーブルにも残らなくなってしまうので、失敗ジョブをfailed_jobs
テーブルに入れる処理をジョブ失敗イベントのコールバックとして書くことにします。
これはAppServiceProvider
のboot
メソッドに書くのがいいと思います。app/Providers/AppServiceProvider\Illuminate\Support\Facades\Queue::failing(function (\Illuminate\Queue\Events\JobFailed $event) { if ($event->job->getConnectionName() == 'async') { // 失敗ジョブをfaled_jobsテーブルに保存する $id = $this->app['queue.failer']->log( $event->connectionName, $event->job->getQueue(), $event->job->getRawBody(), $event->exception ); } // Slackへの通知など ... });ちなみに、
log
メソッドはfailed_jobs
テーブルのIDが返ってきます。
Slackに通知する時に使うと、後でジョブを手動でリトライする際に便利でいいと思います。これで失敗ジョブが
failed_jobs
テーブルに入るようになります。リトライが必要な場合は、下記のArtisanコマンドを実行します。
artisan queue:retry <failed_jobsテーブルのID>これで
failed_jobs
テーブルの失敗ジョブがjobs
テーブルに戻ります。さらに下記のArtisanコマンドを実行するとジョブを実行できます。
artisan queue:async <jobsテーブルのID>
- 投稿日:2020-02-14T00:16:28+09:00
laravel ログイン後のリダイレクト先を指定
こんにちは!
laravelのデフォルトで実装されているログイン機能について、ログイン後のリダイレクト先を変更する方法を紹介します。
laravel 6.x系です
前提として、ログイン機能が実装済みとします!(リファレンスに記載されているコマンドを打てば実装できるはず)
で、デフォルト状態だと、ログイン画面でログインすると、'/home'にリダイレクトする仕様になっていると思いますが、任意のurlを指定すことができます
app/Http/Auth/LoginController.php//省略 public function redirectPath() { return '任意のurl'; //例)return 'costs/index'; }Auth/LoginControllerに↑の関数を追記することで、任意のurlにリダイレクトさせることができます!
自分はこのコントローラの一番下に記述しました。
これだけの内容です!
リダイレクトの条件分岐もできますので、気になる方はいろんな記事をググってみてください!