laravel 5.1 - 没有为 model::update() 函数调用特征引导

Posted

技术标签:

【中文标题】laravel 5.1 - 没有为 model::update() 函数调用特征引导【英文标题】:laravel 5.1 - trait boot not being called for model::update() function 【发布时间】:2015-08-21 11:13:20 【问题描述】:

我在此页面 app/Traits/ModelEventThrower.php 上创建了如下特征

namespace App\Traits;

use Input;
use Event;
use App\Events\ActivityLog;
use Illuminate\Database\Eloquent\Model;
//use Illuminate\Support\Facades\Event;

/**
 * Class ModelEventThrower 
 * @package App\Traits
 *
 *  Automatically throw Add, Update, Delete events of Model.
 */
trait ModelEventThrower 

    /**
     * Automatically boot with Model, and register Events handler.
     */
    protected static function bootModelEventThrower()
    

        foreach (static::getModelEvents() as $eventName) 

            static::$eventName(function (Model $model) use ($eventName) 
                try 

                    $reflect = new \ReflectionClass($model);

                    echo "here";exit;

                   catch (\Exception $e) 
                    return true;
                
            );
        
    

    /**
     * Set the default events to be recorded if the $recordEvents
     * property does not exist on the model.
     *
     * @return array
     */
    protected static function getModelEvents()
    
        if (isset(static::$recordEvents)) 
            return static::$recordEvents;
        

        return [
            'created',
            'updated',
            'deleted',
        ];
    

我的城市模型是这样的

namespace App;

use App\Traits\ModelEventThrower;
use App\Events\ActivityLog;

use Illuminate\Database\Eloquent\Model;
use Event;

class City extends Model

    use ModelEventThrower;
    //protected static $recordEvents = ['updated'];
...

我的 CitiesController 是

namespace App\Http\Controllers\Admin;

use App\City;
use App\Country;
use Input;
use Validator;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class CitiesController extends Controller

......
    public function update(City $city,Request $request)
    
     ......
    $city->where('id','=',$input['id'])->update($input);

不知何故,我没有看到它调用写在特征文件中的函数。当我尝试创建 $city->create($input); 时,它会回显“here”并停止执行,但对更新功能没有做同样的事情,但是我可以成功更新记录。

任何建议/帮助将不胜感激。

【问题讨论】:

我试着按照这里提到的***.com/a/30582174/4514022 我没有看到该函数在哪里被调用。 使用 ModelEventThrower;在城市模型中 特征实际上只是一种美化的复制和粘贴。只需为其添加 use 语句不会使其执行任何操作。您需要调用它的方法,就像该方法在类本身中一样。 我知道我犯了一些错误,但无法确定是什么和在哪里,我更不知道为什么调用 create() 函数以及为什么不调用 update()。 【参考方案1】:

Laravel 也有类似的问题。通过在模型中添加一个构造函数来调用父Modelboot()函数,像这样:

public function __construct()

    parent::boot();

您可以确保所有特征都已启动。这为我解决了。

【讨论】:

以上是关于laravel 5.1 - 没有为 model::update() 函数调用特征引导的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1 中未定义的默认命名空间

从 5.1 迁移到 5.3 时急切加载关系的 Laravel 错误

laravel 5.1 在没有 VM 重启的情况下看不到作业文件的更改

laravel 5.1 中的日期验证

Laravel 5 和 Laravel 5.1 “找不到类‘模型名称’”,有更好的解决方案吗?

[ Laravel 5.1 文档 ] 架构 —— 应用目录结构