Search code examples
phpsymfonytwigmany-to-one

Categorie could not be converted to string


To start off I am really new at programming, and especialy Symfony/ORM. I am getting lessons, in Dutch. That's why the Dutch naming but, I am having problems with getting a twig template to show a many to one relation. I keep getting errors that it can't be converted to string, I have googled for hours now and I got another error that variable is null. Yet that can not be the case. I will add the codes below.

The errors I get are;

[1/2] ContextErrorException: Catchable Fatal Error: Object of class Proxies__CG__\AppBundle\Entity\Categorie could not be converted to string

and

[2/2] Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class Proxies__CG__\AppBundle\Entity\Categorie could not be converted to string").

Artikel.php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
//link naar tabel
/**
* Artikel
*
* @ORM\Table(name="artikel")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ArtikelRepository")
*/
class Artikel
{
//class artikel met alle items die in de tabel staan.
//per items staat aangegeven wat voor type het is en aanvullende gegevens.
/**
 * @var int
 *
 * @ORM\Column(name="Artikelnummer", type="integer", unique=true)
 * @ORM\Id
 */
private $artikelnummer;

/**
 * @var string
 *
 * @ORM\Column(name="Omschrijving", type="string", length=255, nullable=true)
 */
private $omschrijving;

/**
* @var string
* @ORM\ManyToOne(targetEntity="Categorie", inversedBy="artikelen")
* @ORM\JoinColumn(name="categorie", referencedColumnName="id")
 */

 private $categorie;

/**
 * @var string
 *
 * @ORM\Column(name="Technischespecificaties", type="string", length=255 , nullable=true)
 */
private $technischespecificaties;

/**
 * @var string
 *
 * @ORM\Column(name="Status", type="string", length=12, nullable=false)
 */
private $status;

/**
 * @var string
 *
 * @ORM\Column(name="magazijnlocatie", type="string", length=6, nullable=false) 
 * @Assert\Length(
 *      min = 6,
 *      max = 6,
 *      exactMessage = "Invoerwaarde te lang")
 * @Assert\Regex(
 *    pattern = "/^20|[0-1]{1}[0-9]{1}\/[A-Z][0]{1}[0-9]{1}|10$/i",
 *    match=true,
 *    message="Ongeldige locatie [ERROR1]")
 * @Assert\Regex(
 *    pattern = "/^[2]{1}[1-9]{1}\/[A-Z]{1}[0-9]{1}$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR2]")
 * @Assert\Regex(
 *    pattern = "/^[3-9]{1}[0-9]{1}\/[A-Z][0-9]{1}$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR3]")
 * @Assert\Regex(
 *    pattern = "/^[0-1]{1}[0-9]{1}\/[A-Z][1]{1}[1-9]{1}$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR4]")
 * @Assert\Regex(
 *    pattern = "/^[0-1]{1}[0-9]{1}\/[A-Z][2-9]{1}[0-9]{1}$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR5]")
 * @Assert\Regex(
 *    pattern = "/^[0-9A-Za-z]+$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR6]")
 */
private $magazijnlocatie;

/**
 * @var int
 *
 * @ORM\Column(name="Inkoopprijs", type="decimal", precision=10, scale=2)
 */
private $inkoopprijs;

/**
 * @var string
 *
 * @ORM\Column(name="CodeVervangendArtikel", type="integer")
 */
private $CodeVervangendArtikel;

/**
 * @var string
 *
 * @ORM\Column(name="MinimumVoorraad", type="string")
 */
private $minimumVoorraad;

/**
 * @var string
 *
 * @ORM\Column(name="VoorraadInAantal", type="integer")
 */
private $voorraadInAantal;

/**
 * @var string
 *
 * @ORM\Column(name="Bestelserie", type="integer")
 */
private $bestelserie;



//set en gets van de items
/**
 * Set artikelnummer
 *
 * @param integer $artikelnummer
 *
 * @return Artikel
 */
public function setArtikelnummer($artikelnummer)
{
    $this->artikelnummer = $artikelnummer;

    return $this;
}

/**
 * Get artikelnummer
 *
 * @return int
 */
public function getArtikelnummer()
{
    return $this->artikelnummer;
}

/**
 * Set categorie
 *
 * @param string $categorie
 *
 * @return Artikel
 */
public function setCategorie($categorie)
{
    $this->categorie = $categorie;

    return $this;
}
public function __toString()
 {     return $this->categorie; }
/**
 * Get categorie
 *
 * @return string
 */


