gpt4 book ai didi

php - Laravel 模型事件保存未触发

转载 作者:可可西里 更新时间:2023-11-01 00:09:30 26 4
gpt4 key购买 nike

我正在尝试模拟 Ardent 包在做什么。这是在保存之前验证模型。

我创建了这个 BaseModel(根据 Laravel Testing decoded 一书)。并添加了这段代码:

class BaseModel extends Eloquent {
protected static $rules = [];
public $errors = [];

public function validate(){
$v = Validator::make($this->attributes, static::$rules);

if($v->passes()) {
return true;
}

$this->errors = $v->messages();

return false;
}

public static function boot(){
parent::boot();
static::saving(function($model){
if($model->validate() === true){
foreach ($model->attributes as $key => $value) {
if(preg_match("/[a-zA-Z]+_confirmation/", $key)){
array_splice($model->attributes, array_search($key, array_keys($model->attributes)), 1);
}
}
echo "test"; //This is for debugging if this event is fired or not
return true;
} else {
return false;
}
});
}
}

现在,这是我的 Post 模型:

class Post extends BaseModel {
public static $rules = array(
'body' => 'required',
'user_id' => 'required',
);

}

在此测试中,我预计它会失败。相反,它通过了! , $post->save() 返回真!

class PostTest extends TestCase {

public function testSavingPost(){
$post = new Post();
$this->assertFalse($post->save());
}
}

当我试图在 saving 事件中抛出一个 echo 语句时。它没有出现,所以我知道我定义的 saving 事件没有被调用。我不知道为什么。

最佳答案

查看此讨论:https://github.com/laravel/framework/issues/1181

您可能需要在测试中重新注册您的事件。

class PostTest extends TestCase {

public function setUp()
{
parent::setUp();

// add this to remove all event listeners
Post::flushEventListeners();
// reboot the static to reattach listeners
Post::boot();
}

public function testSavingPost(){
$post = new Post();
$this->assertFalse($post->save());
}
}

或者,更好的是,您应该将事件注册功能从引导函数中提取到公共(public)静态方法中:

  class Post extends Model {

protected static boot()
{
parent::boot();
static::registerEventListeners();
}

protected static registerEventListeners()
{
static::saving(...);
static::creating(...);
...etc.
}

}

然后调用 Post::flushEventListeners();发布::注册事件监听器();在 setUp() 测试方法中。

关于php - Laravel 模型事件保存未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18752606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com