Laravel DB :: transaction不使用模型事件捕获Exception

时间:2014-09-22 14:30:56

标签: php laravel transactions

我对Laravel相当新,我正在尝试使用模型事件。 考虑一个模型有这些事件(注意手动抛出的异常)

class Doctor extends \Eloquent {

    protected $fillable = ['name', 'summary', 'description', 'image'];

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

        Doctor::deleting(function(Doctor $doctor) {
            $doctor->page()->delete();
        });

        Doctor::created(function(Doctor $doctor) {
            throw new \Exception('hahahah!!!');
            $doctor->page()->create(['title' => $doctor->name, 'slug' => $doctor->name]);
        });
    }

    public function page() {
        return $this->morphOne('Page', 'pageable');
    }
}

Controller的商店方法:

public function store() {

        // TODO : Extract Validation to a Service.

        $validator = \Validator::make(
            \Input::only('name'),
            ['name' => 'required']
        );
        if ($validator->fails()) {
            return \Redirect::back()->withErrors($validator)->with(['items' => $this->dataArray]);
        }
        $doctor = \Doctor::create(\Input::all());

        \DB::transaction(function() use($doctor) {
            $doctor->save();
        });

        return \Redirect::route('Emc2.doctors.edit', ['id' => $doctor->id]);
    }

问题是,DB :: transaction Doesnt捕获Model抛出的Exception,因此我无法回滚事务。

我做错了吗?

任何帮助将不胜感激! 谢谢!

1 个答案:

答案 0 :(得分:4)

它按预期工作。问题是您在将其包装到事务中之前创建新条目。

 $doctor = \Doctor::create(\Input::all()); // It already saved the doctor

 \DB::transaction(function() use($doctor) {
    $doctor->save(); // here you UPDATE doctor
 });

所以使用这个:

 $doctor = new \Doctor(\Input::all());

 \DB::transaction(function() use($doctor) {
    $doctor->save();
 });

 \DB::transaction(function() use (&$doctor) {
    $doctor = \Doctor::create(\Input::all());
 });