1

Laravelの外部でilluminateライブラリを使用しようとしています。このレポhttps://github.com/mattstauffer/IlluminateNonLaravelに従うことで、プロジェクトで Eloquent モデルを正常に使用できます。ただし、ブートメソッドをセットアップすると、呼び出されません。

Encapsulator.php

<?php  namespace App\Eloquent; 

use Illuminate\Container\Container;
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Events\Dispatcher;

class Encapsulator
{
    private static $conn;

    private function __construct() {}

    static public function init()
    {
        if (is_null(self::$conn))
        {
            $capsule = new Capsule;

            $capsule->addConnection([
                'driver'    => 'mysql',
                'host'      => HOSTNAME,
                'database'  => DATABASE,
                'username'  => USERNAME,
                'password'  => PASSWORD,
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => PREFIX,
            ]);

            $capsule->setEventDispatcher(new Dispatcher(new Container));

            $capsule->setAsGlobal();

            $capsule->bootEloquent();
        }
    }
}

EncapsulatedEloquentBase.php

<?php  namespace App\Eloquent;

use Illuminate\Database\Eloquent\Model as Eloquent;

abstract class EncapsulatedEloquentBase extends Eloquent
{
    public function __construct(array $attributes = array())
    {
        Encapsulator::init();

        parent::__construct($attributes);
    }
}

ユーザー.php

<?php namespace App\Eloquent;

class User extends EncapsulatedEloquentBase
{

    protected static function boot() {
        parent::boot();
        echo 'hey boot!!'; // called!

        static::creating(function($node) {
            echo 'hey creating!!'; // never called!
        });
    }
}

モデルは使えますが、登録メソッドが呼び出されません。問題は、EventDispatcher を正しくセットアップしていないことだと思いますが、その方法がわかりません。私を助けてください!

4

1 に答える 1

0

私は自分の問題を解決しました。重要な点は、すべての新しい Eloquent モデルで新しい Encapsulator インスタンスを作成しないことです。https://github.com/mattstauffer/IlluminateNonLaravelでは、 User モデルの EncapsulatedEloquentBase から拡張しているため、2 人のユーザーを作成して何かを実行すると、それらのディスパッチャーは同じではありません。これにより、問題が発生します。

したがって、解決策は、ユーザーが Illuminate\Database\Eloquent\Model を拡張できるようにすることです

<?php namespace App\Eloquent;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{

どこかで使用するときは、Encapsulator を 1 回初期化するだけです

Encapsulator::init();
User::create(['name' => 'John']);
于 2014-12-29T12:46:38.893 に答える