在 Laravel Blade 中生成 HTML 链接

Generating HTML links in Laravel Blade

好的,如题所示。我想在 Laravel Blade 中生成 links。问题是,我的内容来自数据库。

Id |            Content                                              | Status
1  |  <a href="{{ asset('public/images/projects/p1_002728.jpg') }}"> |   A

我的控制器

public static function ViewPerProject()
{
    $data = Projects::GetProjectDetails();

    return view('works.project1', ['projectPackage' => $data]);
}

和我的看法

     @foreach($projectPackage as $project)
        {!! $project->Content !!}
      @endforeach

其中我的 link 在检查元素时生成了这个。

<a href="{{ asset('public/images/projects/p1_002728.jpg') }}"> 

我希望我的 link 生成有点像这样的完整路径

<a href="localhost/arc/public/images/projects/p1_002728.jpg"> 

伙计们有什么想法吗?

我想你可以试试这个:

<a href="{{url('images/projects/p1_002728.jpg')}}">

希望这对你有用!!!

服务应该return这种数组。只需根据您的要求将路径调整为 ./ 或 ../ 即可。

public static function ViewPerProject()
    {
       $package = ['./images/projects/p1_002728.jpg','./images/projects/p1_002728.jpg']
       $this->data['projectPackage']  = $package;
       $this->data['someOtherData_1'] = [];
       $this->data['someOtherData_2'] = "test";

        return view('works.project1')->with('data',$this->data);
    }

在视图中你可以这样使用。

@foreach($projectPackage as $data['projectPackage'])
         <a href="{{$projectPackage}}"></a> 
@endforeach

那是行不通的。您不能 运行 php 以这种方式运行。就像回声里面的回声。

    {{!! '<a href="{{ asset('images/projects/p1_002728.jpg') }}">' !!} 

如果您出于某种原因真的想保存指向数据库的链接,为什么不这样保存:

<a href="[domain]public/images/projects/p1_002728.jpg">

这类似于 Wordpress 的简码。

因此,在显示数据之前,您需要进行准备。将您的数据传递给解析器。

@foreach($projectPackage as $project)
    {!!  parseDomain($project->Content) !!}
@endforeach

并创建一个帮助程序,它将 [domain] 更改为您的完整域或 public 路径。

function parseDomain($content){
    $domain = asset('/');
    return str_replace('[domain]',$domain,$content);
}

但是,我仍然希望您可以将 images/projects/p1_002728.jpg 保存到您的数据库中,而不是保存整个元素然后回显它。

您基本上是在数据库中存储一个 blade 模板,其中包含 Blade 和 PHP 代码。为了正确显示,这是一个必须由 Blade 模板引擎和 PHP 引擎处理的字符串。

有两种选择。

首先,您可以将字符串从数据库转储到一个临时文件,然后使用 @include 指令来包含您的临时文件。这显然会有一些开销,因为您将执行大量磁盘 I/O,具体取决于您正在处理的记录数。

其次,可以手动调用Blade处理和PHP处理。这将涉及对 eval() 的调用,但它并不比将字符串写入文件然后包含它更危险(如果 $project->Content 包含任何类型的用户输入,这两者都是危险的!).

选项二的代码如下所示:

@foreach($projectPackage as $project)
    {!! eval('?>'.Blade::compileString($project->Content) !!}
@endforeach

首先,Blade::compileString() 方法将从您的数据库中获取字符串并将其从 blade 模板编译为标准 HTML/PHP.

其次,对 eval() 的调用将 运行 您的 HTML/PHP 通过 PHP 处理器和 return 结果字符串。由 eval() 处理的 blade 模板字符串必须以 ?> 开头,以 HTML 模式开始 eval(),而不是 PHP 模式(eval() docs here).

第三,blade {!! !!} 指令将打印出该字符串而不转义任何内容。