 public function getCategorie()
{
    return $this->categorie;
}

/**
 * Set omschrijving
 *
 * @param string $omschrijving
 *
 * @return Artikel
 */
public function setOmschrijving($omschrijving)
{
    $this->omschrijving = $omschrijving;

    return $this;
}

/**
 * Get omschrijving
 *
 * @return string
 */
public function getOmschrijving()
{
    return $this->omschrijving;
}

/**
 * Set technischespecificaties
 *
 * @param string $technischespecificaties
 *
 * @return Artikel
 */
public function setTechnischespecificaties($technischespecificaties)
{
    $this->technischespecificaties = $technischespecificaties;

    return $this;
}

/**
 * Get technischespecificaties
 *
 * @return string
 */
public function getTechnischespecificaties()
{
    return $this->technischespecificaties;
}

/**
 * Set status
 *
 * @param string $status
 *
 * @return Artikel
 */
public function setStatus($status)
{
    $this->status = $status;

    return $this;
}

/**
 * Get status
 *
 * @return string
 */
public function getStatus()
{
    return $this->status;
}

/**
 * Set magazijnlocatie
 *
 * @param string $magazijnlocatie
 *
 * @return Artikel
 */
public function setMagazijnlocatie($magazijnlocatie)
{
    $this->magazijnlocatie = $magazijnlocatie;

    return $this;
}

/**
 * Get magazijnlocatie
 *
 * @return string
 */
public function getMagazijnlocatie()
{
    return $this->magazijnlocatie;
}

/**
 * Set inkoopprijs
 *
 * @param integer $inkoopprijs
 *
 * @return Artikel
 */
public function setInkoopprijs($inkoopprijs)
{
    $this->inkoopprijs = $inkoopprijs;

    return $this;
}

/**
 * Get inkoopprijs
 *
 * @return int
 */
public function getInkoopprijs()
{
    return $this->inkoopprijs;
}

/**
 * Set CodeVervangendArtikel
 *
 * @param string $CodeVervangendArtikel
 *
 * @return Artikel
 */
public function setCodeVervangendArtikel($CodeVervangendArtikel)
{
    $this->CodeVervangendArtikel = $CodeVervangendArtikel;

    return $this;
}

/**
 * Get CodeVervangendArtikel
 *
 * @return string
 */
public function getCodeVervangendArtikel()
{
    return $this->CodeVervangendArtikel;
}

/**
 * Set minimumVoorraad
 *
 * @param string $minimumVoorraad
 *
 * @return Artikel
 */
public function setMinimumVoorraad($minimumVoorraad)
{
    $this->minimumVoorraad = $minimumVoorraad;

    return $this;
}

/**
 * Get minimumVoorraad
 *
 * @return string
 */
public function getMinimumVoorraad()
{
    return $this->minimumVoorraad;
}

/**
 * Set voorraadInAantal
 *
 * @param string $voorraadInAantal
 *
 * @return Artikel
 */
public function setVoorraadInAantal($voorraadInAantal)
{
    $this->voorraadInAantal = $voorraadInAantal;

    return $this;
}

/**
 * Get voorraadInAantal
 *
 * @return string
 */
public function getVoorraadInAantal()
{
    return $this->voorraadInAantal;
}

/**
 * Set bestelserie
 *
 * @param string $bestelserie
 *
 * @return Artikel
 */
public function setBestelserie($bestelserie)
{
    $this->bestelserie = $bestelserie;

    return $this;
}

/**
 * Get bestelserie
 *
 * @return string
 */
public function getBestelserie()
{
    return $this->bestelserie;
}
}

Categorie.php

<?php

 namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;

 /**
 * Categorie
 *
 * @ORM\Table(name="categorie")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\CategorieRepository")
 */
class Categorie
{

/**
 * @var string
 *
 * @ORM\Column(name="id", type="string", length=20, unique=true)
 * @ORM\Id
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="beschrijving", type="string", length=255)
 */
private $beschrijving;

/**
* @ORM\OneToMany(targetEntity="Artikel", mappedBy = "categorie")
*/
private $artikelen;

/**
 * @var string
 *
 * @ORM\Column(name="magazijnlocatie", type="string", length=6, nullable=false) 
 * @Assert\Length(
 *      min = 6,
 *      max = 6,
 *      exactMessage = "Invoerwaarde te lang")
 * @Assert\Regex(
 *    pattern = "/^20|[0-1]{1}[0-9]{1}\/[A-Z][0]{1}[0-9]{1}|10$/i",
 *    match=true,
 *    message="Ongeldige locatie [ERROR1]")
 * @Assert\Regex(
 *    pattern = "/^[2]{1}[1-9]{1}\/[A-Z]{1}[0-9]{1}$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR2]")
 * @Assert\Regex(
 *    pattern = "/^[3-9]{1}[0-9]{1}\/[A-Z][0-9]{1}$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR3]")
 * @Assert\Regex(
 *    pattern = "/^[0-1]{1}[0-9]{1}\/[A-Z][1]{1}[1-9]{1}$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR4]")
 * @Assert\Regex(
 *    pattern = "/^[0-1]{1}[0-9]{1}\/[A-Z][2-9]{1}[0-9]{1}$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR5]")
 * @Assert\Regex(
 *    pattern = "/^[0-9A-Za-z]+$/i",
 *    match=false,
 *    message="Ongeldige locatie [ERROR6]")
 */
private $magazijnlocatie;

/**
 * Set id
 *
 * @param string $id
 *
 * @return Categorie
 */
public function setId($id)
{
    $this->id = $id;

    return $this;
}

/**
 * Get id
 *
 * @return string
 */
public function getId()
{
    return $this->id;
}
 public function toString()
    {
        return $this->getId();
    }
/**
 * Set beschrijving
 *
 * @param string $beschrijving
 *
 * @return Categorie
 */
public function setBeschrijving($beschrijving)
{
    $this->beschrijving = $beschrijving;

    return $this;
}

/**
 * Get beschrijving
 *
 * @return string
 */
public function getBeschrijving()
{
    return $this->beschrijving;
}

/**
 * Set magazijnlocatie
 *
 * @param string $magazijnlocatie
 *
 * @return Artikel
 */
public function setMagazijnlocatie($magazijnlocatie)
{
    $this->magazijnlocatie = $magazijnlocatie;

    return $this;
}

/**
 * Get magazijnlocatie
 *
 * @return string
 */
public function getMagazijnlocatie()
{
    return $this->magazijnlocatie;
}

public function _construct()
{
  $this->artikelen = new ArrayCollection();
}
}

