Изображение вмешательства с помощью Laravel Resource API

#php #laravel #intervention #laravel-api

#php #laravel #вмешательство #laravel-api

Вопрос:

Можно ли вернуть изображение, созданное «на лету» с помощью ресурсов Laravel API, не сохраняя его? Пробовал в контроллере

 $sum = Product::where('slug', $product)->first();

        $img = Image::make('image_path')->resize(400, 400);
        $img->text(name, 205, 138, function($font) {
            $font->file('fonts/BostonHeavy.woff');
            $font->size(42);
            $font->color('#ffffff');
            $font->align('center');
            $font->valign('top');
        });

       return (new ProductResource($sum))->foo($img);
 

Ресурс API Laravel

 <?php

namespace AppHttpResources;
use IlluminateHttpResourcesJsonJsonResource;

class ProductResource extends JsonResource
{
    protected $image;

    public function foo($value){
        $this->image = $value;
        return $this;
    }

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'image' => $this->image,
        ];
    }

}

 

что возвращается

 {
    "data": {
        "id": 1,
        "name": "Such a pickle",
        "image": {
            "encoded": "",
            "mime": "image/jpeg",
            "dirname": null,
            "basename": null,
            "extension": null,
            "filename": null
        }
    }
}
 

Очевидно, что это не работает в документах, в которых указано использовать return $img->response(‘jpg’); который сам по себе работает, но я хочу добавить его в ответ вместо выполнения двух запросов get.

Ответ №1:

Насколько я понимаю, вы хотите вернуть что-то, что вы можете использовать внутри src атрибута в img теге. Попробуйте это:

 $imgBase64 = (string) $img->encode('data-url');
return (new ProductResource($sum))->foo($imgBase64);
 

Затем используйте эту строку в img теге с соответствующим синтаксисом:

 <img src="data:image/jpeg;base64, <<yourEncodedStringHere>>" />