【问题标题】:try upload file with symfony尝试使用 symfony 上传文件
【发布时间】:2018-06-05 08:25:41
【问题描述】:

我正在尝试使用 symfony 上传文件。但是当我将数据公式发送到控制器时出现错误。变量文件为空,函数移动文件不起作用。

代码实体(par uplaod):

<?php

    namespace AppBundle\Entity;

    use AppBundle\Model\CompanyInterface;
    use AppBundle\Model\RecruiterInterface;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    use Symfony\Component\Validator\Constraints as Assert;

    /**
     * Company.
     *
     * @ORM\Table(name="company")
     * @ORM\Entity(repositoryClass="AppBundle\Repository\CompanyRepository")
     */
    class Company implements CompanyInterface
    {
        /**
         * @var string
         *
         * @ORM\Column(name="id", type="guid")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="UUID")
         */
        private $id;

        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255, unique=true)
         */
        private $name;

        /**
         * @var string
         *
         * @ORM\Column(name="description", type="text")
         */
        private $description;

        /**
         * @var array
         *
         * @ORM\Column(name="activities", type="array")
         */
        private $activities;

        /**
         * @var RecruiterInterface
         *
         * @ORM\OneToOne(targetEntity="AppBundle\Entity\Recruiter", cascade={"persist"})
         */
        private $recruiter;

        /**
         * @var string
         *
         * @ORM\Column(name="path", type="string", length=255,nullable=true)
         */
        private $logo;

        /**
         * @Assert\File(maxSize="6000000")
         */
        private $file;

        /**
         * {@inheritdoc}
         */
        public static function create(string $name, RecruiterInterface $recruiter, string $description = '', array $activities = []): CompanyInterface
        {
            return new self($name, $recruiter, $description, $activities);
        }

        /**
         * {@inheritdoc}
         */
        public function update(string $name, string $description, array $activities): CompanyInterface
        {
            $this->name = $name;
            $this->description = $description;
            $this->activities = $activities;

            return $this;
        }

        /**
         * {@inheritdoc}
         */
        public function updateName(string $name): CompanyInterface
        {
            $this->name = $name;

            return $this;
        }

        /**
         * {@inheritdoc}
         */
        public function getId(): string
        {
            return $this->id;
        }

        /**
         * {@inheritdoc}
         */
        public function getName(): ?string
        {
            return $this->name;
        }

        /**
         * function setName.
         *
         * @param string $name
         *
         * @return string
         */
        public function setName(string $name)
        {
            $this->name = $name;

            return $this;
        }

        /**
         * function setDescription.
         *
         * @param string $description
         *
         * @return string
         */
        public function setDescription(string $description)
        {
            $this->description = $description;

            return $this;
        }

        /**
         * function setActivities.
         *
         * @param string $activities
         *
         * @return string
         */
        public function setActivities(string $activities)
        {
            $this->activities = $activities;

            return $this;
        }

        /**
         * {@inheritdoc}
         */
        public function getDescription(): ?string
        {
            return $this->description;
        }

        /**
         * {@inheritdoc}
         */
        public function getActivities()
        {
            return $this->activities;
        }

        /**
         * {@inheritdoc}
         */
        public function getRecruiter(): ?RecruiterInterface
        {
            return $this->recruiter;
        }

        /**
         * @return string
         */
        public function __toString()
        {
            return $this->name;
        }

        /**
         * {@inheritdoc}
         */
        public function updateLogo(string $logo): CompanyInterface
        {
            $this->logo = $logo;

            return $this;
        }

        /**
         * Get file.
         *
         * @return UploadedFile
         */
        public function getFile()
        {
            return $this->file;
        }

        /**
         * Sets file.
         *
         * @param UploadedFile $file
         */
        public function setFile(UploadedFile $file = null)
        {
            $this->file = $file;
        }

        /**
         * Set logo.
         *
         * @param string $logo
         *
         * @return Company
         */
        public function setLogo($logo)
        {
            $this->logo = $logo;

            return $this;
        }

        /**
         * Get logo.
         *
         * @return string
         */
        public function getLogo()
        {
            return $this->logo;
        }

        /**
         * function upload.
         */
        public function upload()
        {
            // the file property can be empty if the field is not required
            if (null === $this->getFile()) {
                return;
            }
     $this->file->move($this->getUploadRootDir(),$this->path);
            // set the path property to the filename where you've saved the file
            $this->logo = $this->getFile()->getClientOriginalName();

            // clean up the file property as you won't need it anymore
            //$this->file = null;
        }

        /**
         * function getUploadRootDir.
         */
        protected function getUploadRootDir()
        {
            return __DIR__.'/../../../web/uploads';
        }
    }    

code formType(内容变量文件):

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\FileType;

/**
 * Class CompanyType.
 */
class CompanyType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('description')
            ->add('activities', TextType::class)
            ->add('file', FileType::class)
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Company',
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return '';
    }
}

