У меня есть проблема, чтобы сделать окно поиска с Symfony и Doctrine. Я использую версию 2.8 Symfony.
Моя проблема:
EntityManager # persist () ожидает, что параметр 1 будет объектом сущности, заданным массивом. 500 Внутренняя ошибка сервера — ORMInvalidArgumentException
Итак, это мой тип для моего типа окна поиска:
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('searchBox',SearchType::class,array('label'=>'Vous cherchez : Un auteur ? Un éditeur ? Un ouvrage ?','attr'=>array('class'=>'form-control')));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class1' => 'SB\MainBundle\Entity\Ouvrages',
'data_class2' => 'SB\MainBundle\Entity\Auteurs',
'data_class3' => 'SB\MainBundle\Entity\Editeurs'
));
}
И это мой код контроллера после редактирования:
public function indexAction(Request $request) {
$ouvragesVentes = $this->getDoctrine()->getRepository('SBMainBundle:Ouvrages')->getOuvragesVentes();
$ouvragesEchanges = $this->getDoctrine()->getRepository('SBMainBundle:Ouvrages')->getOuvragesEchanges();
$categories = $this->getDoctrine()->getRepository('SBMainBundle:Categories')->getAllCats();
$form = $this->createForm(SearchBoxType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$searchBoxValue = $form->getData();
$bookName = $this->getDoctrine()->getRepository('SBMainBundle:Ouvrages')->getOuvrageName($searchBoxValue);
$editorName = $this->getDoctrine()->getRepository('SBMainBundle:Editeurs')->getEditeurName($searchBoxValue);
$autorName = $this->getDoctrine()->getRepository('SBMainBundle:Auteurs')->getAuteurName($searchBoxValue);
//if author
if ($searchBoxValue == $autorName){
return $this->redirect($this->generateUrl('sb_main_auteur'));
}
//if editor
if ($searchBoxValue == $editorName){
return $this->redirect($this->generateUrl('sb_main_editeur'));
}
//if book name
if ($searchBoxValue == $bookName){
return $this->redirect($this->generateUrl('sb_main_ouvrage'));
}
}
$datas = array('categories'=>$categories,'form'=>$form->createView(),'ouvragesEchanges'=>$ouvragesEchanges,'ouvragesVentes'=>$ouvragesVentes);
return $this->render('SBMainBundle:Main:index.html.twig',$datas);
}
Редактировать: Моя формаHandler
protected $request;
protected $form;
protected $em;//faire une injection de dépendance avec Request,Manager,Form(Objet)
public function __construct(Request $request,EntityManager $em, Form $form){
$this->request = $request;
$this->em = $em;
$this->form = $form;
}
//vérifie si le formulaire est soumis et valide
public function process(){
if ($this->request->getMethod() == "POST"){
//récupération des données de la requête de la superglobale $_POST
$this->form->handleRequest($this->request);
//si ok, on appel onSuccess()
if ($this->form->isValid()){
$this->onSuccess($this->form->getData());
return true;
}
}
return false;
}
//si formulaire soumis et valide, on presiste l'objet (enregistre dans la DB)
public function onSuccess($object){
//on persiste dans la DB via le manager Doctrine
$this->em->persist($object);
$this->em->flush();
}
Я смотрю Вот но я думаю это не решение моей проблемы. Тогда кто-то может сказать мне, что не так? Нужна ли мне сущность окна поиска даже с окном поиска?
Спасибо за вашу помощь !
Редактировать :
Трассировки стека
in src\SB\MainBundle\Repository\OuvragesRepository.php at line 130 -
public function getOuvrageName($titre){
$query = $this->getEntityManager()->createQuery(
"SELECT o FROM SBMainBundle:Ouvrages o WHERE o.titreOuvrage = $titre ORDER BY o.id DESC ");
return $query->getResult();at ErrorHandler ->handleError ('8', 'Array to string conversion', 'C:\wamp\www\switchbook\src\SB\MainBundle\Repository\OuvragesRepository.php', '130', array('titre' => array('searchBox' => 'flammarion')))
in src\SB\MainBundle\Repository\OuvragesRepository.php at line 130 +
at OuvragesRepository ->getOuvrageName (array('searchBox' => 'flammarion'))
in src\SB\MainBundle\Controller\MainController.php at line 35 +
at MainController ->indexAction (object(Request))
at call_user_func_array (array(object(MainController), 'indexAction'), array(object(Request)))
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php at line 144 +
at HttpKernel ->handleRaw (object(Request), '1')
в вендоре \ symfony \ symfony \ src \ Symfony \ Component \ HttpKernel \ HttpKernel.php в строке 64+
в HttpKernel -> handle (объект (Запрос), ‘1’, true)
в vendor \ symfony \ symfony \ src \ Symfony \ Component \ HttpKernel \ DependencyInjection \ ContainerAwareHttpKernel.php в строке 69 +
at ContainerAwareHttpKernel -> handle (объект (Запрос), ‘1’, true)
в vendor \ symfony \ symfony \ src \ Symfony \ Component \ HttpKernel \ Kernel.php в строке 185 +
в ядре -> дескриптор (объект (запрос))
в web \ app_dev.php в строке 28+
Новое редактирование:
Некоторые обязательные параметры отсутствуют («titreOuvrage») для создания URL-адреса для маршрута «sb_main_ouvrage».
sb_main_ouvrage:
path: /ouvrage/{titreOuvrage}
defaults: { _controller: SBMainBundle:Main:ouvrage}
Трассировки стека
в app \ cache \ dev \ classes.php в строке 911
$variables = array_flip($variables);
$mergedParams = array_replace($defaults, $this->context->getParameters(), $parameters);
if ($diff = array_diff_key($variables, $mergedParams)) {throw new MissingMandatoryParametersException(sprintf('Some mandatory parameters are missing ("%s") to generate a URL for route "%s".', implode('", "', array_keys($diff)), $name));}
$url ='';
$optional = true;
at UrlGenerator ->doGenerate (array('titreOuvrage'), array('_controller' => 'SB\MainBundle\Controller\MainController::ouvrageAction'), array(), array(array('variable', '/', '[^/]++', 'titreOuvrage'), array('text', '/ouvrage')), array(), 'sb_main_ouvrage', '1', array(), array())
in app\cache\dev\appDevDebugProjectContainerUrlGenerator.php at line 92 +
at appDevDebugProjectContainerUrlGenerator ->generate ('sb_main_ouvrage', array(), '1')
in app\cache\dev\classes.php at line 1286 +
at Router ->generate ('sb_main_ouvrage', array(), '1')
in vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php at line 52 +
at Controller ->generateUrl ('sb_main_ouvrage')
in src\SB\MainBundle\Controller\MainController.php at line 49 +
at MainController ->indexAction (object(Request))
at call_user_func_array (array(object(MainController), 'indexAction'), array(object(Request)))
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php at line 144 +
at HttpKernel ->handleRaw (object(Request), '1')
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php at line 64 +
at HttpKernel ->handle (object(Request), '1', true)
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel.php at line 69 +
at ContainerAwareHttpKernel ->handle (object(Request), '1', true)
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Kernel.php at line 185 +
at Kernel ->handle (object(Request))
in web\app_dev.php at line 28
И мой контроллер для страницы сопоставления:
public function ouvrageAction(Ouvrages $ouvrages){
$ouvrage = $ouvrages->getTitreOuvrage();
$categories = $this->getDoctrine()->getRepository('SBMainBundle:Categories')->getAllCats();
$ouvragesVentes = $this->getDoctrine()->getRepository('SBMainBundle:Ouvrages')->getOuvragesVentesByName($ouvrage);
$ouvragesEchanges = $this->getDoctrine()->getRepository('SBMainBundle:Ouvrages')->getOuvragesEchangesByName($ouvrage);
$datas = array('ouvragesVentes'=>$ouvragesVentes,'ouvragesEchanges'=>$ouvragesEchanges,'categories'=>$categories,'ouvrages'=>$ouvrages);
return $this->render('SBMainBundle:Main:ouvrage.html.twig',$datas);
}
Ваша форма не имеет сущности (или множественной), что означает, что ваша $ form-> getData () вернет массив. И, как говорится в ошибке, вы не можете передать массив методу persist ().
Если ваша цель состоит в том, чтобы сохранить каждый поиск, отправленный в вашей базе данных, вам нужно создать объект SearchBox (или как вы хотите его называть) и соответственно установить data_class.
Если вы не хотите сохранять результаты поиска, вам не нужно вызывать обработчик. (потому что он ничего не делает, кроме вызова persist ())
И вам не нужна сущность, проверьте, как обрабатывать отправку без data_class
Btw. в вашем обработчике вы вызываете $ form-> isValid () без $ form-> isSubmitted () и этот код
if ($formHandler->process()){
return $this->redirect($this->generateUrl(''));
}
if ($form->isSubmitted() && $form->isValid()) {
// You will never come here, because $formHandler->process() will return true if your form is valid, and leave your indexAction
}
Надеюсь, это поможет вам.
редактировать
Данные, которые вы передаете в свой репозиторий
$searchBoxValue = $form->getData();
Это вернет марку searchBoxValue
как массив, потому что вы запрашиваете все данные формы.
Но что вы хотите, чтобы получить конкретные данные поля поиска, вам нужно сделать
$searchBoxValue = $form->get('searchBox')->getData();
Обратите внимание, что я бы порекомендовал использовать queryBuilder или, по крайней мере, защитить ваш запрос от SQL-инъекций.
например
public function getOuvrageName($titre){
$query = $this->getEntityManager()->createQuery(
"SELECT o FROM SBMainBundle:Ouvrages o WHERE o.titreOuvrage = :titre ORDER BY o.id DESC ")
->setParameter('titre', $titre);
return $query->getResult();
}
Других решений пока нет …