Laravelのviewにbladeを使用しています。細かい表示に関数を使いたいなー。と思って調べた内容です。
componentかdirectiveを使えば良さそう。
コードはドキュメントから参照しています。
Component
use Illuminate\Support\Facades\Blade; /** * パッケージの全サービスの初期起動処理 */ public function boot() { Blade::component('package-alert', Alert::class); }
<?php namespace App\View\Components; use Illuminate\View\Component; class Alert extends Component { /** * 警告タイプ * * @var string */ public $type; /** * 警告メッセージ * * @var string */ public $message; /** * コンポーネントインスタンスを作成 * * @param string $type * @param string $message * @return void */ public function __construct($type, $message) { $this->type = $type; $this->message = $message; } /** * コンポーネントを表すビュー/コンテンツを取得 * * @return \Illuminate\View\View|\Closure|string */ public function render() { return view('components.alert'); } }
<div class="alert alert-{{ $type }}"> {{ $message }} </div>
blade内での書き方
<x-package-alert/>
データを渡した書き方
<x-package-alert type="error" :message="$message"/>
directive
<?php namespace App\Providers; use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * 全アプリケーションサービスの登録 * * @return void */ public function register() { // } /** * アプリケーションの全サービスの初期処理 * * @return void */ public function boot() { Blade::directive('datetime', function ($expression) { return "<?php echo ($expression)->format('m/d/Y H:i'); ?>"; }); } }
blade内での書き方
@datetime($var)
書いてみたが、個人的な感想で使わない理由
- 変数がひとつしか渡せない?
- 書き方次第でエスケープされない恐れがある?
変数増やしたらエラーになったので、変数は一つしかできない可能性がありそう。ただ@****みたいな構文で二つの変数の内容もあったので、書き方が悪いだけな気もしています。
laravel/src/View/Compilers/Concerns配下がdirectiveっぽいので、ソースを読んでみると複数の変数の内容もあったので、書き方が悪い可能性はありますね。
どっちで書く?
個人的にはcomponentが使いやすいので、componentにしておきます。