首先:我對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提前。
我不知道原因,但有人告訴我這樣做。但他現在不在這裏幫助我。我已經嘗試了第二件事你說,但現在我得到這個:類型錯誤:DateTime :: __構造()期望參數1是字符串,給定的數組 – sfpxl
如果我將EventCreateFormType中的輸入從TimeType更改爲TextType它工作得很好。但是我想要下拉框而不是文本輸入 – sfpxl
如果你是Symfony的新手,最好使用第一選擇:使用Symfony表單。這裏是文檔:http://symfony.com/doc/current/forms.html(選擇適當的版本)。仔細閱讀並適當更改您的代碼。 – Alex