Расширение Laravel 5.5 / 5.6 Blueprint

Как продлить Laravel 5.5 / 5.6 MySQL Blueprint с пользовательским методом $ Table-> MyMethod () как готовый метод $ Стол-> метки времени ();?

Я попробовал пример с SQLlite: Расширение Blueprint для SQLite в Laravel 5

Но я не мог заставить это работать. Я разрабатываю свой собственный пакет (используя лучшие практики разработки пакетов) и хотел бы включить расширение Blueprint оттуда.

У моего devloped пакета есть папка расширения Laravel «Расширение»:
./ Пакеты / Имя_вендор / имя_пакет / SRC / Extension /

Есть файлы:

1) ./packages/vendorname/packagename/src/Extension/Blueprint.php

<?php

namespace Vendorname\Packagename\Extension;

use Illuminate\Database\Schema\Blueprint as ParentBlueprint;
use Illuminate\Support\Facades\DB;

class Blueprint extends ParentBlueprint
{

public function myMethod()
{
$this->text('custom_column')->default('Some value');
$this->text('custom_column2')->default('Some value2');
}
}

2) ./packages/vendorname/packagename/src/Extension/MySqlConnection.php

<?php

namespace Vendorname\Packagename\Extension;

use Vendorname\Packagename\Extension\Blueprint;
use Illuminate\Database\MySqlConnection as ParentMySqlConnection;
use Illuminate\Database\Schema\MySqlBuilder;

class MySqlConnection extends ParentMySqlConnection
{

public function getSchemaBuilder()
{
if (is_null($this->schemaGrammar)) {
$this->useDefaultSchemaGrammar();
}

$builder = new MySqlBuilder($this);
$builder->blueprintResolver(function ($table, $callback) {
return new Blueprint($table, $callback);
});

return $builder;
}
}

И мой пакет имеет поставщика услуг:
./packages/vendorname/packagename/src/VendornamePackagenameServiceProvider.php с регистр() метод:

public function register()
{      if ($this->app->config->get('vendorname-packagename') === null) {
$this->app->config->set('vendorname-packagename', require __DIR__.'/../config/vendorname-packagename');
}

$this->app->bind('db.connection.mysql', Vendorname\Packagename\Extension\MySqlConnection::class);
}

Также мой пакет имеет файл миграции:
./packages/vanilla/vanilla-admin/src/migrations/2018_02_07_213437_create_logs_table.php:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
//use Vendorname\Packagename\Extension\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateLogsTable extends Migration
{

public function up()
{
Schema::create('logs', function (Blueprint $table) {
$table->increments('id');
$table->text('package');
$table->longText('log');
$table->myMethod();
$table->timestamps();
});
}

public function down()
{
Schema::dropIfExists('logs');
}
}

Как я могу использовать стандартную «use Illuminate \ Database \ Schema \ Blueprint;» в миграции, потому что я не хочу использовать «использовать Vendorname \ Packagename \ Extension \ Blueprint;».

Также я получил ошибку при запуске миграции «php artisan migrate: refresh»:

Type error: Argument 1 passed to CreateLogsTable::{closure}() must be a
n instance of Vanilla\VanillaAdmin\Extension\Blueprint, instance of Ill
uminate\Database\Schema\Blueprint given, called in /Users/raido/.compos
er/vendor/bin/laravel-packages/vendor/laravel/framework/src/Illuminate/
Database/Schema/Builder.php on line 164

Пожалуйста, помогите мне найти решение. Я искал по интернету и тестировал целый день, я не мог заставить его работать 🙁

1

Решение

В Laravel 5.5 лучший способ расширить Blueprint — это зарегистрироваться. макрос в вашем AppServiceProvider метод загрузки примерно так:

Blueprint::macro('yourmethod', function () {
// your method here
});
1

Другие решения

Просто используйте это в миграции:

public function up()
{
$schema = \DB::getSchemaBuilder();

$schema->blueprintResolver(function($table, $callback) {
return new YourBlueprint($table, $callback);
});

$schema->create('table_name', function (YourBlueprint $table) {
...
0