VichUploader uri_prefix не учитывает среду

1

Я использую VichUploaderBundle в своем проекте.
Я не могу получить ссылку на скачивание (при использовании vich_file формы vich_file), чтобы учесть окружающую среду (особенно dev). Который я хочу сделать, поскольку хочу направить функцию загрузки через функцию.

Мой конфиг похож;

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, независимо от среды.
Когда в среде dev это должно быть http://example.com/app_dev.php/foo/image/fubar.jpg или в тестовой среде http://example.com/app_test.php/foo/image/fubar.jpg

  • 0
    зачем вам это? Это статические файлы, поэтому они не должны обрабатываться контроллером внешнего интерфейса.
  • 0
    @CarlosGranados, потому что я хочу, чтобы изображения находились над веб-корнем, поэтому доступ к ним возможен только через функцию, где я могу проверить учетные данные перед отправкой изображения.
Теги:
vichuploaderbundle

1 ответ

0
Лучший ответ

Возможным решением является использование пользовательского класса namer файлов, который имеет доступ к классу маршрутизатора. В настройке конфигурации uri_prefix to /

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

Создайте класс namer службы, который возвращает полный 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 }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню