【问题标题】:Extending Blueprint for SQLite in Laravel 5在 Laravel 5 中扩展 SQLite 蓝图
【发布时间】:2015-12-18 12:08:22
【问题描述】:

我有一个自定义的Blueprint 类,为了使用它,我按照this gist. 中的步骤操作

基本上,它说我需要扩展 MySqlConnection 并使用 Laravel 在 Schema 文件夹中方便地拥有的 MySqlBuilder

它对 MySQL 非常有用!问题是我使用 SQLite 进行测试,我也需要 Bluepint,问题是没有基础 SqliteConnection 也没有 SqliteBuilder...

当然,我得到以下异常:

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

我必须自己编写那些缺失的课程吗?希望不会


顺便说一句,Laravel 4 有人问过这个问题here,但我不想在每次迁移时手动绑定我的蓝图...

【问题讨论】:

  • 暂停请国际:D

标签: php sqlite laravel-5


【解决方案1】:

好吧,我关于缺少SQLiteConnection 的说法是错误的,确实存在,显然不需要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');
    }
}

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

希望这能帮助迷失的灵魂在未来找到自己的道路。

【讨论】:

  • 抱歉,我从 2015 年开始切换到 Java/Scala
  • 祝你好运:D
【解决方案2】:

不,您不需要重写这些类,您只需要扩展蓝图。您的 CreateUsersTable 方法也需要 MyBlueprint 并获取 Blueprint 的实例。

您还需要扩展和重写 Schema 外观,或者只需将其替换为您自己的服务提供者和绑定,该绑定扩展了“Schema”返回的默认 laravel 类。..

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

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

现在在你的 app/config/app.php 中换行:

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

而是将 Schema 外观指向您的版本。

【讨论】:

  • 感谢您的回答;不幸的是,您的方法适用于 Laravel 4(我当时使用它),但在 Laravel 5 中没有产生任何结果。在 L5 中扩展蓝图的方法是遵循我回答开始时的要点,但会带来后来所述的问题。
猜你喜欢
  • 2018-08-13
  • 2018-02-18
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2015-12-03
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多