Documentation

6.1 Storage configuration

Integrated allows you to put files in one or multiple storages. These can be local, in the cloud or any other location supported by a Gaufrette adaptor. 

Basic configuration

Integrated uses knplabs/knp-gaufrette-bundle for configuration and a filesystem map. When you've enabled the bundle, this config below is required for a default Integrated installation.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<pre>// app/config.yml
knp_gaufrette:
    adapters:
        foo:
            local:
                directory: %kernel.root_dir%/../web/uploads/documents
    filesystems:
        foo:
            adapter: foo
 
integrated_storage:
    resolver:
        foo:
            public: /files</pre>

Please see the KnpGaufretteBundle documentation for all available options.

Using multiple filesystems

The StorageBundle places the files on all known filesystems when no destination map exists. The order defined in the configuration will be used to determine its primary path.

Storage resolver

When a filesystem has no resolver storage (for protected files), components which use the public URL will not be able to access the file. The filesystems (foo above) in the knp_gaufrette configuration are linked to the integrated_storage configuration. Based on the key(s), a resolver or decision map entry is linked to a filesystem.

Using a decision map

Additionally, to protected entities from being stored in a public accessible resource, a developer can configure filesystems for entities. You can enforce entities to be stored in specific storage(s).

1
2
3
4
5
<pre>// app/config.yml
integrated_storage:
    // ...
    decision_map:
        "Integrated\Bundle\ContentBundle\Document\File": [foo]</pre>

The redistribution command does not make use of the decision map and copies all files in the given storage.

Protecting files

In some cases the files may not be stored in a publicly available directory. You can do this by adding an additional private local storage. However, files can also be stored on any remote location by not defining a resolver.

A controller might look like the following:

1
2
3
4
<pre><span class="x">// File is a Integrated\Common\Content\Document\FileInterface object    </span>
<span class="p">$</span><span class="nv">response</span><span class="x"> = new Response();</span>
<span class="p">$</span><span class="nv">response</span><span class="x">->setContent(</span><span class="p">$</span><span class="nv">file</span><span class="x">->getContent());</span>
<span class="p">$</span><span class="nv">response</span><span class="x">->setHeaders(</span><span class="p">$</span><span class="nv">file</span><span class="x">->getMetadata()->getHeaders());</span></pre>