没有从CLI(Laravel外)发射的雄辩事件

时间:2017-01-16 23:45:37

标签: php eloquent

我的模型中有以下事件处理程序:

<?php
namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    //...

    public static function boot()
    {
        parent::boot();

        static::saving(function ($user) {
            // die('inside');
            if (empty($user->username)) {

                $base = strtolower($user->first_name . '.' . $user->last_name);

                do {
                    $username = $base . @$suffix;
                    $duplicate = User::where('username', '=', $username)->first();
                } while($duplicate and $suffix = rand(1000, 9999));

                // return the original/ generated username
                $user->username = $username;
            }
        });
    }
}

基本上,当未设置用户名时,模型将自动从名字/姓氏生成唯一的用户名。这在浏览器中工作正常。但是当我运行我的测试时没有在CLI中 - 没有设置用户名,所以它试图插入没有我的mysql表不接受的用户名。

以下是我如何设置Eloquent控制台:

$capsule = new \Illuminate\Database\Capsule\Manager;
$capsule->addConnection([
            'driver' => 'mysql',
            'host' => 'localhost',
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'database' => 'sso_dev',
            'username' => 'root',
            'password' => 'vagrant1',
        ]);
$capsule->setEventDispatcher( new \Illuminate\Events\Dispatcher( new \Illuminate\Container\Container ));
$capsule->bootEloquent();
$capsule->setAsGlobal();

Web环境和测试都使用相同的代码。如果我对行setEventDispatcher发表评论,那么浏览器环境会抛出错误,因为事件处理程序不会触发。所以我知道事件调度员正在那里做它的工作。只是没有测试CLI环境。这可能是什么原因?

顺便说一句,我正在使用Eloquent 5.3。

1 个答案:

答案 0 :(得分:0)

启动时,您将需要再次调用setEventDispatcher。

public static function boot(){
    parent::boot();

    static::setEventDispatcher(new \Illuminate\Events\Dispatcher());
    static::saving(function ($model){
        // now you can reference your model
    }
}