Я новичок в Symfony 5, и даже после обширных исследований я не смог найти решение своей проблемы.
Я пытаюсь создать форму в Symfony 5, используя 2 (AliceUser and Person ) объекты, которые связаны в отношении 1 к 1, созданному с использованием Doctrine. Форма для добавления персоны работает нормально и данные сохраняются. В моем рабочем процессе человек должен существовать, когда я создаю пользователя, следовательно, отношение один к одному. Однако, когда я отрисовываю форму, я всегда получаю ошибку преобразования массива в строку. Связанным свойством является user_id в пользовательском объекте и aliceuserid в объекте person.
Исключение:
AbstractController->render() in src/Controller/AliceSecurityController.php (line 75)
$user->setUserId($currentperson);
$form->setData($user);
return $this->render('person/adduser.html.twig', [
'form' => $form->createView(),
'currentperson' => $currentperson
]);
}
return new Response('Check out this great product: '. $currentperson->getUID());
}
Мой контроллер:
<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\HttpFoundation\Request;
use App\Repository\PersonRepository;
use Knp\Component\Pager\PaginatorInterface;
use App\Repository\AliceUserRepository;
use App\Form\PersonAddType;
use App\Entity\Person;
use App\Entity\AliceUser;
use App\Form\UserAddType;
/**
* Summary of ModifyUser
* @param Request $request
* @param mixed $id
* @param PersonRepository $currentPersonRepository
* @param AliceUserRepository $currentUserRepository
* @Route ("/modifyuser/{id?}", name="modifyuser")
*/
public function ModifyUser(Request $request,$id, PersonRepository $currentPersonRepository, AliceUserRepository $currentUserRepository) {
$currentperson=new Person();
$currentperson= $currentPersonRepository->find($id);
if (!$currentperson) {
return $this->render('errors/error_data_not_found.html.twig', [
'rowid' => $id,
]);
}
$user= new AliceUser();
$user=$currentUserRepository->findBy(['user_id'=> $id]);
if (!$user) {
$user= new AliceUser();
$form= $this->createForm(UserAddType::class,$user);
$form->handleRequest($request);
$user->setUserId($currentperson);
$form->setData($user);
return $this->render('person/adduser.html.twig', [
'form' => $form->createView(),
'currentperson' => $currentperson
]);
}
// return new Response('Response Check: '. $currentperson->getUID());
}
Пользовательский объект:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Entity(repositoryClass="App\Repository\AliceUserRepository")
*/
class AliceUser implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="App\Entity\Person", inversedBy="aliceuser_id", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=false)
*/
private $user_id;
public function getId(): ?int
{
return $this->id;
}
public function getUserId(): ?Person
{
return $this->user_id;
}
public function setUserId(Person $user_id): self
{
$this->user_id = $user_id;
if ($user_id->getAliceuserId() !== $this) {
$user_id->setAliceuserId($this);
}
return $this;
}
Person Entity:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Ramsey\Uuid\Uuid;
/**
* @ORM\Entity(repositoryClass="App\Repository\PersonRepository")
*/
class Person
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="App\Entity\AliceUser", mappedBy="user_id", cascade={"persist", "remove"})
*/
private $aliceuser_id;
/**
* Get the ID number of the record of the current person entity
* @return int
*/
public function getId(): ?int
{
return $this->id;
}
/**
* Set the ID number of the record of th e current person entity
* @param int $id
* @return Person
*/
public function setId(int $id): self
{
$this->id=$id;
return $this;
}
public function getAliceuserId(): ?AliceUser
{
return $this->aliceuser_id;
}
public function setAliceuserId(AliceUser $aliceuser_id): self
{
$this->aliceuser_id = $aliceuser_id;
// set the owning side of the relation if necessary
if ($aliceuser_id->getUserId() !== $this) {
$aliceuser_id->setUserId($this);
}
return $this;
}
Класс Тип пользователя:
<?php
namespace App\Form;
use App\Entity\AliceUser;
use App\Entity\Person;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserAddType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username')
->add('roles')
->add('password')
->add('uuid')
->add('isactive')
->add('user_id',PersonAddType::class,['label' => 'Create User'])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => AliceUser::class,
]);
}
}
Шаблон Twig; note Примечание Я использую стандартный шаблон формы на основе bootstrap.
{% extends 'index.html.twig' %}
{% block leftcolumn %}
<p> Left Menu</p>
{% set menu = knp_menu_get('leftsidemenu', [], {include_homepage: false, SideMenuId: 'menu_person', rowuid: currentperson.uid}) %}
{{ knp_menu_render(menu,{'template': 'menus/knp_sidemenu.html.twig'}) }}
{% endblock %}
{% block content %}
{{ dump(currentperson) }}
{{ parent() }}
<div class="alert {{ alert_type|default('') }}" ><h1>Add/Edit Persons</h1> </div>
{%if form.vars.submitted==true and form.vars.valid %}
<div id="alertsavesuccess" class="alert alert-success alert-dismissible fade show">
<h4 class="alert-heading"><i class="far fa-check-circle"></i> Success!</h4>
<strong>Person</strong> {{currentperson.forename}} {{currentperson.lastname}} has been saved successfully
<button type="button" class="close" data-dismiss="alert">×</button>
</div>
{% endif %}
{% if not form.vars.valid %}
<ul>
{# Loop through every form item #}
{% for child in form.children %}
{# Display the errors of the form item #}
{%for error in child.vars.errors%}
<li>{{error.message}}</li>
{%endfor%}
{%endfor%}
</ul>
{%endif%}
{{ dump(form.user_id) }}
{{ form_start(form) }}
{{ form_widget(form) }}
{% if not form.vars.submitted %}
<input type="submit" value="Save" />
{% else %}
<input type="submit" value="Update" />
{% endif %}
{{ form_end(form) }}
{% endblock %}
Когда я удаляю следующий код из шаблона, я не получаю никаких сообщений, и будет отображаться дамп.
{{ form_start(form) }}
{{ form_widget(form) }}
{% if not form.vars.submitted %}
<input type="submit" value="Save" />
{% else %}
<input type="submit" value="Update" />
{% endif %}
{{ form_end(form) }}
Пример дампа Var для currentperson:
App\Entity\Person {#774 ▼
-id: 11
-UID: "4aa57317-758b-4d79-a382-93cee97d8488"
-forename: "bvcbvcb"
-middlename1: "vcbvcb"
-middlename2: "vcbvcbc"
-lastname: "bcvxbcvb"
-aliceuser_id: App\Entity\AliceUser {#760 ▶}
}
Var Dump для form.user_id
Symfony\Component\Form\FormView {#1098 ▼
+vars: array:31 [▼
"value" => App\Entity\Person {#774 ▶}
"attr" => []
"form" => Symfony\Component\Form\FormView {#1098}
"id" => "user_add_user_id"
"name" => "user_id"
"full_name" => "user_add[user_id]"
"disabled" => false
"label" => "Create User"
"label_format" => null
"multipart" => false
"block_prefixes" => array:3 [▶]
"unique_block_prefix" => "_user_add_user_id"
"row_attr" => []
"translation_domain" => null
"label_translation_parameters" => []
"attr_translation_parameters" => []
"cache_key" => "_user_add_user_id_person_add"
"errors" => Symfony\Component\Form\FormErrorIterator {#1097 ▼
-form: Symfony\Component\Form\Form {#1067 ▼
-config: Symfony\Component\Form\FormBuilder {#996 ▶}
-parent: Symfony\Component\Form\Form {#968 ▶}
-children: Symfony\Component\Form\Util\OrderedHashMap {#1075 ▶}
-errors: []
-submitted: false
-clickedButton: null
-modelData: App\Entity\Person {#774 ▶}
-normData: App\Entity\Person {#774 ▶}
-viewData: App\Entity\Person {#774 ▶}
-extraData: []
-transformationFailure: null
-defaultDataSet: true
-lockSetData: false
-name: "user_id"
-inheritData: false
-propertyPath: Symfony\Component\PropertyAccess\PropertyPath {#1114 ▶}
}
-errors: []
}
"valid" => true
"data" => App\Entity\Person {#774 ▼
-id: 11
-UID: "4aa57317-758b-4d79-a382-93cee97d8488"
-forename: "bvcbvcb"
-middlename1: "vcbvcb"
-middlename2: "vcbvcbc"
-lastname: "bcvxbcvb"
-aliceuser_id: App\Entity\AliceUser {#760 ▶}
}
"required" => true
"size" => null
"label_attr" => []
"help" => null
"help_attr" => []
"help_html" => false
"help_translation_parameters" => []
"compound" => true
"method" => "POST"
"action" => ""
"submitted" => false
]
+parent: Symfony\Component\Form\FormView {#842 ▼
+vars: array:31 [▶]
+parent: null
+children: array:7 [▼
"username" => Symfony\Component\Form\FormView {#1053 ▶}
"roles" => Symfony\Component\Form\FormView {#990 ▶}
"password" => Symfony\Component\Form\FormView {#937 ▶}
"uuid" => Symfony\Component\Form\FormView {#919 ▶}
"isactive" => Symfony\Component\Form\FormView {#1095 ▶}
"user_id" => Symfony\Component\Form\FormView {#1098}
"_token" => Symfony\Component\Form\FormView {#1153 ▶}
]
-rendered: false
-methodRendered: false
}
+children: array:6 [▶]
-rendered: false
-methodRendered: false
}