如何在存储在s3中的html中呈现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模板代码存储在s3中,上面有Laravel标记,比如:

<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标记的代码,而无需进行适当的替换


这上面有灯吗?任何帮助都将不胜感激。

我认为这个问题有两种可能的解决方案

  • 自己编译刀片(不是最佳的)
  • 在给定字符串的情况下,您可以创建一个帮助器函数来为您编译blade。()

    php(或您希望定位函数的任何位置)

    我不认为这是最佳的解决方案,因为你最终还是创建了文件

  • 为来自s3的blade/html创建一个新名称空间
  • 首先,您需要在项目中创建一个文件夹,如
    /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')