Я получил класс использования для загрузки файла как службы, как symfony документация. https://symfony.com/doc/current/controller/upload_file.html#creating -an-uploader-service
Я использую symfony 5.
Когда я объявляю службу в main config / services.yaml, эта работа.
Но у меня есть пакет для управления файлами, и я хочу поместить объявление службы в этот пакет: App / AD / ExplorerBundle / Resources / config / services.yaml.
Когда я это делаю, это больше не работает.
У меня ошибка
Невозможно разрешить аргумент $ fileUploader для "App \ AD \ ExplorerBundle \ Controller \" FileController :: addAction () ": Невозможно автоматически подключить службу" App \ AD \ ExplorerBundle \ Service \ FileUploader ": аргумент" $ targetDirectory "метода" __construct () "является подсказкой типа" строка ", вы должны явно указать его значение.
Я не понимаю почему, потому что _defaults autoconfigure и autowire = true
Я проверяю кеш: очистить, перезагрузить сервер, но ничего не работает.
Любая помощь будет цениться
Редактировать: расширение моего пакета: в AD \ ExplorerBundle \ DependencyInjection
<?php
namespace App\AD\ExplorerBundle\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
/**
* This is the class that loads and manages your bundle configuration.
*
* @link http://symfony.com/doc/current/cookbook/bundles/extension.html
*/
class ADExplorerExtension extends Extension
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
}
}
мой сервис пакета: в AD \ ExplorerBundle \ Service
<?php
namespace App\AD\ExplorerBundle\Service;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\String\Slugger\SluggerInterface;
class FileUploader
{
private $targetDirectory;
private $slugger;
public function __construct(string $targetDirectory, SluggerInterface $slugger)
{
$this->targetDirectory = $targetDirectory;
$this->slugger = $slugger;
}
public function upload(UploadedFile $file): array
{
$originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = $this->slugger->slug($originalFilename);
$fileName = $safeFilename.'-'.uniqid().'.'.$file->guessExtension();
$result = array(
'filename' => $fileName,
'originalName' => $originalFilename,
'extension' => $file->guessExtension()
);
try {
$file->move($this->getTargetDirectory(), $fileName);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
return $result;
}
public function getTargetDirectory()
{
return $this->targetDirectory;
}
}
мой config / services.yaml
parameters:
locale: 'fr'
doctrine_behaviors_translatable_fetch_mode: "LAZY"
doctrine_behaviors_translation_fetch_mode: "LAZY"
imports:
- { resource: '@ADCoreBundle/Resources/config/services.yml' }
- { resource: './parameters.yaml' }
services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
мой сервис Bundle: в AD \ ExplorerBundle \ Resources \ config \ service.yaml
parameters:
brochures_directory: '%kernel.project_dir%/public/uploads'
services:
ad_file_uploader:
class: App\AD\ExplorerBundle\Service\FileUploader
arguments:
$targetDirectory: '%brochures_directory%'
Я читаю документацию: https://symfony.com/doc/current/bundles/extension.html
https://symfony.com/doc/current/service_container.html#manually -провода-аргументы
https://symfony.com/doc/current/service_container/autowiring.html
Я действительно не понимаю этого:
Publi c и многоразовые пакеты¶
Publi c связки следует явно настроить свои сервисы и не полагаться на автопроводку. Автопроводка зависит от сервисов, доступных в контейнере, и пакеты не контролируют сервисный контейнер приложений, в которые они включены. Вы можете использовать автопроводку при создании пакетов многократного использования в вашей компании, так как у вас есть полный контроль над всем кодом.
Я думаю, что все в порядке, потому что это мой пакет и мое приложение, поэтому у меня полный контроль над кодом.
Итак, я тестирую много вещей, но ничего не получается.
Если у кого есть идея Спасибо