Orbit — использование Laravel без SQL

laravel flat files driver

Orbit — это flat-file драйвер (неструктурированных файлов) для Laravel Eloquent. Он позволяет вам заменить обычную базу данных реальными файлами, с которыми вы можете работать, используя знакомые вам методы.

Посмотрим его работу на примере модели User.

Модель User

Установим пакет с помощью Composer:

composer require ryangjchandler/orbit

Orbit работает с моделью через трейт Orbit\Concerns\Orbital. Добавляем его в нашу модель:

use Orbit\Concerns\Orbital;

class User extends Model
{
    use Orbital;
}

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

Схема

Точно так же, как и для SQL, модель должна иметь свою схему. По ней Orbit определит, какой контент будет доступен в неструктурированных файлах и что должно быть доступно из модели.

По сути, это это обычная up миграция:

class User extends Model
{
    use Orbital;
  
    public static function schema(Blueprint $table)
    {

    }
}

Laravel предоставляет для users стандартную миграцию, поэтому мы можем просто взять её и скопировать в метод schema:

class User extends Model
{
    use Orbital;
  
    public static function schema(Blueprint $table)
    {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
    }
}

Orbit автоматически добавляет в схемы поля created_at и updated_at.

Если вы откроете tinker и наберете User::create([...]), то увидите новую папку content/users, а в ней новый файл 1.md.

Настройка первичного ключа

Вещь, которую мне нравится делать с этим драйвером в моделях — использование более понятного описания в качестве первичного ключа. В случае с моделью User это, скорее всего, будет email, так как он будет всегда уникальным.

Чтобы это сделать в Orbit, нужно изменить $primaryKey или перезаписать метод getKeyName.

class User extends Model
{
    use Orbital;
  
    protected $primaryKey = 'email';
  
    public static function schema(Blueprint $table)
    {
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
    }
}

Теперь, при создании нового пользователя, имя файла будет таким же как и email, что позволит легко увидеть какие уже пользователи зарегистрированы.

Изменение первичного ключа модели повлияет на внешние и локальные поля для ваших отношений. Например, если вы используете поле email в качестве первичного ключа вашей модели User, то Laravel поймёт, что имя внешнего поля в связанной модели будет user_email при использовании отношения belongsTo. Это можно изменить, указав имена полей при определении отношения.

Github

Если вас заинтересовал пакет и вы хотите больше узнать о нём, то загляните в его репозиторий: https://github.com/ryangjchandler/orbit

Автор: Ryan Chandler
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.