如何在存储在s3中的html中呈现Laravel标记
大家好 正如问题标题所说,我确实有HTML模板代码存储在s3中,上面有Laravel标记,比如:如何在存储在s3中的html中呈现Laravel标记,laravel,laravel-views,Laravel,Laravel Views,大家好 正如问题标题所说,我确实有HTML模板代码存储在s3中,上面有Laravel标记,比如: <html> <head> <title>{{ $landing->title }}</title> </head> <body> @foreach($landing->products as $product) <p>{{ $product->title }}</p>
<html>
<head>
<title>{{ $landing->title }}</title>
</head>
<body>
@foreach($landing->products as $product)
<p>{{ $product->title }}</p>
@endforeach
</body>
</html>
(我不想在浏览器中显示,只需获取html代码)
在render.blade.php
中,我有:
{!! html_entity_decode($template->html()) !!}
但这将显示带有Laravel标记的代码,而无需进行适当的替换
这上面有灯吗?任何帮助都将不胜感激。我认为这个问题有两种可能的解决方案
/storage/local/blade
。然后需要为该文件夹中的视图添加名称空间,如下所示:
AppServiceProvider.php
public function boot()
{
...
view()->addNamespace('s3', storage_path('/local/views');
...
}
现在,要处理从s3(在控制器中或其他地方)检索标记,您可以执行以下操作:
// Lets say the file on s3 is markup.blade.php
$contents = Storage::disk('s3')->get('path/to/markup.blade.php')
Storage::disk('local')->put(storage_path('local/views/markup.blade.php'), $contents);
现在,如果您的render.blade.php仅用于在s3上呈现标记,那么您应该使用新的名称空间视图。您可以在控制器中使用此选项,如:
return view('s3::markup', compact('landing'));
如果您想在其他刀片文件中使用s3标记,那么这会变得有点棘手。但可以通过像这样延伸刀片来完成
我更喜欢解决方案2的另一个原因是,在从s3下载之前,如果您查看文件是否已经存在于本地/视图中,您可以获得一些“缓存”效果。然后,您可以创建一个计划作业,删除存储/本地/视图中早于某个时间限制的文件。能否显示存储的HTML示例?Hello@Michael可能有任何类型的HTML代码。例如第一个代码块,一个包含laravel标记的html。我认为你需要用一个特定的html示例来更新你的问题,因为人们无法帮助你。你在问一个关于输出的问题,但没有告诉我们输入是什么。在不了解任何输入的情况下,我倾向于说问题就在那里。输入不是你想象的那样。我想你正在寻找这个问题。这似乎是其中一个问题,它应该是简单的,但由于刀片文件的处理方式,它是该死的困难!这个问题值得投票表决。我会想出一个解决办法。同时,你可以看看:第二种选择似乎是正确的选择。谢谢
public function boot()
{
...
view()->addNamespace('s3', storage_path('/local/views');
...
}
// Lets say the file on s3 is markup.blade.php
$contents = Storage::disk('s3')->get('path/to/markup.blade.php')
Storage::disk('local')->put(storage_path('local/views/markup.blade.php'), $contents);
return view('s3::markup', compact('landing'));
Blade::extend(function($view, $compiler)
{
$pattern = $compiler->createMatcher('includeNamespaced');
$viewPath = realpath($compiler->getPath());
$parts = explode(DIRECTORY_SEPARATOR, $viewPath);
$viewsDirectoryIndex = array_search('views', $parts);
$namespace = $parts[$viewsDirectoryIndex + 1];
$php = '$1<?php ';
$php .= 'if($__env->exists(\''.$namespace.'.\'.$2)){';
$php .= 'echo $__env->make(\''.$namespace.'.\'.$2)->render();';
$php .= '}';
$php .= 'else {';
$php .= 'echo $__env->make($2)->render();';
$php .= '}';
$php .= '?>';
return preg_replace($pattern, $php, $view);
});
@includeNamespaced('s3/markup')