2015-10-20 97 views
1

我在我的项目中使用了VichUploaderBundle
我无法获得下载链接(使用vich_file表单类型时)考虑环境(特别是dev)。我希望通过函数路由下载功能。VichUploader uri_prefix未考虑环境

我的配置就像;

vich_uploader: 
    db_driver: orm 
    twig:  true 
    mappings: 
     logo_image: 
      uri_prefix:   /foo/image 
      upload_destination: %kernel.root_dir%/../app/private/images 
      inject_on_load:  false 
      delete_on_update: true 
      delete_on_remove: true 

而且这会生成下载URI的http://example.com/foo/image/fubar.jpg,无论环境如何。
当开发环境应该是http://example.com/app_dev.php/foo/image/fubar.jpg,或在测试环境中 http://example.com/app_test.php/foo/image/fubar.jpg

+0

为什么你需要这个?这些都是静态文件,所以它们不应该由前端控制器 –

+0

@CarlosGranados来处理,因为我希望图像位于Web根目录之上,因此只能通过可以在提供图像之前检查证书的功能来访问。 – Rooneyl

回答

0

一个可能的解决方案是使用具有访问路由器类的自定义文件命名器类。 在配置设置uri_prefix/

vich_uploader: 
    db_driver: orm 
    twig:  true 
    mappings: 
     logo_image: 
      uri_prefix:  /
      upload_destination: %kernel.root_dir%/../app/private/images 
      inject_on_load:  false 
      delete_on_update: true 
      delete_on_remove: true 
      namer: my.namer.foo 

创建服务命名器类与所需的(有参数)的路线返回完整的URL;

<?php 
namespace AppBundle\Service; 

use Vich\UploaderBundle\Naming\NamerInterface, 
    Vich\UploaderBundle\Mapping\PropertyMapping; 
use Symfony\Bundle\FrameworkBundle\Routing\Router; 
class MyNamer implements NamerInterface 
{ 

    private $router; 

    public function __construct(Router $router) 
    { 
     $this->router = $router; 
    } 

    public function name($foo, PropertyMapping $mapping) 
    { 
     $router = $this->router->getContext(); 
     $full_url = $router->getHost(); 
     $full_url .= $router->getBaseUrl().'/'; 
     $full_url .= 'foo/logo/'.strtolower($foo->getName()); 
     return $full_url; 
    } 

} 

将其注册为服务;

services: 
    my.namer.foo: 
     class: AppBundle\Service\MyNamer 
     arguments: ['@router'] 
     tags: 
      - { name: namer }