编码其他FormTyp(我使用form imbrique):

    namespace AppBundle\Form\Type;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use AppBundle\Entity\Recruiter;

    /**
     * Class RecruiterType.
     */
    class RecruiterType extends AbstractType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            parent::buildForm($builder, $options);
            $builder->remove('username');
            $builder->remove('plainPassword');
            $builder
                ->add('email')
                ->add('lastname')
                ->add('firstname')
                ->add('phone')
                ->add('civility', ChoiceType::class, array(
                    'choices' => ['Mr' => 'Mr', 'Mrs' => 'Mrs'], 'expanded' => true, 'multiple' => false,
                ))
                ->add('company', CompanyType::class)
                ;
        }

        /**
         * function get Parent Form.
         *
         * @return string
         */
        public function getParent()
        {
            return 'FOS\UserBundle\Form\Type\RegistrationFormType';
        }

        /**
         * name for this form.
         *
         * @return string
         */
        public function getBlockPrefix()
        {
            return '';
        }

        /**
         * name for this form.
         *
         * @return string
         */
        public function getName()
        {
            return $this->getBlockPrefix();
        }

        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => Recruiter::class,
                'allow_extra_fields' => true,
                'csrf_protection' => false,
            ));
        }
    }

函数帖(持久化对象):

public function post(array $parameters, bool $submitted = true, array $options = [])
        {
            /** @var Recruiter $recruiter */
            $recruiter = $this->formHandler->handle(
                $this->userManager->createRecruiter(),
                $parameters,
                Request::METHOD_POST,
                $submitted,
                $options
            );

            if (false === $submitted) {
                return $recruiter;
            }

            $recruiter->submit($parameters);

            if ($recruiter->isSubmitted() && $recruiter->isValid()) {
                $recruiter->getData()->setCompany($recruiter->getData()->getCompany());         
                $recruiter->getData()->getCompany()->upload();
                $this->em->persist($recruiter->getData());
                $this->em->flush();
                $event = new FormEvent($recruiter, $this->request);
                $this->eventDispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

                return $recruiter->getData();
            }

            return $recruiter;
        }

代码控制器:

<?php

    namespace AppBundle\Controller\Recruiter;

    use FOS\UserBundle\Controller\RegistrationController as BaseController;
    use FOS\UserBundle\Event\GetResponseUserEvent;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    use FOS\UserBundle\FOSUserEvents;
    use FOS\UserBundle\Event\FormEvent;
    use AppBundle\Handler\RecruiterHandler;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
    use AppBundle\Entity\Recruiter;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use AppBundle\Util\UserManagerr;

    /**
     * Class RegistrationRecruiterController.
     */
    class RegistrationRecruiterController extends BaseController
    {
        /**
         * @Template()
         * @Route("/register", name="register_recruiter")
         *
         * @param Request $request
         *
         * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
         */
        public function registerAction(Request $request)
        {
            try {
                $user = new UserManagerr();
                $dispatcher = $this->get('event_dispatcher');
                $user = $user->createRecruiter();

                $event = new GetResponseUserEvent($user, $request);
                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);

                if (null !== $event->getResponse()) {
                    return $event->getResponse();
                }

                $recruiter = $this->getHandler()->post($request->request->all(), $request->isMethod(Request::METHOD_POST));

                if ($recruiter instanceof Recruiter) {
                    $url = $this->generateUrl('fos_user_registration_check_email');
                    $response = new RedirectResponse($url);

                    return $response;
                }
            } catch (InvalidFormException $e) {
                $event = new FormEvent($form, $request);
                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_FAILURE, $event);

                return [
                    'form' => $e->getForm()->createView(),
                    'edit' => false,
                    'event' => $event->getResponse(),
                ];
            }

            return ['form' => $recruiter->createView()];
        }

        /**
         * @return RecruiterHandler
         */
        public function getHandler()
        {
            return $this->get(RecruiterHandler::class);
        }
    }

我使用表单 imbriqu(其他形式的表单),但是当我发送表单时,我有来自对象的所有变量,但变量文件有 null 并且函数 move 不起作用。

请问如何解决这个错误? 提前感谢您的帮助。

【问题讨论】:

  • 请帮帮我...
  • 代码很难看懂。你能用文件的完整命名空间更新它吗?您能否更新表格以参加完整的课程?
  • @albert 我更新了我的答案并添加了实体和表单的所有代码
  • 同时添加控制器
  • @albert 我添加代码控制器我的朋友

标签: php symfony


【解决方案1】:

您的问题可能在 for 标记中,您应该将其声明为:

{{ form_start(form, {'method': 'post', 'action': '', 'attr': {'class': '', 'novalidate': 'novalidate' }}) }}

【讨论】:

    【解决方案2】:

    改变这个

    public function post(array $parameters, bool $submitted = true, array $options = [])
    

    对于

    public function post(Request $request, bool $submitted = true, array $options = [])
    [...]
    $recruiter->submit($request);
    [...]
    

    【讨论】:

    • $parameters 是数组,是 $request->request->all();
    猜你喜欢
    • 2018-05-24
    • 2015-11-07
    • 2018-06-12
    • 2010-10-17
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2017-08-27
    相关资源
    最近更新 更多