在服务类的Symfonybundle中使用参数

问题描述

我有一个称为上传图像的Symfony捆绑包:

我想在课堂上的捆绑软件中使用参数。

这是我的参数文件

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 Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class Rotate
{
    private $params;

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

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

}

UserController.PHP

use verzeilberg\UploadImagesBundle\Service\Rotate;

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:

verzeilberg \ UploadImagesBundle \ Service \ Rotate :: __ construct()函数的参数太少,第62行的/home/vagrant/projects/diabetigraph-dev/src/Controller/User/UserController.PHP中传递了0,正好是1预期的


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

解决方法

您遇到的错误与您的问题没有直接关系。

这是一个自动装配问题,还是您试图手动实例化该服务?请在这里分享您正在做的事情:<input asp-for="EBook" class="form-control " type="file" accept=".pdf" />

无论如何,回答您的问题:

要从参数包中访问参数,必须在扩展名中进行设置。

using (var fs = new FileStream(tempPdfPath,FileMode.Create)) { await model.EBook.CopyToAsync(fs); }

另外,注入整个ParameterBag对于项目来说很好,但对于捆绑包则应避免。

使用DI配置仅注入您的参数,或者使扩展实现UserController.php on line 62,并在那里覆盖其定义。 (对于这样一个简单的任务,可能太过夸张了)

,

根据最新的编辑,该错误非常明显:如果要使用依赖注入,则必须使用它。没有Symfony无法为您注入它们而没有任何构造函数参数调用$rotate = new Rotate();将会失败。

相反,通过操作将其注入:

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

...如果启用了自动装配,它将使用Symfony的容器并注入ParameterBagInterface。如果没有,则必须编写正确的服务定义才能完成此操作