Cara memasukkan objek pengguna ke dalam Repositori formulir di Symfony 2.8

Saya sedang mengembangkan aplikasi web di Symfony. Saya memiliki 2 entitas yaitu pertanyaan tentang, "Line" dan "Dosier". Jadi, 1 dosier bisa memiliki banyak baris. Sekarang saya mengimplementasikan CRUD untuk entitas Line, sehingga entitas Line memiliki "dropdown" dengan semua Dosier dari DataBase. Masalahnya adalah di dropdown ada semua dosier dari pengguna mana pun, tetapi saya perlu di dropdown ini hanya memiliki opsi yang memiliki user_id = currentUser_id.

Jadi, tindakan pengontrol saya:

/**
 * @Route("/add-line", name="addLine")
 */
public function createLineAction(Request $request)
{
  $em = $this->getDoctrine()->getManager();
  $user = $this->getUser();
  $line = new Line();
  $form = $this->createForm(LineType::class, $line);

  $form->handleRequest($request);

  if($form->isSubmitted() && $form->isValid()){
      $em->persist($line);
      $em->flush();

   return $this->redirectToRoute('homepage');
  }

  return $this->render('AppBundle:default:formLines.html.twig', array(
      'form' => $form->createView(),
  ));
}//create dossier action

LineType saya (pembuat formulir)

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class LineType extends AbstractType
{


    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')->add('dosier')
            ->add('dosier', EntityType::class, array(
                'class' => 'AppBundle:Dosier',
                'query_builder' => function($repo) {
                    return $repo->dosiersOfCurrentUser();
                },  
                'choice_label' => 'name',
                ))
            ->add('save', SubmitType::class, array(
                'label' => 'Save',
                 'attr'=> array('class'=>'btn btn-success submitButton') 
                 )
            );

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Line'
        ));
    }

    public function getBlockPrefix()
    {
        return 'appbundle_line';
    }


}

Line.php saya (entitas)

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
 * Line
 *
 * @ORM\Table(name="line")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\LineRepository")
 */
class Line
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Dosier", inversedBy="lines")
     * @ORM\JoinColumn(name="dosier_id", referencedColumnName="id")
     */
    private $dosier;


    /**
     * @ORM\OneToMany(targetEntity="Loan", mappedBy="line")
     */
    private $loans;


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


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


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

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

        return $this;
    }

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

    /**
     * Add loan
     *
     * @param \AppBundle\Entity\Loan $loan
     *
     * @return Line
     */
    public function addLoan(\AppBundle\Entity\Loan $loan)
    {
        $this->loans[] = $loan;

        return $this;
    }

    /**
     * Remove loan
     *
     * @param \AppBundle\Entity\Loan $loan
     */
    public function removeLoan(\AppBundle\Entity\Loan $loan)
    {
        $this->loans->removeElement($loan);
    }

    /**
     * Get loans
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getLoans()
    {
        return $this->loans;
    }

    /**
     * Set dosier
     *
     * @param \AppBundle\Entity\Dosier $dosier
     *
     * @return Line
     */
    public function setDosier(\AppBundle\Entity\Dosier $dosier = null)
    {
        $this->dosier = $dosier;

        return $this;
    }

    /**
     * Get dosier
     *
     * @return \AppBundle\Entity\Dosier
     */
    public function getDosier()
    {
        return $this->dosier;
    }
}

dan repositori saya: DosierRepository.php

<?php

namespace AppBundle\Repository;


use Doctrine\ORM\EntityRepository;

class DosierRepository extends \Doctrine\ORM\EntityRepository
{
    public function dosiersOfCurrentUser() {
        return $this->createQueryBuilder('dosier')
            ->where('dosier.userId = 1 ')
            ->orderBy('dosier.name', 'DESC'); 
    }
}

Bagaimana saya bisa mendapatkan pengguna saat ini, atau setidaknya id pengguna saat ini, untuk membuat kueri seperti ... pilih dari Dosier di mana dosier.user_id = $???


person new_newB1e    schedule 30.10.2017    source sumber


Jawaban (1)


Di pengontrol tempat Anda membuat formulir, Anda perlu meneruskan objek pengguna ke tipe formulir Anda

$tokenStorage = $this->get('security.token_storage');
$form = $this->createForm(new LineType($tokenStorage), $line);
//... other stuff

Sekarang di formulir Anda, terima objek tokenStorage ini dan ambil objek pengguna dan teruskan ke fungsi repo Anda

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
//.. other use statements

class LineType extends AbstractType
{

    private $user;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->user = $tokenStorage->getToken()->getUser();
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $userId = $this->user->getId();
        $builder
            ->add('name')->add('dosier')
            ->add('dosier', EntityType::class, array(
                'class' => 'AppBundle:Dosier',
                'query_builder' => function($repo) use($userId) {
                    return $repo->dosiersOfCurrentUser($userId);
                },  
                'choice_label' => 'name',
                ))
            ->add('save', SubmitType::class, array(
                'label' => 'Save',
                 'attr'=> array('class'=>'btn btn-success submitButton') 
                 )
            );

    }
}

Dalam repo, terapkan filter Anda

class DosierRepository extends \Doctrine\ORM\EntityRepository
{
    public function dosiersOfCurrentUser($userId) {
        return $this->createQueryBuilder('dosier')
            ->where('dosier.userId = :userId ')
            ->setParameter('userId',$userId)
            ->orderBy('dosier.name', 'DESC'); 
    }
}
person M Khalid Junaid    schedule 30.10.2017
comment
Terima kasih atas jawaban Anda. Semuanya tampak baik-baik saja, kecuali kesalahan itu: Pemuat otomatis mengharapkan kelas AppBundle\Form\LineType didefinisikan dalam file /home/computer/project/src/AppBundle/Form/LineType.php. File ditemukan tetapi kelas tidak ada di dalamnya, nama kelas atau namespace mungkin salah ketik. Jika saya meletakkan LineRepository atau DosierRepository di folder Form, saya mendapatkan kesalahan yang sama, atau jika saya mengubah alamat direktori di entitas/Loan.php ... sama. - person new_newB1e; 31.10.2017
comment
@new_newB1e mungkin ada yang salah dengan ruang nama atau nama kelas Anda, lihat stackoverflow.com/questions/19080796/ dan yang serupa oleh google - person M Khalid Junaid; 31.10.2017
comment
Oh, maaf, saya baru saja mengamati bahwa di banyak file ini... LineType.php saya tidak memiliki pernyataan namespace. Semuanya berfungsi dengan baik, terima kasih atas bantuan Anda! - person new_newB1e; 31.10.2017