2015-09-21 46 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