Исключение преобразования массива в строку в Symfony при рендеринге связанных объектов 1 на 1 с использованием formbuilder - PullRequest
1 голос
/ 29 апреля 2020

Я новичок в 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">&times;</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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...