Использовать параметры в Symfonybundle в классе обслуживания

#php #symfony #symfony5

#php #symfony #symfony5

Вопрос:

У меня есть пакет Symfony, который называется upload images:

Я хочу использовать параметры из моего пакета в моем классе.

Это мой файл параметров:

 upload-images:
             image:
                  crop_size: 300
  

Мои файлы:

Configuration.php

 class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder('upload-images');

        $treeBuilder->getRootNode()
                ->children()
                    ->arrayNode('image')
                        ->children()
                            ->integerNode('save_original')->end()
                            ->scalarNode('crop_size')->end()
                        ->end()
                    ->end() // twitter
                ->end();
        return $treeBuilder;
    }
}
  

UploadImagesExtension.php

 class UploadImagesExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader($container, new FileLocator(dirname(__DIR__).'/Resources'));
        $loader->load('services.yaml');

        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);
    }
}
  

И, наконец, мой класс обслуживания:

Rotate.php

И в этом классе я хочу параметр: crop_size

Я попробовал ParameterBagInterface:

 use SymfonyComponentDependencyInjectionParameterBagParameterBagInterface;

class Rotate
{
    private $params;

    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }

    public function Rotate()
    {
        $cropSize = $params->get('crop_size');
    }

}
  

UserController.php

 use verzeilbergUploadImagesBundleServiceRotate;

class UserController extends AbstractController
{

    /** @var UserProfileService */
    private $service;

    private $userService;


    public function __construct(
        UserProfileService $service,
        UserService $userService
    ) {
        $this->service = $service;
        $this->userService = $userService;
    }

    /**
     * @param UserInterface $user
     * @return Response
     */
    public function profile(UserInterface $user)
    {
        $rotate = new Rotate();

        $rotate->Rotate();
.....



...
}

Getting this error:

  

Слишком мало аргументов для функции verzeilbergUploadImagesBundleServiceRotate::__construct(), 0 передано в /home/vagrant/projects/diabetigraph-dev/src/Controller/User/UserController.php в строке 62 и ожидается ровно 1

 
I have search for a solution. But did not came accross the right one. 

  

Комментарии:

1. Какой у вас точный вопрос по поводу всего этого? Что мешает вам вводить параметры в класс?

2. Я продолжаю получать сообщения об ошибках, поэтому я подумал, что, возможно, мой подход неверен. Я попробовал пару вещей, но продолжаю получать сообщение об ошибке «Передано слишком мало аргументов»…

3. Почему бы не поделиться этими ошибками?

4. Отредактировал сообщение

5. Пожалуйста, поделитесь более подробной информацией. В этом сообщении об ошибке указан класс — что делает UserController.php содержать в строке 62?

Ответ №1:

Согласно последней правке, ошибка довольно очевидна: если вы хотите использовать внедрение зависимостей, вы должны использовать это. Вызов $rotate = new Rotate(); без каких-либо параметров конструктора завершится неудачей, поскольку Symfony не может ввести их для вас.

Вместо этого введите его с помощью действия:

 public function profile(UserInterface $user, Rotate $rotate)
  

… при этом будет использоваться контейнер Symfony и внедряться ParameterBagInterface , если вы включили автоматическое подключение. Если нет, вам нужно написать надлежащие определения сервисов, чтобы это сделать

Комментарии:

1. У меня включен автозапуск. И получаю эту ошибку: Не удается автоматически подключить аргумент $ rotate «App Controller User UserController::profile()»: он ссылается на класс «verzeilberg UploadImagesBundle Service Rotate», но такой службы не существует.

2. Похоже, вам не хватает правильного импорта?

3. Извините, что вы имеете в виду? Я импортирую файл с помощью: use verzeilbergUploadImagesBundle Service Rotate;

4. …. и этот класс использует это пространство имен и размещается по правильному пути? Затем пришло время предоставить весь код таким образом, чтобы другие могли воспроизвести вашу проблему

5. Решена проблема: когда я добавил этот код в service.yaml, это устранило проблему: verzeilbergUploadImagesBundle Service Rotate: автозапуск: true

Ответ №2:

Ошибка, которую вы получаете, напрямую не связана с вашим вопросом.

Либо это проблема с автозапуском, или, может быть, вы пытаетесь создать экземпляр сервиса вручную? Пожалуйста, поделитесь, что вы здесь делаете: UserController.php on line 62

В любом случае, чтобы ответить на ваш вопрос:

Чтобы получить доступ к параметрам из пакета параметров, вам нужно будет установить их в расширении.

$container->setParameter('my_bundle.config', $config);

Кроме того, внедрение всего набора параметров подходит для проекта, но его следует избегать для пакета.

Используйте конфигурацию DI, чтобы ввести только свой параметр или реализовать свое расширение CompilerPassInterface и переопределить определение там. (Это может быть излишним для такой простой задачи)

Комментарии:

1. Вы пытаетесь создать его самостоятельно. Используйте DIC. профиль общедоступной функции (UserInterface $user, Rotate $rotate)