ساخت پکیج لاراول 5 - قسمت چهارم

ترجمه و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 13 خرداد 98
خواندن در 2 دقیقه
دسته بندی ها : لاراول

برای قسمت چهارم این سری آموزش ها ما بحث migration و seeding رو در ساخت پکیج ها پوشش خواهیم داد. 

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

برای تست پکیج من ترجیح میدم از sqlite که راه ساده ای برای تست محلی هست, استفاده کنیم. بهرحال اگر شما از eloquent استفاده می کنید, این باید روی تمام دیتابیس های پشتیبانی شده کار کنه. بهتره این مورد رو داخل مستندات پکیج تون (README) قرار بدید, تا کاربران مطلع شوند.

راه اندازی دیتابیس

این کار پیچیده ای نیست, شما باید بصورت همیشگی اتصالات رو راه اندازی کنید. اگر شما از sqlite استفاده می کنید, باید یک فایل storage/adatabase.sqlite بسازید.

همچنین از اونجا که لاراولی که ما استفاده می کنیم, فقط برای تست پکیج هست, میتونیم فایل های migration user رو حذف کنیم.

حالا با اجرای دستور migrate مطمئن میشیم که فایل ها پاک شدند و فایلی وجود ندارد :

> php artisan migrate
> Nothing to migrate.

فایل های migration

سپس باید مسیر src/migrations رو برای فایل های migration بسازیم. بهتره اسامی فایل های migration رو با یک پیشوند آغاز کنیم :

// src/migrations/0000_00_00_000000_create_websanova_demo_items_table.php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateWebsanovaDemoItemsTable extends Migration
{
    public function up()
    {
        Schema::create('websanova_demo_items', function(Blueprint $t)
        {
            $t->increments('id')->unsigned();
            $t->text('slug', 255);
            $t->text('name', 255);
            $t->text('description', 255);
            $t->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('websanova_demo_items');
    }
}

برای نام فایل migration شما باید فرمت YYYY_MM_DD_TTTTTT_FILENAME رو داشته باشید. برای بیشتر قسمت ها میتونید فقط 0 قرار بدید. اگر بخواهید در دنباله خاصی اجرا شوند, شما باید مقادیر مناسب رو اضافه کنید.

دو گزینه برای انتشار فایل های migration وجود دارد. اولی مثل کاری که انجام می دادیم, استفاده از متد publishes هست :

public function boot()
{
    $this->publishes([
        __DIR__ . '/migrations' => $this->app->databasePath() . '/migrations'
    ], 'migrations');

    ...
}

عموما وقتی که توسعه دهندگان اون رو بعنوان بخشی از اپلیکیشن نیاز داشته باشند, شما از این راه, پیاده سازیش میکنید.

> php artisan vendor:publish --tag=migrations

اگر جداول فقط برای تست پکیج هستند, نباید از متد بالا استفاده کرد. ما میتونیم فقط اون رو توسط گزینه ی path-- اجرا کنیم :

> php artisan migrate --path=/packages/websanova/demo/src/migrations

نکته : ار اونجا که فایل های migration درواقع در اپ نیستند ما باید مسیر migrations رو در فایل composer.json بیافزاییم :

"autoload": {
    "classmap": [
        "database",
        "packages/websanova/demo/src/migrations"
    ],
    ...

البته اگر migration رو بصورت مستقیم در پوشه migrations منتشر کنید اینکار ضروری نیست. تاکید می کنم اگر فایل های migration فقط برای تست پکیج هستند و نیازی به وجودشون در اپ نیست, نباید هیچ فایلی با دستور vendor:publish منتشر شود.

فایل های Seeding

اول باید مسیر src/seeds رو بسازیم و بصورت زیر عمل کنیم :

// src/seeds/DemoSeeder.php

namespace Websanova\Demo;

use Illuminate\Database\Seeder;

class DemoSeeder extends Seeder
{
    public function run()
    {
        DB::table('websaanova_demo_items')->insert([
            'slug' => 'test',
            'name' => 'Test',
            'description' => 'My first item test.',
            'created_at' => \Carbon\Carbon::now(),
            'updated_at' => \Carbon\Carbon::now()
        ]);
    }
}

شما احتمالا در آینده از insert استفاده نمی کنید اما ما وارد جزئیات seeding نمیشیم. شما میتونید از هر شیوه ای که میخواهید برای عملیات seeding استفاده کنید. اینجا ما فقط نشان می دهیم که چطور فایل seeding پکیج رو اجرا کنیم.

 

برای seeding نیازی به انتشار فایل ها نیست. ما باید با استفاده از گزینه class بگوییم چه کلاسی اجرا شود :

> php artisan db:seed --class=Websanova\Demo\Seeds\DemoSeeder

تنها مشکلی که وجود داره اینه که نمیتونیم migrate:refresh --seed رو در یک خط اجرا کنیم. ما باید اون رو جداگانه اجرا کنیم :

> php artisan migrate:rollback
> php artisan migrate --path=/packages/websanova/demo/src/migrations
> php artisan db:seed --class=Websanova\Demo\Seeds\DemoSeeder

مدل ها

بیایید حالا مقداری اطلاعات از یک مدل دریافت کنیم و اون رو نمایش بدیم. ما یک مسیر src/models میسازیم تا مدل هامون رو نگه داری کنیم.

// src/models/Item.php

namespace Websanova\Demo\Models;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    protected $table = 'websanova_demo_items';
}

سپس view خودمون رو در فایل src/Http/routes.php میسازیم :

Route::get('demo/model', function () {
    dd(\Websanova\Demo\Models\Item::get());
});

در بخش پنجم این سری آموزش ها سراغ مبحث unit testing می رویم.

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید