2016-11-21 32 views
3

首先:我對Symfony /編程非常陌生,並且在找到我需要的解決方案時遇到問題。無法轉換屬性路徑的值:預期的 DateTime或 DateTimeInterface

我有我的「事件」實體這些變量與標準的getter和setter方法:

/** 
* @var \DateTime 
* 
* @ORM\Column(name="startTime", type="time", nullable=true) 
* 
* @Assert\Expression(
*  "this.getStartTime() <= this.getEndTime()", 
*  message="Start time should be less or equal to end date!" 
*) 
*/ 
private $startTime; 

/** 
* @var \DateTime 
* 
* @ORM\Column(name="endTime", type="time", nullable=true) 
* 
* @Assert\Expression(
*  "this.getEndTime() >= this.getStartTime()", 
*  message="End time should be greater or equal to start time!" 
*) 
*/ 
private $endTime; 

我有這個控制器我的形式:

<?php 


namespace AppBundle\Controller; 


use AppBundle\Entity\Event; 
use AppBundle\Form\EventCreateFormType; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Routing\Annotation\Route; 

class EventController extends Controller { 

/** 
* @Route("/eventmanager", name="event") 
*/ 
public function eventsAction(Request $request) 
{ 
    $events = $this->getDoctrine()// query database and get all events 
    ->getRepository('AppBundle:Event') 
     ->findAll(); 

    $event = new Event(); 

    $adminstatus = false; 

    if (in_array('ROLE_ADMIN', $this->getUser()->getRoles())) { 
     $adminstatus = true; 
    } 
    $event = $this->get('holiday.service')->createEventForm($request); 
    $form = $this->createForm(EventCreateFormType::class, $event, array('rolestatus' => $adminstatus)); 


    if ($form->isValid()) { 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($event); 
     $em->flush(); 

     return $this->redirectToRoute('event'); // redirect to route: events 
    } 

    return $this->render('default/eventmanager.html.twig', array('events' => $events, 'form' => $form->createView())); 
} 

使用這種類型:

<?php 


namespace AppBundle\Form; 


use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\Extension\Core\Type\TextareaType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\TimeType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class EventCreateFormType extends AbstractType { 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    parent::buildForm($builder, $options); 

    $builder 
     ->add('title', TextType::class, array(
      'label' => 'event.form.title.label', 
      'attr' => array(
       'maxlength' => 75, 
       '' => '') 
     )) 
     ->add('dateOf', TextType::class, array(
      'label' => 'event.form.dateOf.label', 
//    'widget' => 'single_text', 
//    'html5' => false, 
      'attr' => [ 
       'class' => 'js-datepicker', 
//     'format' => 'dd-MM-yyyy', 
      ], 
     )) 
     ->add('startTime', TimeType::class, array(
      'label' => 'event.form.startTime.label', 
     )) 
     ->add('endTime', TimeType::class, array(
      'label' => 'event.form.endTime.label', 
     )) 
     ->add('notice', TextareaType::class, array(
      'label' => 'event.form.notice.label', 
      'required' => false, 
      'attr' => array('maxlength' => 2500) 
     )); 
    if ($options['rolestatus'] == true) { 
     $builder->add('status', ChoiceType::class, array(
      'label' => 'event.form.status.label', 
      'data' => $options['rolestatus'], 
      'choices' => array(
       'event.form.status.public' => true, 
       'event.form.status.private' => false 
      ), 
      'choices_as_values' => true 
     )); 
    } 
    $builder->add('save', SubmitType::class, array(
     'label' => 'event.form.create.button' 
    )); 


} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $configs = $resolver->getDefinedOptions(); 
    $configs[] = 'rolestatus'; 
    $resolver->setDefined($configs); 
} 

}

而這個服務:

<?php 

namespace AppBundle\Controller\Services; 

use AppBundle\Entity\Event; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 

class HolidayServiceController extends Controller { 



public function createEventForm(Request $request) { 

    $submittedForm = $request->get('event_create_form'); 
    $adminstatus = false; 
    if (in_array('ROLE_ADMIN', $this->getUser()->getRoles())) { 
     $adminstatus = true; 
    } 
    dump($submittedForm); 

    $event = new Event(); 
    if (!empty($submittedForm)) { 

      $creator = $this->getUser(); 
      $title = $submittedForm['title']; 
      $startTime = $submittedForm['startTime']; 
      $endTime = $submittedForm['endTime']; 
      $notice = $submittedForm['notice']; 
      $now = new\DateTime(); 
      $dateOf = new \DateTime(); 
      $explodedDate = explode('-', $submittedForm['dateOf']); 
      $dateOf->setDate($explodedDate[2], $explodedDate[1], $explodedDate[0]); 

      $event->setTitle($title); 
      $event->setDateOf($dateOf); 
      $event->setStartTime($startTime); 
      $event->setEndTime($endTime); 
      $event->setNotice($notice); 
      $event->setCreator($creator); 
      $event->setCreatedAt($now); 
      if (!empty($submittedForm) && $adminstatus == true) { 
       $status = $submittedForm['status']; 
       $event->setStatus($status); 
      } else { 
       $event->setStatus(false); 
      } 
      return $event; 
     } 
    return $event; 


} 
} 

現在,當我嘗試創建一個新的事件中,我得到以下錯誤:

無法變換屬性路徑「開始時間」值:預計A \日期時間或\ DateTimeInterface 。 500內部服務器錯誤 - TransformationFailedException

我知道這是因爲我傳遞一個startTime數組而不是一個對象。

我需要做些什麼才能做到這一點?

thx提前。

回答

1

如果您使用Symfony表單,則不必從「手動」請求中檢索數據。你應該做的唯一一件事就是處理請求:

$event = new Exvent(); 
$form = $this->createForm(EventCreateFormType::class, $event); 
$form->handleRequest($request); 

手柄請求剛剛從與實體性要求結合數據。它從form數組獲取值,查看屬性應該是什麼類型並將其轉換爲適當的格式。

如果你想這樣做手工(那麼你不必創建表單 - 它只是無用的),你應該做這樣的事情:

$startTime = new \DateTime($submittedForm['startTime']); 
$endTime = new DateTime($submittedForm['endTime']); 

如果像你說的,開始時間和endTimes是數組,您必須先將這些數組的日期時間字符串放入DateTime構造函數中。

然後startTime和endTime將是DateTime的類型。

+0

我不知道原因,但有人告訴我這樣做。但他現在不在這裏幫助我。我已經嘗試了第二件事你說,但現在我得到這個:類型錯誤:DateTime :: __構造()期望參數1是字符串,給定的數組 – sfpxl

+0

如果我將EventCreateFormType中的輸入從TimeType更改爲TextType它工作得很好。但是我想要下拉框而不是文本輸入 – sfpxl

+0

如果你是Symfony的新手,最好使用第一選擇:使用Symfony表單。這裏是文檔:http://symfony.com/doc/current/forms.html(選擇適當的版本)。仔細閱讀並適當更改您的代碼。 – Alex

相關問題