Laravel Blade - 用户允许输入变量

时间:2016-06-12 14:11:09

标签: php laravel blade

我正在使用thetispro/laravel5-setting的存储包制作laravel 5.2应用的管理设置部分。

我希望我的管理员用户能够更新发送给用户的电子邮件副本,但某些电子邮件包含用户名等变量。 "感谢您与我们一起购物,CUSTOMER NAME"。

我可以轻松地将以下内容存储在设置中,但是当刀片输出它时,它只是将其打印为字符串而不是变量。我已尝试使用{{}}和{{!!进行转义和非转义字符!}。这就是我所拥有的:

管理员用户可以编辑的电子邮件:

<h2>Hi, {{ $user->name }}</h2>
<p>Welcome to my web app</p>

在我看来,我有:

{!! Setting::get('emailuserinvite') !!}
<br /><br />
<!-- Testing both escaped and nonescaped versions -->
{{ Setting::get('emailuserinvite') }}

什么样的刀片渲染只是:

echo "<h2>Hi, {{ $user->name }}</h2>
<p>Welcome to my web app</p>";

我试图制作一个自定义刀片指令,可以关闭回声,显示变量并打开回声,但这似乎也没有正常工作。

// AppServiceProvider
Blade::directive('echobreak', function ($expression) {
  // echo "my string " . $var . " close string";
  $var = $expression;
  return "' . $var . '";
});

// Admin user settings
Hi @echobreak($user->name)
Welcome to my web app

任何建议将不胜感激!感谢。

更新

我使用@ abdou-tahiri的例子嘲笑了一个简单的测试用例,但我仍然在使用eval()&#39; d代码时出错。

ErrorException in SettingController.php(26) : eval()'d code line 1:   Undefined variable: user

这是我的简单控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use Blade;

class SettingController extends Controller
{

    public function index() {
        $user = [
            "fname" => "Sam",
            "lname" => "yerkes"];
        $str = '{{ $user }}';
        return $this->bladeCompile($str, $user);
    }

    private function bladeCompile($value, array $args = [])
    {
        $generated = \Blade::compileString($value);
        ob_start() and extract($args, EXTR_SKIP);
        try {
            eval('?>'.$generated);
        } 
        catch (\Exception $e) {
            ob_get_clean(); throw $e;
        }
        $content = ob_get_clean();
        return $content;
    }

}

2 个答案:

答案 0 :(得分:0)

<h2>Hi, $user->name</h2>
<p>Welcome to my web app</p>

这是你想要做的吗?

<h2>Hi, {{$user->name}}</h2>
<p>Welcome to my web app</p>

答案 1 :(得分:0)

您可能需要使用Blade编译字符串,请检查此辅助函数:

function blade_compile($value, array $args = array())
{
    $generated = \Blade::compileString($value);

    ob_start() and extract($args, EXTR_SKIP);

    // We'll include the view contents for parsing within a catcher
    // so we can avoid any WSOD errors. If an exception occurs we
    // will throw it out to the exception handler.
    try
    {
        eval('?>'.$generated);
    }

    // If we caught an exception, we'll silently flush the output
    // buffer so that no partially rendered views get thrown out
    // to the client and confuse the user with junk.
    catch (\Exception $e)
    {
        ob_get_clean(); throw $e;
    }

    $content = ob_get_clean();

    return $content;
}

所以在你的视图文件中:

{!! blade_compile(Setting::get('emailuserinvite'),compact('user')) !!}

选中此Is there any way to compile a blade template from a string?