изменить соглашение об именах URL - PullRequest
0 голосов
/ 13 июля 2020

Я хочу изменить соглашение об именах следующего URL-адреса:

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';
    }

When I dd (slug); вывод - 'Laravel 5 Framework', но я хочу, чтобы он был designName

1 Ответ

0 голосов
/ 13 июля 2020

Хорошо, поэтому я собираюсь сделать здесь некоторые предположения, но допустим, у вас есть эта функция в вашей модели Design:

Design. 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

Это перечислит все ваших дизайнов по имени, связанных с маршрутом designs.show их слагом.

Если вы всегда хотите, чтобы значение слага загружалось при сериализации в массив или json, вы можете добавить его в защищенный массив $ appends модели.

Если вы не ВСЕГДА хотите, чтобы он добавлялся, вам нужно добавить его во время выполнения, например, $design->append('slug').

Или, если у вас есть коллекция дизайнов, вы можете сделать $designs->each->append('slug').

Теперь в вашем файле клинка designs.show вы можете получить доступ к сообщениям дизайна, используя отношение, которое мы загрузили с помощью Design :: with ('posts '), выполнив следующие действия:

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