尝试使用symfony上传文件

时间:2017-12-22 18:08:25

标签: php symfony

我正在尝试使用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);
        }
    }

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

如何解决此错误? 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

更改此

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

对于

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

答案 1 :(得分:0)

Your issue is probably in the for tag, which you should declare it like:

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