แพ็คเกจนี้มีคุณสมบัติที่จะสร้างทากที่ไม่ซ้ำใครเมื่อบันทึกโมเดล Eloquent ใด ๆ
$model = new EloquentModel();$model->name = 'activerecord ยอดเยี่ยมมาก';$model->save();echo $model->slug; // เอาต์พุต "activerecord-is-awesome"
ทากถูกสร้างขึ้นด้วยวิธี Laravels Str::slug
โดยที่ช่องว่างจะถูกแปลงเป็น '-'
Spatie เป็นเอเจนซี่ออกแบบเว็บไซต์ที่ตั้งอยู่ในเมืองแอนต์เวิร์ป ประเทศเบลเยียม คุณจะพบภาพรวมของโครงการโอเพ่นซอร์สทั้งหมดของเราบนเว็บไซต์ของเรา
เราลงทุนทรัพยากรจำนวนมากเพื่อสร้างแพ็คเกจโอเพ่นซอร์สที่ดีที่สุดในระดับเดียวกัน คุณสามารถสนับสนุนเราได้โดยการซื้อหนึ่งในผลิตภัณฑ์ที่ต้องชำระเงินของเรา
เราขอขอบคุณอย่างยิ่งที่คุณส่งโปสการ์ดจากบ้านเกิดของคุณถึงเรา โดยระบุว่าคุณใช้แพ็คเกจใดของเรา คุณจะพบที่อยู่ของเราในหน้าติดต่อของเรา เราเผยแพร่โปสการ์ดที่ได้รับทั้งหมดบนวอลล์โปสการ์ดเสมือนของเรา
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
ผู้แต่งต้องการ spatie/laravel-sluggable
โมเดล Eloquent ของคุณควรใช้คุณลักษณะ SpatieSluggableHasSlug
และคลาส SpatieSluggableSlugOptions
คุณลักษณะนี้มีเมธอดนามธรรม getSlugOptions()
ที่คุณต้องนำไปใช้เอง
การโยกย้ายโมเดลของคุณควรมีช่องสำหรับบันทึกทากที่สร้างขึ้น
นี่คือตัวอย่างวิธีการใช้ลักษณะนี้:
แอปเนมสเปซ; ใช้ SpatieSluggableHasSlug; ใช้ SpatieSluggableSlugOptions; ใช้ IlluminateDatabaseEloquentModel; คลาส YourEloquentModel ขยายโมเดล {use HasSlug;/** * รับตัวเลือกสำหรับการสร้างทาก */ฟังก์ชันสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('กระสุน'); - -
ด้วยการโยกย้าย:
ใช้ IlluminateDatabaseMigrationsMigration; ใช้ IlluminateDatabaseSchemaBlueprint; ใช้ IlluminateSupportFacadesSchema; คลาส CreateYourEloquentModelTable ขยายการย้ายข้อมูล {ฟังก์ชั่นสาธารณะขึ้น() - Schema::create('your_eloquent_models', function (Blueprint $table) {$table->increas('id');$table->string('slug'); // ชื่อฟิลด์เหมือนกับ `saveSlugsTo`$table ของคุณ ->string('name');$table->timestamps(); - - -
หากต้องการใช้ทากที่สร้างขึ้นในเส้นทาง อย่าลืมใช้การเชื่อมโยงโมเดลเส้นทางโดยนัยของ Laravel:
แอปเนมสเปซ; ใช้ SpatieSluggableHasSlug; ใช้ SpatieSluggableSlugOptions; ใช้ IlluminateDatabaseEloquentModel; คลาส YourEloquentModel ขยายโมเดล {use HasSlug;/** * รับตัวเลือกสำหรับการสร้างทาก */ฟังก์ชันสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('กระสุน'); }/** * รับรหัสเส้นทางสำหรับรุ่น * * @return string */ฟังก์ชันสาธารณะ getRouteKeyName() {กลับมา 'ทาก'; - -
ต้องการใช้หลายฟิลด์เป็นพื้นฐานสำหรับทากหรือไม่? ไม่มีปัญหา!
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom (['first_name', 'last_name']) ->saveSlugsTo('กระสุน'); -
คุณยังสามารถส่งผ่าน callable
ไปยัง generateSlugsFrom
ได้
ตามค่าเริ่มต้น แพ็คเกจจะสร้างทากที่ไม่ซ้ำกันโดยการต่อท้าย '-' และตัวเลข ต่อท้ายทากที่มีอยู่แล้ว
คุณสามารถปิดการทำงานนี้ได้โดยการเรียก allowDuplicateSlugs
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') ->allowDuplicateSlugs(); -
คุณยังสามารถกำหนดขนาดสูงสุดให้กับทากที่สร้างขึ้นได้:
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') -> ทากควรไม่มีอีกต่อไปกว่า (50); -
ทากอาจยาวกว่าค่าที่ระบุเล็กน้อย เนื่องจากมีการเพิ่มส่วนต่อท้ายเพื่อทำให้ไม่ซ้ำกัน
คุณยังสามารถใช้ตัวคั่นแบบกำหนดเองได้โดยการเรียก usingSeparator
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') ->ใช้ตัวคั่น('_'); -
หากต้องการตั้งค่าภาษาที่ใช้โดย Str::slug
คุณสามารถเรียก usingLanguage
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') ->การใช้ภาษา('nl'); -
คุณยังสามารถแทนที่ทากที่สร้างขึ้นได้โดยการตั้งค่าเป็นค่าอื่นที่ไม่ใช่ทากที่สร้างขึ้น
$model = EloquentModel::create(['name' => 'ชื่อของฉัน']); // slug ตอนนี้เป็น "my-name";$model->slug = 'my-custom-url';$model->save(); // slug ตอนนี้เป็น "my-custom-url";
หากคุณไม่ต้องการสร้างตัวบุ้งเมื่อโมเดลมีสถานะ คุณสามารถใช้ฟังก์ชัน skipGenerateWhen
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') ->skipGenerateWhen(fn () => $this->state === 'ร่าง'); -
หากคุณไม่ต้องการสร้างกระสุนเมื่อสร้างโมเดลครั้งแรก คุณสามารถตั้งค่าให้ใช้ฟังก์ชัน doNotGenerateSlugsOnCreate()
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') -> doNotGenerateSlugsOnCreate (); -
ในทำนองเดียวกัน หากคุณต้องการป้องกันไม่ให้ Slug ได้รับการอัพเดตในการอัปเดตโมเดล ให้โทร doNotGenerateSlugsOnUpdate()
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') ->doNotGenerateSlugsOnUpdate(); -
สิ่งนี้มีประโยชน์สำหรับการสร้างลิงก์ถาวรที่ไม่เปลี่ยนแปลงจนกว่าคุณจะต้องการอย่างชัดเจน
$model = EloquentModel::create(['name' => 'ชื่อของฉัน']); // slug ตอนนี้เป็น "my-name";$model->save();$model->name = 'changed name';$model->save(); // ทากยังคง "ชื่อของฉัน"
หากคุณต้องการอัปเดตทากบนโมเดลอย่างชัดเจน คุณสามารถเรียก generateSlug()
บนโมเดลของคุณได้ตลอดเวลาเพื่อสร้างทากตามตัวเลือกอื่นๆ ของคุณ อย่าลืม save()
โมเดลเพื่อคงการอัปเดตฐานข้อมูลของคุณ
คุณสามารถป้องกันไม่ให้ทากถูกเขียนทับได้
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') ->ป้องกันเขียนทับ(); -
หากคุณมีขอบเขตทั่วโลกที่ควรนำมาพิจารณา คุณสามารถกำหนดขอบเขตนี้ได้เช่นกันด้วย extraScope
ตัวอย่างเช่น หากคุณมีตารางหน้าที่มีหน้าของหลายเว็บไซต์ และทุกเว็บไซต์ก็มีทากเฉพาะของตัวเอง
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); -
ตามค่าเริ่มต้น ดัชนีส่วนต่อท้ายเริ่มต้นจาก 1 คุณสามารถตั้งค่าหมายเลขเริ่มต้นได้
ฟังก์ชั่นสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('บุ้ง') ->startSlugSuffixFrom(2); -
คุณสามารถใช้แพ็คเกจนี้พร้อมกับ laravel-translatable เพื่อสร้างทากสำหรับแต่ละโลแคล แทนที่จะใช้ลักษณะ HasSlug
คุณต้องใช้ลักษณะ HasTranslatableSlug
และเพิ่มชื่อของฟิลด์ slug ลงในอาร์เรย์ $translatable
สำหรับทากที่สร้างจากช่องเดียว หรือ หลายช่อง คุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรอีก
แอปเนมสเปซ; ใช้ SpatieSluggableHasTranslatableSlug; ใช้ SpatieSluggableSlugOptions; ใช้ SpatieTranslatableHasTranslations; ใช้ IlluminateDatabaseEloquentModel; คลาส YourEloquentModel ขยายโมเดล {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * รับตัวเลือกสำหรับการสร้าง slug */ฟังก์ชันสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('กระสุน'); - -
สำหรับทากที่สร้างขึ้นจาก callable คุณจะต้องสร้างอินสแตนซ์ SlugOptions
ด้วยเมธอด createWithLocales
ตอนนี้ callable รับสองข้อโต้แย้งแทนที่จะเป็นหนึ่งข้อ ทั้ง $model
และ $locale
พร้อมใช้งานเพื่อสร้างกระสุน
แอปเนมสเปซ; ใช้ SpatieSluggableHasTranslatableSlug; ใช้ SpatieSluggableSlugOptions; ใช้ SpatieTranslatableHasTranslations; ใช้ IlluminateDatabaseEloquentModel; คลาส YourEloquentModel ขยายโมเดล {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * รับตัวเลือกสำหรับการสร้าง slug */ฟังก์ชันสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($model, $locale) {return "{$locale} {$model->id}"; - ->saveSlugsTo('กระสุน'); - -
คุณยังสามารถใช้การเชื่อมโยงโมเดลเส้นทางโดยนัยของ Laravels ภายในคอนโทรลเลอร์ของคุณเพื่อแก้ไขโมเดลโดยอัตโนมัติ หากต้องการใช้คุณลักษณะนี้ ตรวจสอบให้แน่ใจว่าคอลัมน์กระสุนตรงกับ routeNameKey
ปัจจุบันมีเพียงฐานข้อมูลบางประเภทเท่านั้นที่รองรับการดำเนินการ JSON ข้อมูลเพิ่มเติมเกี่ยวกับฐานข้อมูลที่รองรับ JSON สามารถพบได้ในเอกสาร Laravel
แอปเนมสเปซ; ใช้ SpatieSluggableHasSlug; ใช้ SpatieSluggableSlugOptions; ใช้ IlluminateDatabaseEloquentModel; คลาส YourEloquentModel ขยายโมเดล {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * รับตัวเลือกสำหรับการสร้าง slug */ฟังก์ชันสาธารณะ getSlugOptions() : SlugOptions{return SlugOptions::create() -> สร้าง SlugsFrom ('ชื่อ') ->saveSlugsTo('กระสุน'); }/** * รับรหัสเส้นทางสำหรับรุ่น * * @return string */ฟังก์ชันสาธารณะ getRouteKeyName() {กลับมา 'ทาก'; - -
เพื่อความสะดวก คุณสามารถใช้นามแฝง findBySlug
เพื่อดึงโมเดลได้ แบบสอบถามจะเปรียบเทียบกับฟิลด์ที่ส่งไปยัง saveSlugsTo
เมื่อกำหนด SlugOptions
$model = Article::findBySlug('my-article');
findBySlug
ยังยอมรับพารามิเตอร์ที่สอง $columns
เช่นเดียวกับวิธี find
Eloquent เริ่มต้น
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมว่ามีอะไรเปลี่ยนแปลงเมื่อเร็วๆ นี้
การทดสอบผู้แต่ง
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
หากคุณพบข้อบกพร่องเกี่ยวกับการรักษาความปลอดภัย โปรดส่งอีเมลไปที่ [email protected] แทนการใช้ตัวติดตามปัญหา
ฟรีค ฟาน เดอร์ แฮร์เทน
ผู้ร่วมให้ข้อมูลทั้งหมด
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม