如何使用自定义方法$ table-> myMethod()扩展Laravel 5.5 / 5.6 MySQL Blueprint,如预建方法$ table-> timestamps();?
我试过一个SQLite的例子:qazxsw poi
但我无法让它发挥作用。我正在开发自己的包(使用包开发最佳实践),并希望从那里包含Blueprint扩展。
我的开发包有Laravel扩展文件夹“Extension”:./ packages / vendorname / packagename / src / Extension /
有文件:
1) ./packages/vendor那么/package那么/双人床/extension/blueprint.PHP
Extending Blueprint for SQLite in Laravel 5
2) ./packages/vendor那么/package那么/双人床/extension/MySQL connection.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');
}
}
我的包有服务提供者:./packages/vendorname/packagename/src/VendornamePackagenameServiceProvider.php with register()方法:
<?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 / vanilla / vanilla-admin / modules / modules / 18_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;”在迁移中,因为我不想使用“使用供应商名称\包名称\扩展名\蓝图;”。
我在运行迁移“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');
}
}
请帮我找一个解决方案。我在互联网上搜索并测试了一整天,我无法让它工作:(
使用Laravel 5.5,扩展Blueprint的最佳方法是在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
启动方法中注册macros,如下所示:
AppServiceProvider
我在寻找同样的问题时发现了这一点。我正在使用Laravel 5.8并且这样做。
Blueprint::macro('yourmethod', function () {
// your method here
});
namespace App\Database\Schema;
class Blueprint extends \Illuminate\Database\Schema\Blueprint
{
public function datetimeCreatedAt($precision = 0)
{
return $this->dateTime('created_at', $precision);
}
}
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;
}
}
只需在迁移中使用它:
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);
});
}
}