Laravel 带有链接的动态面包屑

Posted

技术标签:

【中文标题】Laravel 带有链接的动态面包屑【英文标题】:Laravel dynamic breadcrumbs with links 【发布时间】:2016-10-24 07:38:46 【问题描述】:

我正在尝试在 laravel 中使用链接实现动态面包屑。我通过以下代码成功渲染了面包屑,但没有链接。

    <ol class="breadcrumb">
    <li><a href="#"><i class="fa fa-dashboard"></i>Marketplace</a></li>
    @foreach(Request::segments() as $segment)
    <li>
        <a href="#">$segment</a>
    </li>
    @endforeach
</ol>

但现在我遇到了网址问题。我正在获取包含所有后代的路线的当前网址。有人可以帮助我如何添加指向面包屑的链接吗?

谢谢。

【问题讨论】:

提供 url 示例 URL 和生成的面包屑,以便我们为您提供相应的帮助 我推荐github.com/davejamesmiller/laravel-breadcrumbs @Qazi Url 将是这样的:marketplace.dev/admin/types/create 并且面包屑应该像 admin > types > create @Jeff 我查了一下,那将是我的第二个选择。我试图用一个简单的函数来处理它。因为上面的代码给了我需要的路由数组。我只想知道,如果我有一些功能可以发送每个路由名称,如下面的 URL marketplace.dev/admin/types/create 如果我发送“类型”,那么它会给出当前控制器或路径。这样我就可以只使用一个功能。请让我知道我是否走对了路,还是应该立即使用面包屑库?谢谢。 @Jeff,我使用了那个库,它很棒。在 laravel 5 上工作得很好。改变了我通过自己的函数处理面包屑的想法。 【参考方案1】:

我喜欢@rohankhude 提供的解决方案,但在第一段(市场)之后没有显示“/”。所以这是一个干净的代码。

<div class="breadcrumb">
    <ul>
        <li>
            <a href=" route('welcome') " class="inactive">Home</a>
        </li>
                
        <?php $link = "" ?>
        @for($i = 1; $i <= count(Request::segments()); $i++)
            @if($i < count(Request::segments()) & $i > 0)
                <?php $link .= "/" . Request::segment($i); ?>
                @if ($i == 1)
                    <a href="<?= $link ?>" class="inactive">/  ucwords(str_replace('-',' ',Request::segment($i)))</a>
                @else
                    <a href="<?= $link ?>" class="inactive"> ucwords(str_replace('-',' ',Request::segment($i)))</a>
                @endif
            @else
                <a class="active">/ ucwords(str_replace('-',' ',Request::segment($i)))</a>
            @endif
        @endfor
    </ul>
</div>

【讨论】:

【参考方案2】:

我写了一个可以动态处理 laravel 资源( index | edit | create )路由的代码:

自定义面包屑 => custom.blade.php

@php
    $segments=[];
    $l=count(Request::segments())-1
@endphp

@switch(Request::segments()[$l])
    @case('edit')
        @php
            $l--;
            $segments=array_slice(Request::segments(),0,$l);
            $segments[]=$model->slug // Model that passed to this included blade file
        @endphp
    @break
    @default
        @php $segments=Request::segments() @endphp
@endswitch

@php
    $link=''
@endphp
@foreach($segments as $sg)
   @php $link.='/'.$sg @endphp
   @if($loop->index<$l)
      <li class="breadcrumb-item">
         <a href="$link">ucfirst($sg=='admin'?'home':$sg)</a>
      </li>
   @else
      <li class="breadcrumb-item active">
         ucfirst($sg)
      </li>
   @endif
@endforeach

使用自定义面包屑 => example.balde.php

@include('admin.vendor.breadcrumb.custom',['model'=> $articles])

【讨论】:

【参考方案3】:

只需在任何链接前添加斜杠/ 即可将后裔添加到域名 像这样

&lt;a href="/YourLink" &gt;&lt;/a&gt;

【讨论】:

【参考方案4】:

这对我有用,在 Laravel 5.4 中尝试过。*

此代码完美运行的要求:所有 URL 都应在您的路由文件中具有层次结构模式

以下代码将为每个路径创建 crumb -

<a href="/">Home</a> >                
<?php $link = "" ?>
@for($i = 1; $i <= count(Request::segments()); $i++)
    @if($i < count(Request::segments()) & $i > 0)
    <?php $link .= "/" . Request::segment($i); ?>
    <a href="<?= $link ?>"> ucwords(str_replace('-',' ',Request::segment($i)))</a> >
    @else ucwords(str_replace('-',' ',Request::segment($i)))
    @endif
@endfor

所以 URL 的面包屑 your_site.com/abc/lmn/xyz 将是 - Home > abc > lmn > xyz

希望这会有所帮助!

【讨论】:

谢谢这很好用。对于这个小而简单的代码,我为什么要使用 package.json 呢?再次感谢。我不知道为什么没有人放弃投票。 到目前为止,这段代码对我来说非常棒。我为它创建了一个部分模板,所以我不必复制代码。我将代码粘贴到~/views/breadcrumbs.blade.php,然后将其称为@include('breadcrumbs') 我不明白为什么人们在完美运行的情况下推荐包!!【参考方案5】:

我不确定您是否已经找到了解决方案,但我想出了一种方法来解决我的项目。它可能会为您的实施派上用场。

我最终要么将整个 url 添加到链接中,要么只添加段,这是不可取的,因此使用数组切片我从数组中的 0 索引开始切片,并且只切片直到循环的当前迭代,然后将数组内爆成一个字符串,然后使用 URL::to 创建链接。

<ol class="breadcrumb">
   <li>
       <i class="fa fa-home"></i>
       <a href="route('admin.index')">HOME</a>
   </li>

   @for($i = 2; $i <= count(Request::segments()); $i++)
      <li>
         <a href=" URL::to( implode( '/', array_slice(Request::segments(), 0 ,$i, true)))">
            strtoupper(Request::segment($i))
         </a>
      </li>
   @endfor
</ol>

您会注意到,我只从 2 ($i = 2) 开始我的迭代,因为我的应用程序基础 url 从 /admin 开始,我手动将我的 home Url 放在第一个面包屑中。

同样,您可能已经有了一个解决方案,但是这可能适用于不想添加包以获取面包屑的人。

【讨论】:

是的,我最终得到了一个库,它可以提供很多帮助并自行管理许多事情。但是您的解决方案似乎是我想要做的。我也一定会尝试的。谢谢你的帮助。 :) 很高兴你能发现它有用 这个很有用【参考方案6】:

如果我正确理解您的问题,您只需填写链接的 URL。这是未经测试的,但我认为它应该可以工作。

<ol class="breadcrumb">
    <li><a href="#"><i class="fa fa-dashboard"></i>Marketplace</a></li>
    <?php $segments = ''; ?>
    @foreach(Request::segments() as $segment)
        <?php $segments .= '/'.$segment; ?>
        <li>
            <a href=" $segments ">$segment</a>
        </li>
    @endforeach
</ol>

【讨论】:

感谢您的回复。我已经尝试过了,但它也会与其他链接和命名空间产生问题。我想我应该去一些图书馆而不是这个。无论如何感谢您的帮助。 :)

以上是关于Laravel 带有链接的动态面包屑的主要内容,如果未能解决你的问题,请参考以下文章

将面包屑 php 添加到我的引导导航栏

带有 KnpMenu 的 Symfony 2 面包屑

iOS:带有面包屑路径的自定义导航栏?

elementui面包屑动态生成

如何在 Nuxt.js 中创建动态“面包屑”

bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法