【问题标题】:change naming convention of the url更改 url 的命名约定
【发布时间】:2020-11-02 05:58:00
【问题描述】:

我想更改以下网址的命名约定:

http://example.org/designs/CV%20Designs

如下:

http://example.org/designs/cv-designs

这是我的 web.php 路由文件:

    Route::get('designs/{design}', 'DesignsController@show')
        ->name('designs.show');  

这是我的设计模型:

    public function getRouteKeyName()
    {
        $slug = Str::slug('Laravel 5 Framework', '-');
        dd($slug);
        return 'designName';
    }

当我 dd(slug);输出是“Laravel 5 Framework”,但我希望它是 designName

【问题讨论】:

  • 欢迎来到 SO ......所以你基本上想使用“slug”?
  • @lagbox 是的,请
  • 你可以看看\Illuminate\Support\Str::slug() laravel.com/docs/7.x/helpers#method-str-slug
  • @KurtFriars 我确实看过它,但问题是我不知道如何在下一行中传递设计名称而不是“Laravel 5 Framework”。 $slug = Str::slug('Laravel 5 Framework', '-');
  • 你能告诉我们你用来生成网址的代码吗?

标签: php laravel url url-routing slug


【解决方案1】:

好的,所以我将在这里做一些假设,但假设您的设计模型中有此功能:

设计.php

class Design extends Model
{
    ...

    /**
     * Assuming you dont have a slug column on your designs table
     *
     * Also assuming the slug is built from a column called 'name' on
     * your designs table
     */
    public function getSlugAttribute()
    {
        return \Illuminate\Support\Str::slug($this->name);
    }
    
    // This assumes there is a column on posts table of 'design_id'
    public function posts()
        return $this->hasMany(Post::class);
    }
    ...
}

现在让我们举例说明如何构建所需的路线。

编辑

通过与提问者的进一步讨论,他们不想显示与他们正在展示的设计相关的所有帖子(参见上面的模型)。此答案中的设置适用于此,您可以参考下面定义的 show 方法。 假设我们有DesignsController.php:

class DesignsController extends Controller
{
    ...
    public function index()
    {
        return view('designs.index', [
            'designs' => Design::all(),
        ]);
    }

    public function show(Request $request, string $design)
    {
        // It is worth noting here if name has a double space you wont
        // be able to build backwards to it for a query
        // ie) Design\s\sOne !== $lower(Design\sOne)\

        $spaced = str_replace('-', ' ', $design);
        $lower = strtolower($spaced);
        $design = Design::with('posts')->whereRaw("LOWER(name) = '$lower'")->first();
        
        return view('designs.show', [
            'design' => $design,
        ]);
    }
    ...
}

现在在“designs/index.blade.php”文件中,您可以执行以下操作:

    @foreach($designs as $design)
        <a href="{{ route('designs.show', [ 'design' => $design->slug ]) }}">{{ $design->name }}</a>
    @endforeach

这将按名称列出您的所有设计,并通过它们的 slug 链接到 designs.show 路线。

如果您总是希望将 slug 值 when serializing 加载到数组或 json 中,您可以将其添加到模型上受保护的 $appends 数组中。

如果您不总是希望附加它,则需要在运行时使用例如$design-&gt;append('slug') 附加它。

或者,如果您有一系列设计,您可以使用$designs-&gt;each-&gt;append('slug')

现在在您的designs.show Blade 文件中,您可以使用我们使用Design::with('posts') 加载的关系访问设计的帖子,方法是执行以下操作:

    @foreach ($design->posts as $post)
        <img src="{{ asset('storage/'.$post->postImage) }}">
    @endforeach

【讨论】:

  • 问题是,当我创建 2 个具有相同名称的设计时,即使它们不应该显示它们,因为这些设计具有不同的 ID
  • 哦,好的,谢谢,我将继续使用 id 作为 url
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多