Задать вопрос
@mykolaim
PHP developer

Как выполнить dependency injection в resource?

Использую resource для форматирования ответа API. В
некоторых обьектах есть ссылки на файлы, и для этих ссылок нужно создавать подпись и срок жизни.
Это действие выполняет обьект класса, и я хочу его заинжектить примерно вот так:
class AttachmentResource extends JsonResource
{
    /**
     * @var S3Client
     */
    protected $s3Client;

    public function __construct($resource, S3Client $client)
    {
        parent::__construct($resource);
        $this->s3Client = $client;
    }

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $cmd = $this->s3Client->getCommand('GetObject', [
            'Bucket' => config('aws.bucket'),
            'Key'    => $this->url
        ]);
        $preSignedRequest = $this->s3Client->createPresignedRequest($cmd,'+1 year');
        return [
            'id' => $this->id,
            'url' => $preSignedRequest->getUri()
			];
	}
}


Но получаю ошибку
Argument 2 passed to App\\Http\\Resources\\AttachmentResource::__construct() must be an instance of Aws\\S3\\S3Client, integer given, called in /var/www/vendor/laravel/framework/src/Illuminate/Support/Collection.php on line 1039"


Передача данных в ресурс происходит вот так:
AttachmentResource::collection($this->attachments);
  • Вопрос задан
  • 1048 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 2
dark1112
@dark1112
Web developer
В AppServiceProvider в методе register пропишите:
$this->app->when(AttachmentResource::class)
          ->needs(S3Client::class)
          ->give(S3Client::class);


Не забудьте прописать use для классов)
Ответ написан
Комментировать
@mykolaim Автор вопроса
PHP developer
Решил использовав хелпер resolve
$s3Client = resolve(S3Client::class);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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