雄辩的事件没有解雇

时间:2016-02-08 03:26:14

标签: php eloquent

我想在用户模型中更改密码时设置密码。所以我正在使用该模型的启动方法:

<?php
namespace App\Model;

class User extends \Illuminate\Database\Eloquent\Model
{
    protected $table = 'users';

    public static function boot()
    {
        //die('here'); // this happens
        User::saving(function ($user) {
            //die('here'); // this doesn't happen
            if ($user->isDirty('password')) {
                $user->password = // hash password...
            }
        });
    }
}

我在模型上使用save()方法在数据库中创建条目,显然这应该触发创建事件。我已经清空数据库表以确保正在创建一个新行(它是),此事件不会触发 - 并且我的密码是未加密的。顺便说一句,我在我的应用程序(不是Laravel)中使用illuminate / database ^ 5.2。

UPDATE - 胶囊初始化

$capsule = new Illuminate\Database\Capsule\Manager;
$capsule->addConnection([
    'driver' => 'mysql',
    'host' => 'localhost',
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'database' => 'mydb',
    'username' => 'myuser',
    'password' => 'mypass',
]);
$capsule->bootEloquent();

2 个答案:

答案 0 :(得分:11)

如果您希望事件发挥作用,则需要为胶囊设置事件调度程序。

首先,您需要将illuminate/events添加到依赖项中。将"illuminate/events": "5.2.*"添加到您的composer.json文件中:

"require": {
    // other requires...
    "illuminate/events": "5.2.*"
},

接下来,您需要在胶囊上设置事件调度程序。请务必在致电bootEloquent()之前执行此操作。来自docs

// new capsule...

// add connection...

// Set the event dispatcher used by Eloquent models... (optional)
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
$capsule->bootEloquent();

现在你应该好好去。

虽然没有关联,但我还想指出,您的boot方法应确保在其执行任何操作之前调用parent::boot();(例如设置事件)。

可选解决方案

如果这是您尝试对事件进行的唯一操作,则可以通过为password属性设置mutator function来完全跳过此操作。只要您为mutated属性赋值(即$user->password = "hello"),就会调用mutator方法。

为此,只需将以下功能添加到User模型中:

public function setPasswordAttribute($value) {
    $this->attributes['password'] = bcrypt($value);
}

答案 1 :(得分:1)

我遇到了同样的问题,这是我如何解决的:

<强> 1 首先,我确保要求所有必要的包裹:

{
    "require": {
        "illuminate/database": "~5.2",
        "illuminate/events": "~5.2",
    }
} 

<强> 2 然后我必须正确设置我的数据库连接

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection([
    'driver'    => "driver",
    'host'      => "host",
    'database'  => "database",
    'username'  => "username",
    'password'  => "password",
    'charset'   => "charset",
    'collation' => "collation",
    'prefix'    => "prefix",
]);

// Set the event dispatcher used by Eloquent models... (optional)
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
$capsule->bootEloquent(); 

第3 之后,我使用了Trait,因为它是清理模型的完美解决方案

trait ModelTrait{

    public static function bootModelTrait()
    {
        static::creating(function ($model) {
            // Create Event Here
        });
    }
}

<强> 4 然后我在每个模型中使用了特征

class User extends Eloquent
{
    use ModelTrait;

}