controller

use Symfony\Component\HttpFoundation\Response;


//use van de entiteiten
use AppBundle\Entity\Artikel;
use AppBundle\Form\Type\Artikel0Type;
use AppBundle\Form\Type\ArtikelType;
use AppBundle\Entity\Categorie;


class ArtikelController extends Controller
{


/**
* @Route("/artikel/alle", name="alleartikelen")
*/

Public function alleArtikelen(Request $request) {
    $artikelen = $this->getDoctrine()->getRepository("AppBundle:Artikel")->findAll();
    return new Response($this->render('artikel.html.twig', array('artikelen' => $artikelen)));

}


/**
         * @Route("/artikel/nieuw", name="nieuwartikel")
         */
        public function nieuwArtikel(Request $request) {
            $nieuwArtikel = new Artikel();
            $form = $this->createForm(ArtikelType::class, $nieuwArtikel);

            $form->handleRequest($request);
            if ($form->isSubmitted() && $form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($nieuwArtikel);
                $em->flush() ;
                return $this->redirect($this->generateurl("alleartikelen")) ;
            }
                return new Response($this->render('form.html.twig', array('form' => $form->createView())));
        }

        /**
                 * @Route("/artikel/wijzig/{artikelnummer}", name="artikelwijzigen")
                 */
                public function wijzigArtikel(Request $request, $artikelnummer) {

                    $bestaandArtikel = $this->getDoctrine()->getRepository("AppBundle:Artikel")->find($artikelnummer);
                    $form = $this->createForm(Artikel0Type::class, $bestaandArtikel);

                    $form->handleRequest($request);
                    if ($form->isSubmitted() && $form->isValid()) {
                        $em = $this->getDoctrine()->getManager();
                        $em->persist($bestaandArtikel);
                        $em->flush() ;
                        return $this->redirect($this->generateurl("alleartikelen", array("artikelnummer"=>$bestaandArtikel->getArtikelnummer()))) ;
                    }
                    return new Response($this->render('form.html.twig', array('form' => $form->createView())));
                }

                /**
                         * @Route("/artikel/verwijder/{artikelnummer}", name="artikelverwijderen")
                         */
                        public function verwijderArtikel(Request $request, $artikelnummer) {
                                $em = $this->getDoctrine()->getManager();
                                $bestaandArtikel = $em->getRepository("AppBundle:Artikel")->find($artikelnummer);
                                $em->remove($bestaandArtikel);
                                $em->flush() ;
                                return $this->redirect($this->generateurl("alleartikelen"));
                            }





}

And then the twig itself;

{% extends 'base.html.twig' %}
{% block body %}
<h1>Overzicht Artikelen</h1>
<h2><a href="{{ path('nieuwartikel',{}) }}">Nieuw Artikel</a></h2>
<ol>
    {% for artikel in artikelen %}
        <li style="color:darkgreen">
            Artikelnummer: {{artikel.artikelnummer}} <br>
            Omschrijving: {{artikel.omschrijving}} <br>
            Technischespecificaties: {{artikel.technischespecificaties}} <br>
            Categorie: {{artikel.categorie}} <br>
            Magazijnlocatie: {{artikel.magazijnlocatie}} <br>
            Inkoopprijs: {{artikel.inkoopprijs}} <br>
            CodeVervangendArtikel: {{artikel.CodeVervangendArtikel}} <br>
            MinimumVoorraad: {{artikel.minimumVoorraad}} <br>
            VoorraadInAantal: {{artikel.voorraadInAantal}} <br>
            Bestelserie: {{artikel.bestelserie}} <br>

            <a href="{{ path('artikelwijzigen',
{'artikelnummer':artikel.artikelnummer}) }}">Wijzig</a>
            <a href="{{ path('artikelverwijderen',
{'artikelnummer':artikel.artikelnummer}) }}">Verwijder</a>
    </li><br>
{% endfor %}
<ol>
{% endblock %}

Solution

  • The method toString in the entity Categorie is not valid, should be: __toString.

    Review the constructor of the same entity too, should be __construct() not _construct()