Миграции и модели в модулях Laravel

Сами файлы миграций ничем не отличаются от миграций в обычном приложении. Размещать их можно по стандартному пути database/migrations. Чтобы миграции запустились после установки модуля в приложение необходимо добавить в функцию register() сервис провайдера строку:


    public function register()
    {
        …
        $this->loadMigrationsFrom(__DIR__.'/../database/migrations');
        …
    }

Для запуска миграций после установки или обновления модуля в основном приложении достаточно запустить стандартную команду php artisan migrate

Работа с моделями также похожа на работу с ними в обычном приложении. Модели как правило размещаются в папке src/Models. Пример простой модели:


namespace MXJ\Addons\Blog\Models;

use Illuminate\Database\Eloquent\Model;

/**
 * Class Blog.
 *
 * @property int    $id
 * @property string $name
 * @property string $body
 * @property bool   $public
*/
class Blog extends Model
{
    protected $table = 'blogs';
    protected $fillable = [
        'id',
        'name',
        'body',
        'public',
        'created_at',
        'updated_at',
    ];
}

Главная сложность при работе с моделями в микросервисном приложении – то, что одни и те же модели и миграции могут быть необходимы в разных модулях. В этом случае все модели и миграции имеет смысл вынести в отдельный модуль, который при необходимости подключать через composer.json. Туда же можно добавить трейты, широко используемые хелперы, классы и т.п. При росте системы этот модуль превратится в мини-фреймворк для внутренней разработки.

Никто не ограничивает количество общих модулей, но лучше этим делом не злоупотреблять – чем изолированее каждый отдельный модуль, тем лучше. Но абсолютная изоляция тоже не всегда хорошо – нужен разумный компромисс.

19.07.2021