توفر هذه الحزمة سمة من شأنها إنشاء سبيكة فريدة عند حفظ أي نموذج 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؛class YourEloquentModel يوسع النموذج {use HasSlug;/** * احصل على خيارات إنشاء البزاق. */الوظيفة العامة getSlugOptions() : SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->saveSlugsTo('slug'); } }
مع هجرتها:
استخدام IlluminateDatabaseMigrationsMigration;استخدام IlluminateDatabaseSchemaBlueprint;استخدام IlluminateSupportFacadesSchema;فئة CreateYourEloquentModelTable لتمديد الترحيل {وظيفة عامة تصل () { Schema::create('your_eloquent_models', function (Blueprint $table) {$table->increments('id');$table->string('slug'); // اسم الحقل هو نفس اسم `saveSlugsTo`$table ->string('name');$table->timestamps(); }); } }
لاستخدام الارتباط التقريبي الذي تم إنشاؤه في المسارات، تذكر استخدام رابط نموذج المسار الضمني الخاص بـ Laravel:
تطبيق مساحة الاسم؛استخدام SpatieSluggableHasSlug؛استخدام SpatieSluggableSlugOptions؛استخدام IlluminateDatabaseEloquentModel؛class YourEloquentModel يمتد النموذج {use HasSlug;/** * احصل على خيارات إنشاء البزاق. */الوظيفة العامة getSlugOptions() : SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->saveSlugsTo('slug'); }/** * احصل على مفتاح المسار للنموذج. * * @return string */ الوظيفة العامة getRouteKeyName () {عودة "سبيكة"؛ } }
هل تريد استخدام حقول متعددة كأساس للارتداد؟ لا مشكلة!
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء SlugsFrom(['الاسم_الأول'، 'الاسم_الأخير']) ->saveSlugsTo('slug'); }
يمكنك أيضًا تمرير كائن callable
إلى generateSlugsFrom
.
افتراضيًا، ستقوم الحزمة بإنشاء ارتباطات ثابتة فريدة من خلال إلحاق "-" ورقم إلى ارتباط ثابت موجود بالفعل.
يمكنك تعطيل هذا السلوك عن طريق استدعاء allowDuplicateSlugs
.
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->allowDuplicateSlugs(); }
يمكنك أيضًا وضع حد أقصى لحجم الارتباط الذي تم إنشاؤه:
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->slugsShouldBeNoLongerThan(50); }
قد تكون السلسلة الثابتة أطول قليلاً من القيمة المحددة، وذلك بسبب اللاحقة التي تمت إضافتها لجعلها فريدة.
يمكنك أيضًا استخدام فاصل مخصص عن طريق الاتصال usingSeparator
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->usingSeparator('_'); }
لتعيين اللغة المستخدمة بواسطة Str::slug
يمكنك الاتصال usingLanguage
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->usingLanguage('nl'); }
يمكنك أيضًا تجاوز الزيادة الثابتة التي تم إنشاؤها فقط عن طريق تعيينها على قيمة أخرى غير تلك التي تم إنشاؤها.
$model = EloquentModel::create(['name' => 'my name']); // slug أصبح الآن "my-name";$model->slug = 'my-custom-url';$model->save(); // slug أصبح الآن "my-custom-url";
إذا كنت لا ترغب في إنشاء سبيكة ثابتة عندما يكون للنموذج حالة، فيمكنك استخدام وظيفة skipGenerateWhen
.
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->skipGenerateWhen(fn () => $this->state === 'مسودة'); }
إذا كنت لا ترغب في إنشاء سبيكة ثابتة عند إنشاء النموذج في البداية، فيمكنك ضبط استخدام وظيفة doNotGenerateSlugsOnCreate()
.
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->doNotGenerateSlugsOnCreate(); }
وبالمثل، إذا كنت تريد منع تحديث الحزمة الثابتة في تحديثات النموذج، فاتصل بـ doNotGenerateSlugsOnUpdate()
.
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->doNotGenerateSlugsOnUpdate(); }
يمكن أن يكون هذا مفيدًا لإنشاء روابط دائمة لا تتغير إلا إذا أردت ذلك صراحةً.
$model = EloquentModel::create(['name' => 'my name']); // slug أصبح الآن "my-name";$model->save();$model->name = 'changed name';$model->save(); // سبيكة تبقى "اسمي"
إذا كنت تريد تحديث الارتباط الثابت بشكل صريح في النموذج، فيمكنك استدعاء generateSlug()
على النموذج الخاص بك في أي وقت لإنشاء الارتباط الثابت وفقًا لخياراتك الأخرى. لا تنس save()
النموذج لمواصلة التحديث لقاعدة البيانات الخاصة بك.
يمكنك منع الكتابة فوق البزاقات.
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->preventOverwrite(); }
إذا كان لديك نطاقًا عالميًا ينبغي أخذه في الاعتبار، فيمكنك تحديد ذلك أيضًا باستخدام extraScope
. على سبيل المثال، إذا كان لديك جدول صفحات يحتوي على صفحات من مواقع ويب متعددة وكل موقع ويب له ارتباطات ثابتة فريدة خاصة به.
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
بشكل افتراضي، يبدأ فهرس اللاحقة من 1، ويمكنك تعيين رقم البداية.
الوظيفة العامة getSlugOptions(): SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->حفظ SlugsTo('سبيكة') ->startSlugSuffixFrom(2); }
يمكنك استخدام هذه الحزمة مع laravel-translatable لإنشاء سبيكة ثابتة لكل لغة. بدلاً من استخدام سمة HasSlug
، يجب عليك استخدام سمة HasTranslatableSlug
، وإضافة اسم حقل الارتفاع الثابت إلى المصفوفة $translatable
. بالنسبة للارتباطات الثابتة التي يتم إنشاؤها من حقل واحد أو حقول متعددة، لا يتعين عليك تغيير أي شيء آخر.
تطبيق مساحة الاسم؛استخدام SpatieSluggableHasTranslatableSlug؛استخدام SpatieSluggableSlugOptions؛استخدام SpatieTranslatableHasTranslations؛استخدام IlluminateDatabaseEloquentModel؛class YourEloquentModel يوسع النموذج {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * احصل على خيارات إنشاء الارتباط الارتباطي. */الوظيفة العامة getSlugOptions() : SlugOptions{return SlugOptions::create() ->إنشاء SlugsFrom('الاسم') ->saveSlugsTo('slug'); } }
بالنسبة للارتباطات الثابتة التي تم إنشاؤها من كائن قابل للاستدعاء، تحتاج إلى إنشاء مثيل SlugOptions
باستخدام الأسلوب createWithLocales
. يأخذ القابل للاستدعاء الآن وسيطتين بدلاً من واحدة. يتوفر كل من $model
واللغة $locale
لإنشاء سبيكة ثابتة منها.
تطبيق مساحة الاسم؛استخدام SpatieSluggableHasTranslatableSlug؛استخدام SpatieSluggableSlugOptions؛استخدام SpatieTranslatableHasTranslations؛استخدام IlluminateDatabaseEloquentModel؛class YourEloquentModel يوسع النموذج {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * احصل على خيارات إنشاء الارتباط الارتباطي. */ الوظيفة العامة getSlugOptions() : SlugOptions{return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($model, $locale) {return "{$locale} {$model->id}"; }) ->saveSlugsTo('slug'); } }
يمكنك أيضًا استخدام ربط نموذج المسار الضمني Laravels داخل وحدة التحكم الخاصة بك لحل النموذج تلقائيًا. لاستخدام هذه الميزة، تأكد من أن عمود الارتفاع يتطابق مع routeNameKey
.
في الوقت الحالي، تدعم بعض أنواع قواعد البيانات فقط عمليات JSON. يمكن العثور على مزيد من المعلومات حول قواعد البيانات التي تدعم JSON في مستندات Laravel.
تطبيق مساحة الاسم؛استخدام SpatieSluggableHasSlug؛استخدام SpatieSluggableSlugOptions؛استخدام IlluminateDatabaseEloquentModel؛class YourEloquentModel يوسع النموذج {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * احصل على خيارات إنشاء الارتباط الارتباطي. */الوظيفة العامة getSlugOptions() : SlugOptions{return SlugOptions::create() ->إنشاء سلوجس فروم ('الاسم') ->saveSlugsTo('slug'); }/** * احصل على مفتاح المسار للنموذج. * * @return string */ الوظيفة العامة getRouteKeyName () {عودة "سبيكة"؛ } }
للراحة، يمكنك استخدام الاسم المستعار findBySlug
لاسترداد نموذج. سيتم مقارنة الاستعلام مع الحقل الذي تم تمريره إلى saveSlugsTo
عند تحديد SlugOptions
.
$model = Article::findBySlug('my-article');
يقبل findBySlug
أيضًا المعامل الثاني $columns
تمامًا مثل طريقة find
الافتراضية في Eloquent.
الرجاء مراجعة سجل التغيير لمزيد من المعلومات عما تغير مؤخرًا.
اختبار الملحن
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
إذا وجدت خطأً يتعلق بالأمان، فيرجى إرسال بريد إلكتروني إلى العنوان [email protected] بدلاً من استخدام أداة تعقب المشكلات.
فريك فان دير هيرتن
جميع المساهمين
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.