ラボ > Laravel、Lumen:views関連

laravel ビューでメソッドを利用した出力

ビューで頻繁に使う内容(htmlタグのまとまり…など)をどうにかしてまとめたい…

作成日:2024-03-01, 更新日:2024-03-05

基本

  • 定数などを使う
  • メソッドを用意する

定数などを使う

define()を使うのがラクではあるんだけど、色々面倒なので…constsファイルを用意して出力

▼「app/Consts/ViewConst.php」を用意する(※PATHは任意)

<?php
namespace App\Consts;
class ViewConst
{
    public const XXXX = 'xxxx';
    // 省略

▼ビュー内

{{ App\Consts\ViewConst::XXXX }}<!-- 通常出力: エスケープ処理済み -->
{!! App\Consts\ViewConst::XXXX !!}<!-- HTML出力: エスケープ処理無し -->

メソッドを用意する

▼「app/Lib/ViewLib.php」を用意する(※PATHは任意)

// 省略
  public static function xxxx() {
    return xxx;
  }
  // 省略

▼ビュー内

{{ App\Lib\ViewLib::xxxx() }}<!-- 通常出力: エスケープ処理済み -->
{!! App\Lib\ViewLib::xxxx() !!}<!-- HTML出力: エスケープ処理無し -->

ビューでの出力を短縮

「{{ App\Lib\ViewLib::xxxx() }}」という部分は種類が増えていくと長くなっていくからどうにかしたい…

方法はいくつかある…

  • ビューコンポーザを使用 ← 使い勝手がよく、一番簡単に設定できそうに感じる
  • ヘルパーメソッドを作成
  • ファサードのエイリアスを使用
  • Bladeディレクティブを作成

ビューコンポーザ、ヘルパーメソッドとBladeディレクティブ

調べた感じ「ビューコンポーザ」「ヘルパーメソッド」と「Bladeディレクティブ」が簡単っぽい

  • ビューで使いたい: 「ビューコンポーザ」or「ヘルパーメソッド」or「Bladeディレクティブ」
  • ビュー内のPHPのスクリプトブロック(<?php ~~~ ?>)の中でも使いたい: 「ビューコンポーザ」or「ヘルパーメソッド」
  • コントローラーの中でも使いたい: 「ヘルパーメソッド」
  • 設定は「ビューコンポーザ」「Bladeディレクティブ」が似たような感じで「ヘルパーメソッド」はcomposerのコマンドを叩く必要がある

個人的にcomposer.jsonを修正するってのがイヤだから「ヘルパーメソッド」を使うのは避けたい…

ビューコンポーザ ヘルパーメソッド Bladeディレクティブ
設定:初回 サービスプロバイダに追加 ヘルパーファイルを用意 + composerの更新 サービスプロバイダに追加
設定: 短縮したいメソッドを追加したい メソッド追加時、サービスプロバイダに追加 ヘルパーファイルにメソッド追加なら不要
ファイル追加するならcomposer更新
メソッド追加時、サービスプロバイダに追加
ビューでのブレード構文での利用
{{ $xxxx() }}、{!! $xxxx() !!}
{{ xxxx() }}、{!! xxxx() !!}
@xxxx()
ビューでのPHPのスクリプトブロックでの利用
<?php echo $xxxx(); ?>
<?php echo xxxx(); ?>
利用不可
コントローラーでの利用 利用不可 利用OK 利用不可

ビューコンポーザを使用

// ServiceProvider内でビューコンポーザを定義
View::composer('*', function ($view) {
    $view->with('xxxx', function() {
        return App\Lib\ViewLib::xxxx();
    });
});

// ビューの中で使用(※「$」が必要)
{!! $xxxx() !!}

利用するまでのステップ

サービスプロバイダに追記

▼App\Providers\AppServiceProvider.php

// 省略
use Illuminate\Support\Facades\View; // ←「View::composer()」を使うので必要
// 省略
    public function boot()
    {
        View::composer('*', function ($view) {
            // $view->with('xxx', function($key='') { // 「function xxx($key=''){}」のような初期値ありの引数に対応
            $view->with('xxx', function($key) {
                return xxx\xxx::xxx($key);
            });
        });
    }
// 省略

ビューなどで出力

{!! $xxx('xxx') !!}
<?php echo $xxx('xxx'); ?>

ヘルパーメソッドを作成

// ヘルパーファイルに関数を定義
function xxxx() {
    return App\Lib\ViewLib::xxxx();
}

// ビューの中で使用
{!! xxxx() !!}

利用するまでのステップ

ヘルパーファイルを作成

▼app/Helpers/xxxx.phpを用意

<?php
function xxxx() {
    return App\Lib\ViewLib::xxxx();
}

function yyyy() { // 別のメソッドを追加することも可能
    // 他の処理
}

ヘルパーファイルをオートロード: composer.json

composer.jsonにファイルパスを追加

{
    "autoload": {
        "files": [
            "app/Helpers/xxxx.php"
        ]
    }
}

▼「app/Helpers/common.php」というファイルを追加するとき

// 省略
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/Helpers/common.php"
        ]
    },
// 省略

※「'」はダメで「"」にする、最後に「,」は無し…など記述ルールがしっかりしている

composerの変更を適用

コンソールから下記実行

$ composer dump-autoload

ビューで使う

{!! xxxx() !!}
{!! yyyy() !!}
<?php echo xxxx(); ?>

ファサードのエイリアスを使用

// エイリアスの設定
use App\Lib\ViewLib as IconLib;

// ビューの中で使用
{!! IconLib::xxxx() !!}

利用するまでのステップ

  • ファサードクラスを作成(すでに存在する場合は不要)
  • config/app.php でエイリアスを設定
  • ビューでエイリアスを使用してファサードのメソッドを呼び出す

…面倒そうなので未調査

Bladeディレクティブを作成

// Bladeディレクティブの定義
Blade::directive('xxxx', function ($expression) {
    return "<?php echo App\Lib\ViewLib::xxxx($expression); ?>";
});

// ビューの中で使用
@xxxx()

利用するまでのステップ

サービスプロバイダに追記

▼App\Providers\AppServiceProvider.php

// 省略
use Illuminate\Support\Facades\Blade; // ←「Blade::directive()」を使うので必要
// 省略
    public function boot()
    {
        Blade::directive('xxxx', function ($expression) {
            return "<?php echo App\Lib\ViewLib::xxxx($expression); ?>"; // 「<?php **** ?>」という文字列をreturnさせる
        });
    }
// 省略

「$expression」がすべての引数を表しているらしい
→「App\Lib\ViewLib::yyyy($a, $b)」みたいに複数の引数を使う場合でも「$expression」一つでOKだそうだ

キャッシュのクリア

基本、やらなくて大丈夫。動作しないときにキャッシュが悪さしているかもしれないので実行したほうが良い…って感じ

$ php artisan view:clear
$ php artisan config:clear