write ahead log

ロールフォワード用

Laravelでビューの独自ヘルパ関数が欲しいときにはどうすればいいのか

わからん.

が, とりあえず調べてみると説得力あるのが以下だった.

teratail の回答

要は「Laravel公式でもヘルパ関数が用意されているんだから, その実装方法を見習え」ということっぽい.

確かにLaravelには豊富なヘルパ関数がある.

単純に実装する

この方法で実装するなら以下のサイトの「Composerでオートロードする方法」みたいな感じだろうか.

Laravel 5へ自作のヘルパー関数を追加するベストプラクティス - 綺麗に死ぬITエンジニア

確かにシンプルでいい.

というか仕事で使った.

名前空間切りたいんですが

しかし, なんでもかんでもグローバルってのも.

と思ってみていたらbladeには@injectという記法があるらしい.

Blade Templates - Laravel

@inject('変数', 'クラス名') 

とすればDIできる.なんかやりたい放題な気もするけど.

試しにやってみる

Laravelプロジェクトを作って, serviceディレクトリと雑なサービスをつくる.

$ mkdir app/Services
$ vi app/Services/MoneyFormatService.php

とりあえずフォーマットするメソッド生やす.

# app/Services/MoneyFormatService.php

<?php

namespace App\Services;

class MoneyFormatService
{
    // 金額をフォーマットする雑なメソッド
    public function moneyFormat(float $money)
    {
        return "¥" . number_format(floor($money));
    }
}

雑にビューを作る.

{{-- resource/views/sample.blade.php --}}

@inject('formatter', 'App\Services\MoneyFormatService')

サンプルだよ.

<p>{{ $formatter->moneyFormat(1000) }}</p>

ルートも雑に作る.

# route/web.php

Route::get('/sample', function() {
    return view('sample');
});

実行結果

サンプルだよ.
¥1,000

無秩序にドメイン特化なヘルパ関数を作りまくるよりはいいかもしれない.

汎用的なものは最初の参考例通りグローバルとして用意して,
あとはきちんとサービスを用意して必要に応じてDIすりゃいいということだろうか(知らんけど)

そもそもLaravelってDIきちんと使えないとダメなフレームワークっぽいんだけど, 雑魚の私にそこまでできるかという問題.