kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

Laravel View のcomponent

Laravelのviewにbladeを使用しています。細かい表示に関数を使いたいなー。と思って調べた内容です。

readouble.com

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にしておきます。