Gaufrette и Symfony 2: для домена изображений не определена файловая система.

Я использую Symfony3 с KnpGaufretteBundle для подключения к Amazon. Корзина S3 с методом AWS S3, описанным в их файле Readme на Github.

aws_s3_adapter:
  key:        "%aws_key%"
  secret_key: "%aws_secret%"
  region:     "%aws_region%"

knp_gaufrette:
  adapters:
    images:
        aws_s3:
            service_id: 'aws_s3_adapter.client'
            bucket_name: '%aws_bucket%'
            options:
                directory: 'images'
  filesystems:
    images:
        adapter: images
        alias:   images_fs

У меня также есть определенная служба, которую я хочу использовать для управления этой файловой системой (и другими).

Определение:

services:
  test.image_manager:
    class: TestBundle\Filesystem\FileManager
    arguments: 
      filesystem: "@images_fs"
      filesystem_name: "images"
      mimetypes: ["image/jpeg", "image/png", "image/gif"]

Учебный класс:

<?php

namespace TestBundle\Filesystem;

use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

use Gaufrette\Filesystem;
use Gaufrette\StreamWrapper;

class FileManager
{
    private $allowedMimeTypes;

    private $filesystem;

    private $filsystem_name;

    public function __construct(Filesystem $filesystem, $filesystem_name, $mimetypes = array())
    {
        $this->filesystem = $filesystem;
        $this->filesystem_name = $filesystem_name;
        $this->allowedMimeTypes = $mimetypes;
    }

    public function upload(UploadedFile $file, $filename)
    {
        // Check if the file's mime type is in the list of allowed mime types.
        if (!in_array($file->getClientMimeType(), $this->allowedMimeTypes)) {
            throw new \InvalidArgumentException(sprintf('Files of type %s are not allowed.', $file->getClientMimeType()));
        }

        $adapter = $this->filesystem->getAdapter();
        $adapter->setMetadata($filename, array('contentType' => $file->getClientMimeType()));
        return $adapter->write($filename, file_get_contents($file->getPathname()));
    }

    public function fetch( $filename )
    {
        if( ! $this->filesystem->has( $filename ) )
        {
            return false;
        }


        /* -- PROBLEM -- */

        StreamWrapper::register();
        return new BinaryFileResponse( "gaufrette://{$this->filesystem_name}/{$filename}" );

        /* -- PROBLEM -- */

    }

    public function delete( $filename )
    {
        if( ! $this->filesystem->has( $filename ) )
        {
            return false;
        }
        return $this->filesystem->delete( $filename );
    }
}

Я могу успешно загрузить в корзину с помощью функции загрузки, сообщая мне, что файловая система существует и работает правильно.

Однако я не могу использовать Gaufrette\StreamWrapper для обслуживания файла с помощью BinaryFileResponse, как он говорит, что я должен это делать. Вместо этого он дает мне ошибку, которую я указал в заголовке: There is no filesystem defined for the "images" domain.

Файловая система определенно существует, так как я использую ее для загрузки изображений. Любые подсказки относительно того, в чем может быть проблема, которая мешает мне использовать эту файловую систему, были бы очень полезны. Документация Gaufrette действительно скудна в Интернете, насколько я знаю, но я собираюсь продолжать копать.


person Scott M    schedule 01.06.2016    source источник


Ответы (1)


Просмотр MainConfiguration.php показал, что в конфигурация для бандла. Я добавил это в свой config.yml, где файловые системы определены так:

knp_gaufrette:
  adapters:
    images:
        aws_s3:
            service_id: 'aws_s3_adapter.client'
            bucket_name: '%aws_bucket%'
            options:
                directory: 'images'
    .
    .
    .
  filesystems:
    images:
        adapter: images
        alias:   images_fs
    .
    .
    .
  stream_wrapper:
    filesystems: [ images, ... ]

и приведенный выше код теперь работает.

person Scott M    schedule 01.06.2016