我只是想知道如何在flysystem bundle中获得指定的文件存储实例。例如如果我有这样的配置:
flysystem:
storages:
first.storage:
adapter: 'local'
options:
directory: '%kernel.project_dir%/var/storage/storage/first'
second.storage:
adapter: 'local'
options:
directory: '%kernel.project_dir%/var/storage/default/second'
我想根据工厂中的一些参数来抓取它。像这样:
$fileSystemStorage = (new FileSystemFactory()->getStorage('second');
这是我的工厂:
class FileSystemFactory
{
public function getStorage(string $storage): FilesystemOperator
{
switch ($storage) {
case 'first':
break;
case 'second':
break;
}
}
}
我只是不知道如何手动定义我想从flysystem.yaml中抓取哪些选项。
在文档中,它说我可以像这样注入它(name camelcase from configuration):https://github.com/thephpleague/flysystem-bundle
public function __construct(FilesystemOperator $firstStorage)
{
$this->storage = $firstStorage;
}
但是在我的情况下,我想根据参数手动定义它。当然,我可以创建两个类有两个不同的注入($firstStorage和$secondStorage),然后从这些类返回对象,但也许有一些更简单的方法?
已更新!!
我有非常类似的问题,我通过使用ContainerInterface和服务别名(flysystem服务不是公共的)来解决它:
// config/services.yaml
services:
// ...
// we need this for every storage,
// flysystems services aren't public and we can solve this using aliases
first.storage.alias:
alias: 'first.storage'
public: true
<?php
use SymfonyComponentDependencyInjectionContainerInterface;
class FileSystemFactory
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function getStorage(string $storage)
{
$storageContainer = $this->container->get($storage); // ex. first.storage.alias
switch ($storageContainer) {
case 'first':
break;
case 'second':
break;
}
}
}
如果你通读一下FlySystemBundle的文档,你会发现它支持在运行时延迟加载存储:
链接到文档
如果通过ENV变量(或参数)设置不能满足您的需求,您可以利用LazyFactory本身并直接通过Lazyfactory::createStorage
方法使用它。
如果这还不能满足你的需要,你可以复制这个类,并给它分配CompilerPass,然后按照你想要的方式配置它。