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
也有类似的问题。通过在模型中添加一个构造函数来调用父Model
的boot()
函数,像这样:
public function __construct()
parent::boot();
您可以确保所有特征都已启动。这为我解决了。
【讨论】:
以上是关于laravel 5.1 - 没有为 model::update() 函数调用特征引导的主要内容,如果未能解决你的问题,请参考以下文章
从 5.1 迁移到 5.3 时急切加载关系的 Laravel 错误
laravel 5.1 在没有 VM 重启的情况下看不到作业文件的更改