【问题标题】:Adding HTML snippets in the blade-view在刀片视图中添加 HTML 片段
【发布时间】:2019-07-12 04:35:03
【问题描述】:

我正在使用我的自定义 js 播放器创建 laravel 项目。它已经完成并且正在工作,所以我需要在页面上显示带有歌曲的 div,我不知道这样做的最佳做法是什么。

我尝试了什么: 我有一个 Song 模型,其中添加了显示歌曲的方法。

{
  static public function displaySongs()
  {
    $songs = Song::all();
    echo "<div class='ostContainer'>";
    foreach ($songs as $song) {
      $song->displayOne();
    }
    echo "<div>";
    return $songs;
  }

  public function displayOne()
  {
    $songname = substr($this->name, 0, -4);
    echo "<div class='songContainer noselect' 
            data-audio='$this->path$this->name' 
            data-songid='$this->id'
            data-songname='$songname'>$songname</div>";
  }
}

还有刀片视图:

@extends('layout.layout')
@section('content')
    <audio id="audio"></audio>
    @include('player._playercontainer')
    <?php App\Song::displaySongs() ?>
@endsection

这完全符合预期,但我觉得这段代码是错误的。 有没有更好的方法来解决这个问题?

Laravel 版本:5.8.*.

【问题讨论】:

  • 使用blade 语法。代替&lt;?php ?&gt;,使用{{ }},或者,因为返回是html,所以使用{!! !!}。通常你不会直接在视图中查询东西,但我认为使用这样的静态方法是可以的。或者等等;保持这个想法。在您的 displaySongs()displayOne() 中,您必须将 html 附加到一个字符串,然后返回该字符串以使 {!! App\Song::displaySongs() !!} 工作。
  • 更好的做法是使用刀片,请查看此链接:laravel.com/docs/5.8/blade,
  • @TimLewis 我知道这种语法,但我不想打扰它,因为它在那里并没有真正改进。我很可能会使用符号链接建议的内容。
  • 是的;这还算公平。在某些情况下,您希望在模型中包含代码(主要是为了可重用性),但这也可以通过 blade 组件(@include("component") 等)来完成。许多不同的方法;选择适合你的,也选择适合你使用的框架的。干杯!
  • @TimLewis 我在另一个视图中使用这种方法,我的代码现在到处都是,因为我是创建网络应用程序和 laravel 的新手,谢谢。

标签: php laravel project


【解决方案1】:

您可以在自己的视图中完成大部分操作。执行以下操作:

public function displaySongs()
{
    return view('songs')->with([
        'songs' => Song::all()
    ]);
}

那么在你看来:

@extends('layout.layout')
@section('content')
    <audio id="audio"></audio>
    @include('player._playercontainer')
    <div class='ostContainer'>
        @foreach ($songs as $song)
            @php
                $songname = substr($song->name, 0, -4);
            @endphp
            <div class='songContainer noselect' 
                data-audio='{{$song->path}}{{$song->name}}' 
                data-songid='{{$song->id}}'
                data-songname='{{$songname}}'>
                {{$songname}}
            </div>
        @endforeach
    </div>
@endsection

作为一般规则,您希望模型中的逻辑、​​瘦控制器以及视图中的所有 HTML。不过,在这种情况下,逻辑非常简单,您只需在视图中即时设置单个变量。

【讨论】:

  • 是的,最初就是这样,但我希望在视图中保持紧凑,因为如果我想在另一个视图中使用该逻辑,则需要复制更多代码而不是一次调用。谢谢。
  • @AlexIsaev 不客气。如果你想在其他视图中重用代码,你可以把它放在一个部分和@include它任何你想要的地方。您必须记住要传递它的对象,但通常比将 HTML 放入模型或控制器中更好。
  • 我使用@include 来显示播放列表,但就像我显示歌曲的方法一样,我不确定这是否正确。那我就用它,谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多