Laravel 5.4 Eloquent Sluggable Kullanımı

Laravel 5.4 ile Eloquent Sluggable paketininin kullanımını inceleyeceğiz. Eloquent Sluggable, bizlere “SEO” dostu link yapısı oluşturmaktadır.

Öncelikle Laravel kurulumumuzu gerçekleştirelim. “Laravel” yazısını gördükten sonra Eloquent Sluggable kullanımına geçebiliriz. Makalede döküman olarak GitHub adresini kullancağım. Sizler de GitHub adresinden Eloquent Sluggable kullanımına dair çok daha fazla bilgiyi edinebilir, projelerinizde kullanabilirsiniz.

Eloquent Sluggable

Laravel‘in kurulu olduğu dizine eriştikten sonra uçbirimde

composer require cviebrock/eloquent-sluggable

komutunu çalıştıralım. Ve hemen ardından config/app.php dosyamızı güncelleyelim.

'providers' => [
// ...
Cviebrock\EloquentSluggable\ServiceProvider::class,
];

Son olarak; tekrar uçbirimde Laravel’in kurulu olduğu dizinde aşağıda yer alan komutu çalıştıralım.

php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider"

Buna benzer bir çıktı aldıysanız kurulumu başarıyla tamamlamışsınız demektir.

Copied File [/vendor/cviebrock/eloquent-sluggable/resources/config/sluggable.php] To [/config/sluggable.php]
Publishing complete.

Modelimizi Güncelleyelim

Modelimizi güncellememiz gerekmektedir. Tabii bunun için öncelikle bir model dosyasına ihtiyacımız var. Uçbirimde, Laravel‘in kurulu olduğu dizinde aşağıdaki komutu çalıştıralım.

php artisan make:model Article -m

Sonundaki -m parametresi aynı zamanda ismini Article olarak tanımladığımız model dosyasına ait bir “Migrate” dosyası da oluşturmaktadır.

Model created successfully.
Created Migration: 2017_05_01_224056_create_articles_table

Buna benzer bi çıktı aldıysak başarılı bir şekilde model ve migrate dosyalarımız oluşmuş demektir.

Laravel dizinimizde bulunan App klasöründe “Article” isminde model dosyamızın başarılı bir şekilde oluşturulduğunu görüyoruz ve dosyanın en üstüne; namespace App;  satırının hemen altına şu kodu ekliyoruz:

use Cviebrock\EloquentSluggable\Sluggable;

Model dosyamızın devamını ise aşağıda gösterildiği şekilde güncelliyoruz.

class Article extends Model
{
use Sluggable;
protected $table = "articles";
protected $fillable = [
'title' , 'body'
];
public function sluggable()
{
return [
'slug' => [
'source' => 'title'
]
];
}
}

Buradaki değerlerin anlamlarını irdelemek ve konfigüre etmek için yukarıda paylaştığım pakete ait GitHub bağlantısını inceleyebilirsiniz. Burada title  alanını döndürmesini sağladık.

Migrate

Model dosyamızı oluşturken aynı zamanda migrate dosyamızı da oluşturmuştuk. Şimdi içerisinde ufak bir güncelleme yapalım.

    public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->string('slug');
$table->text('body');
$table->timestamps();
});
}

Burada slug  olarak tanımladığım alanıma kullanacağımız bağlantı adresimiz eklenecektir. Tabii ki title  alanını referans almak şartı ile.

Tablomuzu veritabanına tanımlamadan önce pek tabii bir veritbanımızın olması gerekmekte ve bunu Laravel‘e bildirmek durumundayız.

Laravel ana diziminizde bulunan .env dosyasını açalım ve ilgili kısımları aşağıdaki gibi düzenleyelim. Ben slug  isminde bir veritabanı oluşturdum.

Benim kullanıcı ismim root ve parolam bulunmamakta. Siz kendinize göre düzenlemeyi unutmayın!

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=slug
DB_USERNAME=root
DB_PASSWORD=

Bu ayarlarımı kaydettikten sonra Laravel dizinimizde açtığımız uçbirimde aşağıdaki komutu çalıştırarak config  ayarlarımızı güncelleyelim.

php artisan config:cache
php artisan config:clear

Şimdi veritabanımıza tablolarımızı ekleyebiliriz.

php artisan migrate

Ben bu komutu çalıştırdığımda Laravel 5.4 ile bir hata aldım. Siz almadı iseniz devam edin. Benim aldığım hata şu şekilde:

  [Illuminate\Database\QueryException]                                                                                 
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQ  
L: alter table `users` add unique `users_email_unique`(`email`))  
[PDOException]                                                                                                   
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

Çözüm olarak, AppServiceProvider.php dosyamızın en üstüne aşağıdaki kodu ekleyelim.

use Illuminate\Support\Facades\Schema;

Ve devamında;

 public function boot()
{
Schema::defaultStringLength(191);
}

Dosyamızda bulunan boot  fonksiyonunu güncelleyelim. Tekrar deniyorum.

php artisan migrate

Eğer aşağıdakine benzer bir çıktı aldıysanız tablolarınız başarılı bir şekilde eklenmiş demektir.

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2017_05_01_224056_create_articles_table
Migrated:  2017_05_01_224056_create_articles_table


Laravel 5.4 Türkçe Karakter Sorunu

1. Yöntem:

Laravel 5.4 sürümünde str_slug ‘ta karakter hatası mevcut. Şöyle ki;

‘ö’ harfimiz ‘oe’, ‘ü’ harfimiz ise ‘ue’ şeklinde çıkmaktadır. Bunu düzeltmek için sluggable.php dosyamızda kırk yedinci satırda güncelleme yapalım.

'method' => function( $string, $sep  ) {
return strtolower(str_replace(['ü', 'Ü', 'ö', 'Ö',' '], ['u', 'u', 'o', 'o','-'], $string));
},

2. Yöntem:

Laravel‘de karakter setleri üzerine Slugify paketini kullanabiliriz.

composer require cocur/slugify

Model dosyamızı açalım.

use Cocur\Slugify\Slugify;

Yukarıdaki satırı tanımladıktan sonra model dosyamıza aşağıdaki satırları ekleyelim.

public function customizeSlugEngine(Slugify $engine, $attribute) {
return $engine->activateRuleset('turkish');
}

Hangi yöntemi kullanacağınız size kalmış.

Slugify GitHub ve bu sorun üzerine gelişmeleri buradan takip edebilirsiniz.

Test Edelim

Laravel dizinimizde açtığımız uçbirimde php artisan tinker  komutunu çalıştıralım ve sırası ile aşağıdaki komutları takip edelim.

namespace App;
$article = new Article
$article->title ="Merhaba Selam naber?"
$article->body = "Sana da selam Body"
$article->save()
Article::all()

Article::all() komutumuzun çıktısı aşağıdakine benzer olacaktır.

 Illuminate\Database\Eloquent\Collection {#661
all: [
App\Article {#665
id: 1,
title: "Merhaba Selam naber?",
slug: "merhaba-selam-naber",
body: "Sana da selam Body",
created_at: "2017-05-01 23:58:59",
updated_at: "2017-05-01 23:58:59",
},
],
}

Görüldüğü üzere; slug  alanımız title  alanını referans alarak bizlere SEO dostu bir link oluşturdu.

 

Herkese iyi çalışmalar.

 

1 thought on “Laravel 5.4 Eloquent Sluggable Kullanımı

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir