معرفی پکیج sluggable برای لاراول

( لاراول ۵.۴ )

برای هر محتوا یا بخشی از پروژه لاراول قطعا یکی از بخش های مهم لینک همان بخش است که جنریت می شود تا لینک درست و مناسبی تولید شود، برای مثال همین مقاله ای که الان مشاهده میکنید اگر دقت کنید بین کلماتی که فاصله وجود دارد خط تیره گذاشته میشود تا لینک خواناتر و قابل فهم تر باشد.

برای مثال به جای اینکه لینک به صورت زیر باشد :

http://example.com/post/My+Dinner+With+Andr%C3%A9+%26+Fran%C3%A7ois

به صورت زیر نمایش داده می شود :

http://example.com/post/my-dinner-with-andre-francois

برای مدیریت این موضوع در لاراول پکیج های مختلفی تولید شده اند که بهترینشون تا به امروز پکیج Eloquent-Sluggable است که خیلی عالی لینک ها رو مدیریت و تولید میکنه.

برای نصب کافیه وارد مسیر پروژه بشید و به صورت زیر اقدام نمائید :

قدم اول : نصب پکیج با استفاده از کامپوزر :

 composer require cviebrock/eloquent-sluggable

قدم دوم : وارد فایل config/app.php میشیم و کد زیر را به providers اضافه میکنیم :

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

قدم سوم : کد زیر را داخل ترمینال اجرا میکنیم :

php artisan vendor:publish

با اجرای این کد، فایلهایی که مورد نیاز است داخل پروژه قرار داده می شوند که مهمترینشون فایل sluggable.php داخل فولدر config است که میتوان تنظیمات slug را تغییر داد.

قدم چهارم :  وارد فایل مدل می شویم و پکیج را use میکنیم و کد زیر را بهش اضافه میکنیم :

use Cviebrock\EloquentSluggable\Sluggable;
    use Sluggable;

    /**
     * Return the sluggable configuration array for this model.
     *
     * @return array
     */
    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }

تا به اینجای کار پکیج نصب شده و قابل استفاده ست فقط باید دقت کنیم که فیلدی که داخل دیتابیس داریم باید هم اسم فیلدی باشد که با استفاده از پکیج لینک جنریت میشود و داخل آن ذخیره می شود (slug).

اگر بخواهیم بگیم چطور قابل استفاده است با کد نمونه زیر در زمانی که پست ایجاد میشود قابل درک است :

$post = new Post([
    'title' => 'My Awesome Blog Post',
]);

$post->save();
// $post->slug is "my-awesome-blog-post"

اگر احیانا مقاله جدیدی با لینک یکی از مقالات یکی باشد اعدادی را به ترتیب به آخر لینک اضافه میکند و در واقع مقدار slug یونیک است.
$newPost = $post->replicate();
// $newPost->slug is "my-awesome-blog-post-1"

برای اینکه بخواهیم یکسری تغییرات دیگه ایجاد کنیم و یا تنظیمات بیشتری را روی پکیج اعمال کنیم توصیه میکنم لینک مربوط به پکیج را که در بالا اشاره شد مطالعه نمایید.

اگر بخواهیم لینک های دیگری ( مثلا برای نویسنده های مقالات ) تولید کنیم میتوانیم به صورت زیر کد فوق را که به مدل اضافه کردیم توسعه دهیم :

public function sluggable()
{
    return [
        'title-slug' => [
            'source' => 'title'
        ],
        'author-slug' => [
            'source' => ['author.firstname', 'author.lastname']
        ],
    ];
}

این پلاگین حروف فارسی را پشتیبانی نمیکنه برای اینکه این پشتیبانی صورت بگیره لازمه وارد فولدر config و فایل sluggable بشید و تابع زیر را برای method قرار دهید :

    'method' => function($string, $separator = '-') {
        $_transliteration = ["/ö|œ/" => "e",
            "/ü/" => "e",
            "/Ä/" => "e",
            "/Ü/" => "e",
            "/Ö/" => "e",
            "/À|Á|Â|Ã|Å|Ǻ|Ā|Ă|Ą|Ǎ/" => "",
            "/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/" => "",
            "/Ç|Ć|Ĉ|Ċ|Č/" => "",
            "/ç|ć|ĉ|ċ|č/" => "",
            "/Ð|Ď|Đ/" => "",
            "/ð|ď|đ/" => "",
            "/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/" => "",
            "/è|é|ê|ë|ē|ĕ|ė|ę|ě/" => "",
            "/Ĝ|Ğ|Ġ|Ģ/" => "",
            "/ĝ|ğ|ġ|ģ/" => "",
            "/Ĥ|Ħ/" => "",
            "/ĥ|ħ/" => "",
            "/Ì|Í|Î|Ï|Ĩ|Ī| Ĭ|Ǐ|Į|İ/" => "",
            "/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/" => "",
            "/Ĵ/" => "",
            "/ĵ/" => "",
            "/Ķ/" => "",
            "/ķ/" => "",
            "/Ĺ|Ļ|Ľ|Ŀ|Ł/" => "",
            "/ĺ|ļ|ľ|ŀ|ł/" => "",
            "/Ñ|Ń|Ņ|Ň/" => "",
            "/ñ|ń|ņ|ň|ʼn/" => "",
            "/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/" => "",
            "/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/" => "",
            "/Ŕ|Ŗ|Ř/" => "",
            "/ŕ|ŗ|ř/" => "",
            "/Ś|Ŝ|Ş|Ș|Š/" => "",
            "/ś|ŝ|ş|ș|š|ſ/" => "",
            "/Ţ|Ț|Ť|Ŧ/" => "",
            "/ţ|ț|ť|ŧ/" => "",
            "/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/" => "",
            "/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/" => "",
            "/Ý|Ÿ|Ŷ/" => "",
            "/ý|ÿ|ŷ/" => "",
            "/Ŵ/" => "",
            "/ŵ/" => "",
            "/Ź|Ż|Ž/" => "",
            "/ź|ż|ž/" => "",
            "/Æ|Ǽ/" => "E",
            "/ß/" => "s",
            "/IJ/" => "J",
            "/ij/" => "j",
            "/Œ/" => "E",
            "/ƒ/" => ""];
        $quotedReplacement = preg_quote($separator, '/');
        $merge = [
            '/[^\s\p{Zs}\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ',
            '/[\s\p{Zs}]+/mu' => $separator,
            sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '',
        ];
        $map = $_transliteration + $merge;
        unset($_transliteration);
        return preg_replace(array_keys($map), array_values($map), $string);
    },

که خروجی و نتیجه به صورت زیر خواهد بود :

sluggable farsi

پ. ن :‌این تابع رو از وب سایت  morilog.ir برداشتم 🙂

پکیج تاریخ شمسی برای لاراول ۵

یکی از نیازهای برنامه‌نویسای ایرانی هنگام توسعه وب‌سایت‌ها و اپلیکیشن‌ها، تبدیل تاریخ میلادی و شمسی و بالعکسه… که مرتضی پروینی عزیز پکیجی رو برای این کار نوشته که در گیت هاب شخصی ایشون میتونید جزئیاتش رو ببینید و نصب و استفاده نمائید. ( همچنین در سایت packalyst میتوانید پکیج های مختلفی رو برای اینکار پیدا کنید که بازخوبترینش همین پکیجه تا به امروز. )

پ.ن : در نهایت تاکید میکنم که این مقالاتی که توی وبلاگم منتشر میکنم صرفا برای آرشیو کردن تجربیات خودم برای خودم است که در آینده نیز شاید دوباره برایم کاربرد داشته باشه اگر برای دوستان نیز کاربرد داشت که خوشحال خواهم شد.

شاد و موفق باشید.

Comments