2015-09-21 47 views
1

我有一个自定义Blueprint类,为了使用它,我跟着this gist.在Laravel扩展蓝图SQLite的5

基本的步骤,它说我需要扩大MySqlConnection和使用MySqlBuilder是Laravel conviniently有在Schema文件夹中。

它对MySQL很好用!问题是我使用SQLite的测试,我需要的Bluepint那里,这个问题是不存在的基础SqliteConnection也不SqliteBuilder ...

当然,我得到以下异常:

Argument 1 passed to CreateUsersTable::{closure}() 
must be an instance of MyBlueprint 
instance of Illuminate\Database\Schema\Blueprint given 

我必须自己写这些缺失的类吗?希望不是


顺便说一句,这个问题已经被问here为Laravel 4,但我不想用手我的蓝图绑定在每一个移民...

+0

HALP请internatz:d – JSelser

回答

1

Alrighty,我的发言约SQLiteConnection缺少的是错的,它确实存在和apparantly没有必要为一个SQLiteBuilder所以MySqlBuilder必须是一个特殊的例外。

我延长了SQLiteConnection如下:

use Illuminate\Database\SQLiteConnection as ParentSQLiteConnection; 

class SQLiteConnection extends ParentSQLiteConnection 
{ 
    public function getSchemaBuilder() { 

     $builder = parent::getSchemaBuilder(); 

     $builder->blueprintResolver(function($table, $callback){ 

      return new MyBlueprint($table, $callback); 
     }); 

     return $builder; 
    } 
} 

然后在服务注册:

class MyServiceProvider extends ServiceProvider { 

    public function register() 
    { 
     $this->app->bind('db.connection.sqlite', 'SQLiteConnection'); 
    } 
} 

我中省略为简洁一些地区,主要是命名空间和放置位置的服务,但所有这可以从我的问题上发布的要点作为例子推断或查找。

希望这有助于失落的灵魂找到自己在未来的生活方式。

+0

这项工作Laravel 5.6? –

+0

对不起,我自2015年起改用Java/Scala – JSelser

+0

祝你好运:D –

0

不,你不需要重写这些类,你只需要扩展蓝图。您的CreateUsersTable方法也期待着MyBlueprint并获得一个Blueprint实例。

您需要还扩展和改写模式门面,或者只是用自己的服务提供商&绑定扩展了“模式”返回的默认laravel类代替它..

如 见:供应商\ laravel \ framework \ src \ Illuminate \ Support \ Facades \ Schema.php 创建你自己的,你需要替换getFacadeAccessor来返回它当前返回的对象的版本。您的版本应该扩展当前版本,以节省编写每种方法的时间。

您的版本还需要创建等的重写版本,以便返回Illuminate \ Database \ Schema \ Blueprint而不是返回MyBlueprint实例... MyBlueprint将扩展Illuminate \ Database \ Schema \ Blueprint,以便您可以继承其所有功能,然后您将覆盖应该不同的方法。

现在,在您的应用程序/配置/ app.php切换出一行:

'Schema'   => 'Illuminate\Support\Facades\Schema', 

,而是指向架构门面您的版本。

+0

感谢您的回答;不幸的是你的方法也适用于Laravel 4(我用它吧),但国债收益率Laravel 5.延长L5蓝图的方式没有结果在之后我的回答的beggining要点,但后来提出陈述的问题。 – JSelser