@EVOSandru6

Как в laravel в трейте через boot() получить объект запроса и id модели?

Добрый день,

Есть контроллер:

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;
    }
...
 }


Но не знаю как правильно сделать.
  • Вопрос задан
  • 272 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы