为了账号安全,请及时绑定邮箱和手机立即绑定

更改 url 的命名约定

更改 url 的命名约定

PHP
jeck猫 2023-07-30 13:07:02
我想更改以下网址的命名约定: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
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

好的,我将在这里做出一些假设,但假设您的设计模型上有这个函数:


设计.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 路线。


如果您始终希望在序列化为数组或 json时加载 slug 值,则可以将其添加到模型上受保护的 $appends 数组中。


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


或者,如果您有一系列设计,您也可以这样做$designs->each->append('slug')。


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


    @foreach ($design->posts as $post)

        <img src="{{ asset('storage/'.$post->postImage) }}">

    @endforeach


查看完整回答
反对 回复 2023-07-30
  • 1 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信