Есть в Drupal такой модуль, S3FS, создает стрим-враппер s3://
для работы с файловыми бакетами на Amazon S3. Модуль в принципе удобный и работает, но вот только не все файловые функции умеют в такой стрим. Например, если мы хотим проверить, существует ли в бакете файл, то file_exists('s3://myfile.txt')
всегда вернёт FALSE
.
Если заглянуть в код класса S3fsStreamWrapper
, то там для проверки используется $this->s3->doesObjectExist()
. Можно было бы сделать красиво, вот так:
file_stream_wrapper_get_instance_by_scheme('s3')
->s3
->doesObjectExists('my-bucket', 'myfile.txt');
Только вот незадача: $this->s3
— клиент S3 Aws\S3\S3Client
, вокруг которого работает стрим-враппер — это protected-свойство.
Пришлось ковыряться и делать некрасиво:
$config = _s3fs_get_config();
$s3 = _s3fs_get_amazons3_client($config);
$s3->doesObjectExist('my-s3-bucket', $filename);
То есть вытягивать конфиги, создавать клиент вручную, и тогда уже проверять.
А мораль такая. Если вы пишете враппер вокруг какого-нибудь сервиса, и решили сделать свойство, содержащее объект сервиса, недоступным снаружи — подумайте. Может хоть геттер добавить стоит, если уж не реализуете обертку над каждым полезным методом?