>  기사  >  백엔드 개발  >  Laravel에서 ID 폴백이 있는 슬러그

Laravel에서 ID 폴백이 있는 슬러그

PHPz
PHPz원래의
2024-07-31 02:35:12344검색

Slugs with an ID fallback in Laravel

원래 내 블로그 briandouglas.ie에 게시되었습니다

슬러그는 URL을 합법적인 것처럼 보이게 만듭니다. 아무도 https://mysite.com/blog/1과 같은 링크를 클릭하고 싶어하지 않습니다. 저걸 클릭하면 당연히 해킹당할 것 같아요. 하지만 https://mysite.com/blog/1/some-awesome-content라고 읽으면 어떻게 될까요? 이제는 믿을 만해 보입니다. 해당 링크를 클릭하면 정말 멋진 콘텐츠를 보게 될 것입니다.

나이브 웨이

그럼 어떻게 구현하나요? 블로그 리소스의 제목을 사용할 수 있습니다. Laravel은 문자열을 가져와 느리게 만드는 Str::slug 도우미를 제공합니다. My Awesome Blog Post가 my-awesome-blog-post가 된다는 의미입니다. 이것은 좋은 생각인 것 같습니다. 블로그 모델을 업데이트하여 저장 시 제목에 따라 슬러그 값을 설정하도록 하겠습니다.

use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    protected static function boot()
    {
        parent::boot();

        static::saving(function ($model) {
            if (empty($model->slug)) {
                $model->slug = Str::slug($model->title);
            }
        });
    }
}

이제 다음과 같이 리소스의 표시 경로를 구현할 수 있습니다.

public function show(string $slug)
{
    return Blog::withSlug($slug)->first();
}

멋지네요. 정말 완벽한 구현입니다.

그런데 제목을 업데이트하면?!?

제목이 업데이트되면 슬러그가 더 이상 내용과 일치하지 않을 수 있습니다.

심각하게는 슬러그도 업데이트될 수도 있습니다!

그러면 이전 URL이 404를 반환하여 삽입된 콘텐츠가 손상될 수 있습니다.

스마트한 방법

그렇습니다. 결국 완벽한 것은 아닙니다. 블로그 제목은 변경될 수 있습니다. 따라서 우리는 URL을 변경하는 것을 원하지 않기 때문에 URL을 기반으로 삼고 싶지 않습니다.

그렇다면 우리 블로그에서 변하지 말아야 할 것은 무엇입니까? 이드야. 이 기사의 시작 부분에서 우리는 보기 흉한 URL https://mysite.com/blog/1을 보여주었습니다. 이 못생긴 URL의 좋은 점은 변경되어서는 안 된다는 것입니다. 이 사이트를 방문하면 항상 ID 1의 블로그를 볼 수 있습니다. 단점은 설명이 없다는 것입니다. 그럼 블로그 제목을 기반으로 한 슬러그와 ID의 고유 식별자를 결합해 보겠습니다. 이렇게 하면 https://mysite.com/blog/1/my-awesome-content와 같은 URL을 얻게 됩니다. 여기서의 비결은 URL의 슬러그 부분이 단지 미학을 위한 것이라는 것입니다. 이는 사용자에게 ID 1의 블로그가 무엇에 관한 것인지에 대한 아이디어를 제공합니다. URL은 작동하지만 블로그를 가져오는 데만 ID를 사용하고 제목이 변경되면 업데이트된 슬러그로 리디렉션되도록 이를 Laravel에서 구현해 보겠습니다.

코드

위의 시나리오를 이렇게 달성할 수 있습니다. 먼저 경로 파일에서 다음 표시 경로를 지정합니다.

Route::get('blog/{blog}/{slug?}', [BlogController::class, 'show'])->name('blog.show');

이제 새로운 쇼 경로를 구성하는 도우미 메소드를 포함하도록 블로그 모델을 업데이트하겠습니다.

use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    public function showRoute(array $parameters = [])
    {
        return route('blog.show', [$this, Str::slug($this->title), ...$parameters]);
    }
}

마지막으로 BlogController의 표시 메소드에 다음을 추가합니다.

public function show(Request $request, Blog $blog)
{
    if (! Str::contains($blog->showRoute(), $request->path())) {
        return redirect($blog->showRoute($request->query()), status: 301);
    }

    return view('blog.show', compact('blog'));
}

위의 show 메소드에서 Laravel의 경로 모델 바인딩은 제공된 ID를 기반으로 올바른 블로그를 찾는 데 사용됩니다. 그런 다음 $request->path()가 showRoute()와 일치하는지 확인하기 위해 추가 검사를 추가합니다. 그렇지 않은 경우 301 Moved Permanently 상태로 올바른 showRoute()로 리디렉션하여 브라우저에 슬러그가 업데이트되었음을 ​​알립니다.

위 내용은 Laravel에서 ID 폴백이 있는 슬러그의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.