我需要一个Eloquent模型来表示上传到服务器的文档。一个这样的字段是文件的绝对路径。我希望能够在更新数据库记录时移动文件。我已经看到Laravel包含Observers来处理此类事件。问题是:
观察者类具有反映您希望侦听的Eloquent事件的方法名称。这些方法中的每一个都将模型作为唯一的参数。
这意味着,遗憾的是,对于给定的系统,我无法实际移动文件,因为我无法检索相关文件的当前位置和新位置。是否有另一种方法可以在访问旧值和新值时检测值何时发生变化?
答案 0 :(得分:4)
听起来您可以使用updating
model event来实现此目的。您可以在服务提供商的boot
方法中注册该事件(例如app/Providers/AppServiceProvider.php
),也可以按照您的提法创建一个观察者类。
isDirty
和getOriginal
方法可以帮助您检查文件是否需要移动,然后获取原始路径。
例如:
use Storage;
use App\Document;
public function boot()
{
Document::updating(function ($document) {
if ($document->isDirty('file_path')) {
// File needs to be moved
$current_path = $document->getOriginal('file_path');
$new_path = $document->file_path;
Storage::move($current_path, $new_path);
}
});
}