Formマクロを作成する


form

 悩み事

Formファサードを拡張して、機能を追加したい

 解決方法

Form::macro()メソッドを利用します

Form::macro()Formファサードを拡張して、独自のメソッドを追加する事ができます

最初にマクロを登録しましょう
その後にFormファサードを拡張して利用出来る様にします

app/start/global.phpファイルに下記の様に追加してみましょう

\Form::macro('sumthin', function() {
    return '<input type="sumthin" value="default">';
});

その後、Bladeテンプレートで以下の様に記述してアクセスします

{{Form::sumthin()}}

この様に出力されます

<input type="sumthin" value="default">

マクロに引数を追加しましょう

sumthinマクロで引数を使える様に変更します

\Form::macro('sumthin', function($value, $count = 10, $start = 1) {
    $build = [];
    while ($count > 0) {
        $build[] = sprintf('<input type="sumthun" value="%s" index="%s">',
          $value, $start);
        $start += 1;
        $count -= 1;
    }
    return join("\n", $build);
});

Form::sumthin()に必須の引数一つと、二つのオプションを追加しました。 引数を指定しない場合、Laravelはエラーを返します

テンプレートで以下の様に記述します

{{Form::sumthin('test', 5)}}

The output would be.

<input type="sumthin" value="test" index="1">
<input type="sumthin" value="test" index="2">
<input type="sumthin" value="test" index="3">
<input type="sumthin" value="test" index="4">
<input type="sumthin" value="test" index="5">

 アドバイス

ソースコードを見てみましょう!

vendor/laravel/src/Illuminate\HtmlディレクトリのFormBuilder.phpを見ると、
リファレンス等に載っていないいくつかのpublicメソッドがあります

マクロで$thisにはアクセス出来ませんが、以下のメソッドを利用する事ができます:

または標準的なメソッドをコールする事もできます:

マクロから他のマクロをコールする事ができます


Author:Chuck Heintzelman

Editor and Translator:Yuuki Takezawa