Laravel 5.5/5.6 MySQL ブループリントをカスタム メソッド$table->myMethod()で拡張する方法は、ビルド済みのメソッド$table->timestamps(); と同様です。?
SQLlite で例を試してみました: Laravel 5 で SQLite のブループリントを拡張する
しかし、私はそれを機能させることができませんでした。(パッケージ開発のベスト プラクティスを使用して) 独自のパッケージを開発しており、そこからブループリント エクステンションを含めたいと考えています。
私の作成したパッケージには、Laravel 拡張フォルダー「Extension」があります: ./packages/vendorname/packagename/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 with register() method:
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;」を使用するにはどうすればよいですか? 移行では、「use 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
解決策を見つけるのを手伝ってください。私はインターネットで検索し、一日中テストしましたが、うまくいきませんでした:(