#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)