Добрый день,
Есть контроллер:
class VehicleController extends Controller{
public function store(VehicleRequest $request)
{
$vehicle = Vehicle::add($request->all());
$vehicle->uploadImage($request->file('photo'));
}
}
Есть трейт, который цепляется к модели
Vehicle, он содержит вызываемый из контроллера метод
uploadImage:
trait ImagePublicBehavior
{
private $localPath = 'storage/uploads/images';
public function uploadImage($image)
{
if($image == null)
return false;
$filename = $this->generateFileName($image);
$image->storeAs($this->getImageDir(), $filename);
$this->photo = $filename;
$this->save();
}
private function getImageDir()
{
return $this->localPath.'/'.$this->table;
}
public function generateFileName($image): string
{
return str_random(10).'.'.$image->extension();
}
}
Все работает, но изображения грузятся в общую папку сущности (по имени таблицы)
Например:
/public/storage/uploads/images/vehicles/0NSp1P7VeG.png
/public/storage/uploads/images/vehicles/0NSasdsass.png
Естественно данный трейт использую для других моделей.
Вопрос - если не вызывать
uploadImage из контроллера, то можно каким то образом в трейте вытащить id созданной записи, чтобы использовать ее в формировании пути к сохраняемому изображению?
Также интересует насколько возможно и насколько правильно получить там же (в boot() трейта) объект запроса для
вызова
uploadImage с передачей данных в него из запроса(
$request->file('photo'))
Вот примерно что я хочу
trait ImagePublicBehavior
{
private static $_id;
...
public static function boot()
{
parent::boot();
static::created(function (Request $request, $model)
{
static::$_id = $model->id;
$this->uploadImage($request->file('photo'));
});
private function getImageDir()
{
return $this->localPath.'/'.$this->table.'/'.static::$_id;
}
...
}
Но не знаю как правильно сделать.