收集字段类型的数据转换器

时间:2014-08-06 13:31:09

标签: php symfony

我正在创建一个聊天系统。我有两个实体Chat和ChatThread。

namespace Acme\UitBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Chat
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Acme\UitBundle\Entity\ChatRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Chat
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

 /**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="chats")
 * @ORM\JoinColumn(name="uid", referencedColumnName="id")
 */
private $user;

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

/**
 * @ORM\ManyToOne(targetEntity="ChatThread", inversedBy="chats")
 * @ORM\JoinColumn(name="tid", referencedColumnName="id")
 */
private $thread;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="date", type="datetime")
 */
private $date;

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

/**
 * Set user
 *
 * @param \stdClass $user
 * @return Chat
 */
public function setUser($user)
{
    $this->user = $user;

    return $this;
}

/**
 * Get user
 *
 * @return \stdClass 
 */
public function getUser()
{
    return $this->user;
}

/**
 * Set msg
 *
 * @param string $msg
 * @return Chat
 */
public function setMsg($msg)
{
    $this->msg = $msg;

    return $this;
}

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

/**
 * Set date
 *
 * @param \DateTime $date
 * @return Chat
 */
public function setDate($date)
{
    $this->date = $date;

    return $this;
}

/**
 * Get date
 *
 * @return \DateTime 
 */
public function getDate()
{
    return $this->date;
}

/**
* @ORM\PrePersist
*/
public function setDateValue()
{
$this->date = new \DateTime();
}



/**
 * Set thread
 *
 * @param \Acme\UitBundle\Entity\ChatThread $thread
 * @return Chat
 */
public function setThread(\Acme\UitBundle\Entity\ChatThread $thread = null)
{
    $this->thread = $thread;

    return $this;
}

/**
 * Get thread
 *
 * @return \Acme\UitBundle\Entity\ChatThread 
 */
public function getThread()
{
    return $this->thread;
}
}

实体 ChatThread

 namespace Acme\UitBundle\Entity;

 use Doctrine\ORM\Mapping as ORM;
 use Doctrine\ORM\Mapping\OrderBy;
 use Doctrine\Common\Collections\ArrayCollection;

/**
* ChatThread
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Acme\UitBundle\Entity\ChatThreadRepository")
*/
class ChatThread
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

 /**
 * @ORM\ManyToMany(targetEntity="User", inversedBy="inside")
 */
private $inside;


/**
* @ORM\OneToMany(targetEntity="Chat", mappedBy="thread")
* @OrderBy({"date" = "DESC"})
*/
private $chats;


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


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

/**
 * Set inside
 *
 * @param array $inside
 * @return ChatThread
 */
public function setInside($inside)
{
    $this->inside = $inside;

    return $this;
}

/**
 * Get inside
 *
 * @return array 
 */
public function getInside()
{
    return $this->inside;
}

/**
 * Add inside
 *
 * @param \Acme\UitBundle\Entity\User $inside
 * @return ChatThread
 */
public function addInside(\Acme\UitBundle\Entity\User $inside)
{
    $this->inside[] = $inside;

    return $this;
}

/**
 * Remove inside
 *
 * @param \Acme\UitBundle\Entity\User $inside
 */
public function removeInside(\Acme\UitBundle\Entity\User $inside)
{
    $this->inside->removeElement($inside);
}

/**
 * Add chats
 *
 * @param \Acme\UitBundle\Entity\Chat $chats
 * @return ChatThread
 */
public function addChat(\Acme\UitBundle\Entity\Chat $chats)
{
    $this->chats[] = $chats;

    return $this;
}

/**
 * Remove chats
 *
 * @param \Acme\UitBundle\Entity\Chat $chats
 */
public function removeChat(\Acme\UitBundle\Entity\Chat $chats)
{
    $this->chats->removeElement($chats);
}

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

我想要做的是将用户添加到里面并创建一个ChatThread并在聊天中添加一个消息。 我有一个chatType形式,它将用户ID作为带有名称线程的集合。我已经使用数据转换器将内部转换为ChatThread。

namespace Acme\UitBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Acme\UitBundle\Form\DataTransformer\ThreadToInsideTransformer;

class ChatType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
    $entityManager = $options['em'];
    $transformer = new ThreadToInsideTransformer($entityManager);

    $builder->add(
            $builder->create('thread', 'collection' ,array('allow_add'  => true,'label' => false))->addModelTransformer($transformer)
            ); 
    $builder->add('msg','textarea');
    /* $builder->add('inside','collection',array(
        'allow_add' => true,
        'allow_delete' => true)); */
    $builder->add('hook', 'submit');
}

public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'Acme\UitBundle\Entity\Chat'
))
        ->setRequired(array(
            'em',
        ))
        ->setAllowedTypes(array(
            'em' => 'Doctrine\Common\Persistence\ObjectManager',
        ));
}

public function getName() {
    return 'chat';
}
}

数据转换器

namespace Acme\UitBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Doctrine\Common\Persistence\ObjectManager;
use Acme\UitBundle\Entity\ChatThread;

class ThreadToInsideTransformer implements DataTransformerInterface
{
/**
 * @var ObjectManager
 */
private $om;

/**
 * @param ObjectManager $om
 */
public function __construct(ObjectManager $om)
{
    $this->om = $om;
}

/**
 * Transforms an object (thread) to an array (inside).
 *
 * @param  Thread $thread
 * @return array
 */
public function transform($thread)
{
    if (null === $thread) {
        return "";
    }

    return $thread->getInside();
}

/**
 * Transforms a array (inside) to an object (thread).
 *
 * @param  array $inside
 *
 * @return Thread
 *
 * @throws Create new Thread if object (thread) is not found.
 */
public function reverseTransform($inside)
{
    if (!is_array($inside)) {
        return null;
    }

    $a=$this->om
        ->getRepository('AcmeUitBundle:User')
        ->findById($inside);

    if (null === $a) {
        throw new TransformationFailedException(sprintf(
            'Error. . .'
        ));
    }

    $thread = $this->om
        ->getRepository('AcmeUitBundle:ChatThread')
        ->findByInsideChat($a)
    ;

    if (null === $thread) {
        $thread=new ChatThread();
                $thread->setInside($inside);
                $this->om->persist($thread);
                $this->om->flush();
    }

    return $thread;
}
}

当我提交表单时,我收到此错误类型"对象,数组或空","字符串"的预期参数给出。

0 个答案:

没有答案