程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Symfony 服务 FileUploader 不自动装配大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Symfony 服务 FileUploader 不自动装配?

开发过程中遇到Symfony 服务 FileUploader 不自动装配的问题如何解决?下面主要结合日常开发的经验,给出你关于Symfony 服务 FileUploader 不自动装配的解决方法建议,希望对你解决Symfony 服务 FileUploader 不自动装配有所启发或帮助;

我已按照 Symfony 5.2 教程添加 fileUploader 作为服务 (https://symfony.com/doc/current/controller/upload_file.html)。

这是我的service.yaml

parameters:
  targetDirectory: '%kernel.project_dir%/public/uploads/'
  prevIEws_vIDeo: '%kernel.project_dir%/public/uploads/prevIEws'
  brochures_directory: '%kernel.project_dir%/public/uploads/brochures'
services:
  App\service\fileUploader:
      arguments:
          $targetDirectory: '%prevIEws_vIDeo%'

这是我的fileUploader.php

<?php


namespace App\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($targetDirectory,SluggerInterface $slugger)
    {
        $this->targetDirectory = $targetDirectory;
        $this->slugger = $slugger;
    }

    public function upload(Uploadedfile $filE)
    {
        $originalfilename = pathinfo($file->getClIEntOriginalname(),PATHINFO_fileName);
        $safefilename = $this->slugger->slug($originalfileName);
        $filename = $safefilename.'-'.uniqID().'.'.$file->guessExtension();

        try {
            $file->move($this->getTargetDirectory(),$fileName);
        } catch (fileException $E) {
            // ... handle exception if something happens during file upload
        }

        return $filename;
    }

    public function getTargetDirectory()
    {
        return $this->targetDirectory;
    }
}

但是我遇到了这个常见错误:

无法解析“App\Controller\VIDeoController::edit()”的参数$fileUploader:无法自动装配服务“App\service\fileUploader”:方法“__construct()”的参数“$targetDirectory”没有类型提示,您应该明确配置其值。

被这个控制器调用:

 /**
 * @Route("/{ID}/edit",name="vIDeo_edit",methods={"GET","POST"})
 * @param request $request
 * @param VIDeo $vIDeo
 * @param fileUploader $fileUploader
 * @return Response
 */
public function edit(request $request,VIDeo $vIDeo,fileUploader $fileUploader): Response
{...}

我该如何解决这个问题?我尝试通过删除 String 类型,添加字符串类型,从 services.yaml 中的 targetDirectory 参数中删除 $ ......现在几个小时...

解决方法

您应该将自动装配配置添加到您的服务文件中:

parameters:
  targetDirectory: '%kernel.project_dir%/public/uploads/'
  previews_video: '%kernel.project_dir%/public/uploads/previews'
  brochures_directory: '%kernel.project_dir%/public/uploads/brochures'
services:
  # To add:
  _defaults:
      autowire: true
      autoconfigure: true
  # You service
  App\service\FileUploader:
      arguments:
          $targetDirectory: '%previews_video%'
,

在构造函数中为 String 添加类型提示 $targetDirectory

public function __construct(String $targetDirectory,SluggerInterface $slugger)
{
    $this->targetDirectory = $targetDirectory;
    $this->slugger = $slugger;
}
,

看看我的工作 services.yaml。我已经更改了命名空间

应用\服务

应用\服务

而且我还在文件末尾添加了服务声明。

看起来服务中的行顺序很重要。首先,我在 services 部分的顶部添加了声明,但是 autowiring 是在之后声明的,猜测错误在这里...

# This file is the entry point to configure your own services.
# Files in the packages/ subdirectory configure your dependencies.

# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    previews_directory: '%kernel.project_dir%/public/uploads/previews'
services:
  #i've added my service here at first... 
    app.menu_builder:
        class: App\Menu\MenuBuilder
        arguments: ["@knp_menu.factory"]
        tags:
            - { name: knp_menu.menu_builder,method: createMainMenu,alias: main }
    # 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.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'
            - '../src/Tests/'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller/'
        tags: ['controller.service_arguments']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

    App\services\FileUploader:
        arguments:
            $targetDirectory: '%previews_directory%'

大佬总结

以上是大佬教程为你收集整理的Symfony 服务 FileUploader 不自动装配全部内容,希望文章能够帮你解决Symfony 服务 FileUploader 不自动装配所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:服务