개발일기

Laravel - slug url 생성 본문

프로그래밍 언어/PHP - Laravel

Laravel - slug url 생성

Flashback 2022. 8. 20. 12:16
728x90
반응형

 

몇몇 웹사이트의 게시글을 확인하면 URL이 "/post/3" 또는 "/post/how%20to%20laravel"과 같은 형식으로 되어있는 사이트도 존재한다. URL에 PK(Primary Key)값이 포함되어져 있거나 공백이 %20으로 표현되어 URL이 쓸모없이 길어지게 되며, 해당 글이 무엇을 의미하는지 대략적으로 파악하기 힘들다. 이를 해결하기 위해 슬러그(slug) 방식을 적용한 사이트를 종종 찾아 볼 수 있다. 슬러그 방식이란 URL이 "https://www.msn.com/뉴스-기사-입니다" 와 같이 공백부분이 -(dash) 기호로 이어져 URL이 표시되는 방식을 의미한다.

슬러그 방식으로 URL을 구성할 경우, 사용자가 해당 포스트 또는 해당 내용을 가진 링크가 무슨 내용을 내포하고 있는지 직관적으로 알아낼 수 있다. 또한 검색 엔진 최적화(Search Engine Optimization)이 이루어져 해당 포스팅이 상위 노출되는 효과를 누릴 수 있다. 구글과 네이버 등의 포탈 사이트는 URL에 키워드가 포함되어 있을 경우, 검색엔진에서 해당 페이지를 빠르게 찾아주고, 노출이 잘 될 수 있도록 상위로 올려놓기 때문에 슬러그 방식은 SEO에 유용하게 사용된다.

 

1. slug url 생성

use Illuminate\Support\Str;

public function slugTest() {
	$slug = Str::slug("test laravel framework", "-");
	// 첫번째 파라미터에는 URL값
	// 두번째 파라미터는 공백을 대체할 값을 입력
}

URL에 표시할 내용을 첫번째 파라미터에 대입하고, 두번째는 공백으로 대체하여 slug 형식으로 만들 문자를 대입한다.

위와 같이 입력 후, $slug값을 호출하면 test-laravel-framework라는 문자열로 슬러그가 생성된다.

단, Str::slug는 문자열이 영어일때만 정상적으로 작동한다. 만약 한글을 넣을 경우 빈 공백이 출력된다.

 

use Illuminate\Support\Str;

public function slugTest() {
	$slug = Str::slug("테스트 라라벨 프레임워크", "-");
	dd($slug);
	// 한글을 대입할 경우, 공백이 출력되는 것을 확인할 수 있다.
}

 

 

2. 한글 slug url 생성

use Illuminate\Support\Str;

public function slugTest() {
	$slug = preg_replace("/\s+/", "-", "테스트 라라벨 프레임워크");
	dd($slug); // 테스트-라라벨-프레임워크
}

preg_replace과 정규식을 활용하여 공백이 있을 경우 -(dash)로 변경하여 slug를 생성하였다. 정규식을 활용하면 한국어 외의 다른 언어로도 slug를 생성할 수 있다.

 

use Illuminate\Support\Str;

public function slugTest() {
	$slug = preg_replace("/\s+/", "-", "中 國 語");
	dd($slug); // 中-國-語
}
// 한자를 사용하여 slug를 생성한 경우

 

3. slug 변경시 링크 유지

"/post/test-frame"로 URL slug를 생성하였지만, 타이틀에 추가할 내용이 있어 "post/test-laravel-framework"와 같이 URL slug를 변경해야 할 경우가 종종 발생한다. URL slug를 변경하게 될 경우, 기존에 공유된 URL은 올바른 페이지를 찾아내지 못해 404에러가 발생할 가능성이 매우 높다. 이러한 만일의 상황을 방지하기 위해 URL slug 앞부분에 pk값을 추가하면, 기존 방식과 동일하게 slug가 생성되는 것은 물론 404에러도 방지할 수 있다.

 

// web.php
Route::get('/{id}_{slug}', 'MyController@myFunction');

라우트를 생성할 때, URL 앞 부분에 pk값을 추가한 후, 뒤에 slug를 추가하면 된다.

내용을 조회할 때는 앞 부분의 id값을 사용하여 조회하고, 뒷 부분의 slug는 사용자 친화적 URL을 위해 추가하면 에러 상황 방지와 검색 엔진 최적화를 둘다 이뤄낼 수 있다.

 

// MyController.php
use Illuminate\Http\Request;

public fucntion myFunction(Request $request) {
	$id = $request->id;
}

컨트롤러 부분에서 Request $request를 통해 URL의 파라미터 값을 가져올 수 있다.

 

4. slug 중복 방지

slug를 생성하고 수정하다보면 같은 이름을 가진 slug가 생성되어 원치않는 결과를 보여주는 페이지로 이동할 수 있다. 가장 근본적인 방법은 DB에서 해당 slug 타이틀 부분은 unique로 설정하는 것이 가장 좋은 방법이다. 하지만 이를 실행할 수 없는 경우, 중복된 slug 내용이 존재할 때 slug 뒷부분에 카운트로 숫자를 하나 하나씩 더해가는 방법이 있다.

"test-laravel-framework"  "test-laravel-framework-1"  "test-laravel-framework-2" 방식으로 중복을 방지할 수 있다.

 

use Illuminate\Support\Str;
use Illuminate\Http\Request;

public function testFunction(Request $request) {

	$slug = "test laravel framework"; // slug 형식으로 변경할 문자열

	$slugCount = TestModel::where([
		['title', 'LIKE', '%'.$slug.'%']
	])->get()->count(); // 중복된 slug 개수 파악

	$slug = Str::slug($slug, "-"); // slug 생성
	$slug = $slug."-".$slugCount; // 뒷 부분에 count 추가하여 중복 방지
}

해당 내용을 가져오는 모델에서 중복된 slug 수를 파악한 후, slug 형식 뒤에 카운트를 추가하면 중복을 방지할 수 있다.

 


참고 사이트 : 

 

https://laravel.com/docs/9.x/helpers

 

Laravel - The PHP Framework For Web Artisans

Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small things.

laravel.com

 

https://laravelrocks.com/tricks/38-permanent-slug-url

 

제목이 변경돼도 이전 링크로 블로그 | laravelrocks.com

Laravel로 블로그 시스템을 만들었다고 하자. 보통 블로그 글 URL은 Str::slug 메서드를 사용해서 만들게 된다. $url =...

laravelrocks.com

 

https://stackoverflow.com/questions/30582600/laravel-generate-slug-before-save

 

Laravel generate slug before save

Im trying to learn laravel 5 with help of this wondefull website. For my activity model I want to generate slugs before I save one to my database so I've created the following model. <?php names...

stackoverflow.com

 

728x90
반응형
Comments