Я хотел бы показать PDF-файл, который был загружен с помощью gaufrette.
Я получаю URI из Доктрины («wine_information / 1-wine_information.pdf»).
Но корневой каталог может быть другим, если он локальный или удаленный (Amazon s3).
Я попытался использовать ветку фильтра liip_imagine, чтобы использовать CacheManager.php и метод getBrowserPath, но я не могу создать его, потому что у меня нет фильтра для применения к моему PDF. это только для изображений.
и теперь я нашел это решение: https://github.com/KnpLabs/Gaufrette/issues/332#issuecomment-159849533
UploaderService.php
public function getPath($filePath)
{
$fileSystem = $this->container->get('gaufrette.' . $this->env . self::MEDIA_FILESYSTEM);
$adapter = $fileSystem->getAdapter();
$reflection = new \ReflectionClass($adapter);
$directory = $reflection->getProperty('directory');
$directory->setAccessible(true);
return $directory->getValue($adapter) . $filePath;
}
Когда он находится в локальном режиме, он возвращает следующий путь:
/home/company/projectName/web/media/wine_information/1-wine_information.pdf
но я хотел бы иметь реальную ссылку, чтобы установить в моем <a href="" target="_blanck"></a>
Я нашел решение. Я сделал фильтр ветки чтобы получить путь к файлу, загруженному с помощью gaufrette. Решения, используемые для Amazon S3 а также местный.
Приложение \ Config \ services.yml
app.aws_s3.client:
class: Aws\S3\S3Client
arguments:
-
version: '%amazon_s3.version%'
region: '%amazon_s3.region%'
credentials:
key: '%amazon_s3.key%'
secret: '%amazon_s3.secret%'
html.twig
<a class="btn btn-primary" href="{{ pdf|get_path }}" target="_blank">Afficher le PDF actuel</a>
AppBundle \ Resources \ Config \ services.yml
app.twig_filter_extension:
class: AppBundle\Twig\AppFilterExtension
public: true
arguments:
- '%kernel.environment%'
- '%prod_env%'
- '%kernel.root_dir%'
- '@router.request_context'
- '@app.aws_s3.client'
- '%amazon_s3.media_bucket%'
tags:
- { name: twig.extension }
AppBundle \ Twig \ AppFilterExtension.php
<?php
namespace AppBundle\Twig;
use Aws\S3\S3Client;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Routing\RequestContext;
class AppFilterExtension extends \Twig_Extension
{
/**
* @var string
*/
private $env;
/**
* @var bool
*/
private $prodEnv;
/**
* @var S3Client
*/
private $s3Client;
/**
* @var string
*/
private $s3Bucket;
/**
* @var Filesystem
*/
private $fileSystem;
/**
* @var string
*/
private $rootPath;
/**
* @var string
*/
private $baseUrl;
/**
* AppFilterExtension constructor.
*
* @param string $env
* @param bool $prodEnv
*/
public function __construct(string $env, bool $prodEnv, string $rootDir, RequestContext $requestContext, S3Client $s3Client, string $s3Bucket)
{
$this->env = $env;
$this->prodEnv = $prodEnv;
$this->fileSystem = new Filesystem();
$this->s3Client = $s3Client;
$this->s3Bucket = $s3Bucket;
$this->rootPath = $rootDir . '/../web/';
$this->baseUrl = sprintf('%s://%s', $requestContext->getScheme(), $requestContext->getHost());
}
public function getFilters()
{
return [
new \Twig_SimpleFilter('get_path', [$this, 'getPath']),
];
}
/**
* @param string $uri
* @param null|string $folder
*
* @return string
*/
public function getPath(string $uri, string $folder = null)
{
if (
(
'dev' === $this->env ||
false === $this->prodEnv
) &&
true === $this->fileSystem->exists(str_replace('//', '/', sprintf('%s/%s/%s', $this->rootPath, ($folder ?? 'media'), $uri)))
) {
return $this->baseUrl . str_replace('//', '/', sprintf('/%s/%s', ($folder ?? 'media'), $uri));
}
return str_replace('//', '/', $this->s3Client->getObjectUrl($folder ?? $this->s3Bucket, $uri));
}
/**
* @return string
*/
public function getName()
{
return 'app_filter_extension';
}
}
Других решений пока нет …