Невозможно сохранить загруженные файлы в sonata media symfony 4.2 - PullRequest
0 голосов
/ 27 января 2019

Я загружаю несколько файлов мультимедиа из формы и пытаюсь сохранить их на носителе сонаты.Мои файлы загружаются, но, к сожалению, я не могу сохранить носитель и получить эту ошибку.

Служба "sonata.media.pool" не найдена: даже если она существует в контейнере приложения, контейнеревнутри «App \ Controller \ PagesController» находится меньший сервисный локатор, который знает только о «доктрине», «form.factory», «http_kernel», «parameter_bag», «request_stack», «router», «security.authorization_checker»,сервисы "security.csrf.token_manager", "security.token_storage", "serializer", "session", "templating" и "twig".Попробуйте вместо этого использовать внедрение зависимостей.

Это мой контроллер

    public function customerToken(Request $request)
{
    $CustomerToken = new CustomerToken();
    $form = $this->createForm(CustomerTokenFormType::class, $CustomerToken);
    $form->handleRequest($request);
    if ($request->isXmlHttpRequest()) {
        if ($form->isSubmitted() && $request->getMethod() == 'POST') {

           $files= $form->get('attachments')->getData();
           if(!empty($files)){
               foreach ($files as $file ){
                   $filename = md5(uniqid()) . '.' .$file->guessExtension();
                   $filePath = $_SERVER['DOCUMENT_ROOT'] . '/tmp/';
                   $path = sha1(uniqid(mt_rand(), true)) . '.' . $file->guessExtension();
                   $file->move($filePath, $filename);
                   $newfilePath = $filePath.$filename;//'http://127.0.0.1:8000/tmp/ec2a2874414744ae9596258199eecd59.jpeg'
                   $myfile = new UploadedFile($newfilePath, $filename);
                   $filemedia = $this->uploadMediaAction($myfile);
                   $CustomerToken->addMedium($filemedia['media']);
                   //unlink($filePath);//once file uploaded in media then remo
                   ///$CustomerToken->addMedium($file);
               }
           }
            // $form->getData() holds the submitted values
            // but, the original `$task` variable has also been updated
            $data = $form->getData();
            // ... perform some action, such as saving the task to the database
            // for example, if Task is a Doctrine entity, save it!
            $entityManager = $this->getDoctrine()->getManager();
            $data->setCreatedAt(new \DateTime('now'));
            $data->setUpdatedAt(new \DateTime('now'));
            $entityManager->persist($CustomerToken);
            $entityManager->flush();
            $success = true;
            return new JsonResponse(array('status' => $success));
        }
    }
    return $this->render('pages/your-token.html.twig', [
        'controller_name' => 'PagesController',
        'form' => $form->createView(),
    ]);
}

public function uploadMediaAction($file)
    {
        $MediaErrors = array();
        $MediaErrors['error'] = false;

        if (!$file instanceof UploadedFile) {
            $MediaErrors['message'] = ['Missing file.'];
            $MediaErrors['error'] = true;
        } else {
            $AllowedMimetypesImagesAndFile = array(
                'image/jpeg',
                'image/png',
                'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                'application/msword',
                'application/pdf',
                'application/x-pdf'
            );
            if (!in_array($file->getMimeType(), $AllowedMimetypesImagesAndFile)) {
                $MediaErrors['message'] = ['Invalid file/image.'];
                $MediaErrors['error'] = true;
            }
            if (!$MediaErrors['error']) {
                $mediaManager = $this->container->get('sonata.media.pool');
                $media = new Media();
                $media->setBinaryContent($file);
                $media->setContext('default');

                $media_sizes = getimagesize($file);
                $media->setWidth($media_sizes[0]);
                $media->setHeight($media_sizes[1]);



                $ImagemimeTypes = array('image/jpeg', 'image/png');
                $FilemimeTypes = array(
                    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                    'application/msword',
                    'application/pdf',
                    'application/x-pdf'
                );
                if (in_array($file->getMimeType(), $FilemimeTypes)) {
                    $media->setProviderName('sonata.media.provider.file');
                }
                if (in_array($file->getMimeType(), $ImagemimeTypes)) {
                    $media->setProviderName('sonata.media.provider.image');
                }
                $media->setEnabled(true);
                $mediaManager->save($media);
                $MediaErrors['media'] = $media;
            }
        }

        return $MediaErrors;
    }

Это моя сущность

            namespace App\Entity;

        use App\Application\Sonata\MediaBundle\Entity\Media;
        use Doctrine\Common\Collections\ArrayCollection;
        use Doctrine\Common\Collections\Collection;
        use Doctrine\ORM\Mapping as ORM;
        use Symfony\Component\Validator\Constraints as Assert;

        /**
         * @ORM\Table(name="cms_customer_token")
         * @ORM\Entity(repositoryClass="App\Repository\BaseRepository")
         */
        class CustomerToken extends Base
        {


            /**
             * @Assert\Regex(pattern="/^.*\.(jpg|jpeg|gif|JPG|png|PNG|pdf|PDF|doc|docx)$/", message="Not valid file, please select valid file format (PDF,PNG,JPG).")
             * @ORM\ManyToMany(targetEntity="App\Application\Sonata\MediaBundle\Entity\Media")
             * @ORM\JoinTable(name="cms_token_attachemnts",
             *      joinColumns={@ORM\JoinColumn(name="token_id", referencedColumnName="id")},
             *      inverseJoinColumns={@ORM\JoinColumn(name="media_id", referencedColumnName="id")}
             *      )
             */
            protected $media;

            public function __construct()
            {
                $this->media = new ArrayCollection();
            }

            /**
             * @return Collection|Media[]
             */
            public function getMedia(): Collection
            {
                return $this->media;
            }

            public function addMedium(Media $medium): self
            {
                if (!$this->media->contains($medium)) {
                    $this->media[] = $medium;
                }

                return $this;
            }

            public function removeMedium(Media $medium): self
            {
                if ($this->media->contains($medium)) {
                    $this->media->removeElement($medium);
                }

                return $this;
            }

        }

Services.yaml

sonata.media.pool:
    class: '%sonata.media.pool.class%'
    arguments: ['']
    public: true
...