tohokuaikiのチラシの裏

技術的ネタとか。

LaravelのBladeで生のStringをテンプレートとしてParseする

どんな要望やねん…ていうか、こんな感じですね。 laravel.io

Controllerの中で、

<?php
$foo = 'bar';
$text = view('This is {{$foo}}.')->render();
// $text = 'This is bar.';

結構この手の質問は見かけられるんだけど、どれも5年以上前ので。

ヘルパ関数ひとつ作れっていう回答

こんな感じ laracasts.com

<?php
use Symfony\Component\Debug\Exception\FatalThrowableError;

function render($__php, $__data)
{
    $obLevel = ob_get_level();
    ob_start();
    extract($__data, EXTR_SKIP);
    try {
        eval('?' . '>' . $__php);
    } catch (Exception $e) {
        while (ob_get_level() > $obLevel) ob_end_clean();
        throw $e;
    } catch (Throwable $e) {
        while (ob_get_level() > $obLevel) ob_end_clean();
        throw new FatalThrowableError($e);
    }
    return ob_get_clean();
}

このメソッドは、Controllerに入れておけばいいかな。

で、使う時は

<?php

$blade = 'Hello, {{ $planet }}!';
$php = Blade::compileString($blade);
return render($php, ['planet' => 'World']);

だって。

wpb/string-blade-compiler を使う

良いパッケージがあった。 packagist.org

2014年2月にInitial Commitでまだ開発継続中。

これで何も考えずに composer require wpb/string-blade-compiler して、Configとか不要で

<?php
        $user = Auth::user();
        $x = view(['template' => 'Email => {{$user->email}}'], ['user' => $user]);
//     $x =>  Email => admin@example.com

でいける。うーん、なんかよく動作原理がわからんけど、クソ便利。