5

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

解決策を見つけるのを手伝ってください。私はインターネットで検索し、一日中テストしましたが、うまくいきませんでした:(

4

4 に答える 4

5

同じ質問を検索していたら見つけました。私はLaravel 5.8を使用しており、このようにしています。

  1. カスタム ブループリント クラスを作成する
namespace App\Database\Schema;

class Blueprint extends \Illuminate\Database\Schema\Blueprint
{
    public function datetimeCreatedAt($precision = 0)
    {
        return $this->dateTime('created_at', $precision);
    }

}
  1. MySqlConnection クラスまたは必要なものを作成します
namespace App\Database;

class MySqlConnection extends \Illuminate\Database\MySqlConnection
{
    public function getSchemaBuilder()
    {
        $builder = parent::getSchemaBuilder();
        $builder->blueprintResolver(function ($table, $callback) {
            return new \App\Database\Schema\Blueprint($table, $callback);
        });

        return $builder;
    }
}
  1. AppServiceProvider の変更
namespace App\Providers;

use App\Database\MySqlConnection;
use Illuminate\Database\Connection;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        Connection::resolverFor('mysql', function ($connection, $database, $prefix, $config) {
            return new MySqlConnection($connection, $database, $prefix, $config);
        });
    }
}
于 2019-03-06T13:06:57.040 に答える