แพ็คเกจนี้มีคุณสมบัติที่จะสร้างทากที่ไม่ซ้ำใครเมื่อบันทึกโมเดล 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) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม