扩展Laravel 5.5 / 5.6蓝图

时间:2018-03-05 15:05:44

标签: php laravel laravel-5.5 blueprint package-development

如何使用自定义方法 $ table-> myMethod()扩展 Laravel 5.5 / 5.6 MySQL蓝图,例如预先构建的方法 $ table->时间戳();

我尝试过使用SQLlite的示例:Extending Blueprint for SQLite in Laravel 5

但我无法让它发挥作用。我正在开发自己的包(使用包开发最佳实践),并希望从那里包含Blueprint扩展。

我的开发包有Laravel扩展文件夹“Extension”: 的 ./包/ VENDORNAME /包/ SRC /扩展/

有文件:

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

=ROWS($1:1)-1

2) ./ packages / vendorname / packagename / src / Extension / MySqlConnection.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');
     }
}

我的包裹有服务提供者: 使用 register()方法 ./ packages / vendorname / packagename / src / VendornamePackagenameServiceProvider.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;
     }
}

我的包也有迁移文件: 的 ./包/香草/香草管理员/ SRC /迁移/ 2018_02_07_213437_create_logs_table.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);
}

如何使用标准“使用Illuminate \ Database \ Schema \ Blueprint;”在迁移中,因为我不想使用“使用Vendorname \ Packagename \ Extension \ Blueprint;”。

我在运行迁移时遇到错误“php artisan migrate:refresh”:

<?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');
    }
}

请帮我找一个解决方案。我在互联网上搜索并整天测试,我无法让它工作:(

4 个答案:

答案 0 :(得分:1)

使用Laravel 5.5,扩展蓝图的最佳方法是在AppServiceProvider引导方法中注册macros,如下所示:

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

答案 1 :(得分:1)

我遇到了同样的问题,并通过创建一个新的 CustomBlueprint 类解决了该问题。我为此写了一个单独的博客。只要去那里,您就会找到答案。 在这里,我仅给出一个迁移文件示例,该文件具有commonFields()方法以在模型中添加公共字段

    $schema = DB::connection()->getSchemaBuilder();

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

    $schema->create('roles', function (CustomBlueprint $table) {
        $table->bigIncrements('id');
        $table->string('name')->unique();
        $table->commonFields();
    });

我创建了具有该方法的CustomBlueprint类。

<?php
namespace App\common;
use Illuminate\Database\Schema\Blueprint;
class CustomBlueprint extends Blueprint
{
    public function commonFields()
    {
        $this->timestamp('created_at')->nullable();;
        $this->unsignedBigInteger('created_by')->nullable();
        $this->timestamp('updated_at')->nullable();;
        $this->unsignedBigInteger('updated_by')->nullable();
        $this->timestamp('deleted_at')->nullable();;
        $this->unsignedBigInteger('deleted_by')->nullable();
        $this->boolean('is_deleted')->default(0);
    }
}

链接:custom-blueprint-in-laravel-mode

答案 2 :(得分:0)

只需在迁移中使用它:

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

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

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

答案 3 :(得分:0)

我在搜索同一问题时发现了这一点。我正在使用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);
        });
    }
}
相关问题