it-swarm.com.de

Der Methodenname muss entweder mit findBy oder findOneBy beginnen. Undefinierte Methode Symfony?

Ich arbeite durch part4 von Symfony2 , und beim Aktualisieren des Controllers und des Hilfsklassencodes erhielt ich die folgende Fehlermeldung

Undefined method 'getLatestBlogs'. The method name must start with either
findBy or findOneBy!

bevor ich etwas Code in den Controller gesteckt hatte, wechselte ich zu meiner Hilfsklasse, wie im Tutorial beschrieben, was zu der obigen Fehlermeldung führt.

<?php
// src/Blogger/BlogBundle/Repository/BlogRepository.php
namespace Blogger\BlogBundle\Repository;
use Doctrine\ORM\EntityRepository;

/**
 * BlogRepository
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
*/
class BlogRepository extends EntityRepository
{
 public function getLatestBlogs($limit = null)
 {
    $qb = $this->createQueryBuilder('b')
               ->select('b')
               ->addOrderBy('b.created', 'DESC');

    if (false === is_null($limit))
        $qb->setMaxResults($limit);

    return $qb->getQuery()
              ->getResult();
  } 
}

Und hier ist mein Controller-Dateiindex Action Code: -

// src/Blogger/BlogBundle/Controller/PageController.php
class PageController extends Controller
{
  public function indexAction()
  {
    $em = $this->getDoctrine()
               ->getEntityManager();

    $blogs = $em->getRepository('BloggerBlogBundle:Blog')
                ->getLatestBlogs();

    return $this->render('BloggerBlogBundle:Page:index.html.twig', array(
        'blogs' => $blogs
    ));
    }

    // ..
}

Ich füge ein paar Zeilen aus der Datei /Entity/Blog.php an. Bitte überprüfen Sie, ob sie gemäß Ihrer Antwort richtig sind.

<?php
// src/Blogger/BlogBundle/Entity/Blog.php

namespace Blogger\BlogBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
 * @ORM\Table(name="blog")
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity
 */

class Blog
 {
  /**
   * @ORM\Id
   * @ORM\Column(type="integer")
   * @ORM\GeneratedValue(strategy="AUTO")
   * @ORM\HasLifecycleCallbacks()
  */
  protected $id;
  --
  --
 }

Wo mache ich falsch?

53
ScoRpion

Stellen Sie sicher, dass Sie Ihre Entitätsklasse geändert haben:

// src/Blogger/BlogBundle/Entity/Blog.php
/**
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
 * @ORM\Table(name="blog")
 * @ORM\HasLifecycleCallbacks()
 */
class Blog
{
    // ..
}

Die Anmerkung @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository") ist erforderlich.  

Und vergessen Sie nicht, Entitäten neu zu generieren:

php app/console doctrine:generate:entities Blogger

AKTUALISIEREN

Annotation @ORM\Entity entfernen. Es überschreibt die korrekte Annotation @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")

124
Molecular Man

In meinem Fall war das Hinzufügen einer korrekten Anmerkung nicht ausreichend. 
Das Löschen des Doctrine Cache durch php app/console doctrine:cache:clear-metadata hat auch nicht funktioniert.

Ich generiere meine Entitäten mit Befehlen aus der Datenbank 

pHP-App/Konsolenlehre: Zuordnung: Import --force AcmeBlogBundle xml
PHP App/Konsole Doctrine: Mapping: Annotation ./src konvertieren
PHP App/Konsolenlehre: Generiere: Entitäten AcmeBlogBundle

Erster Befehl zum Erstellen der Datei orm.xml für jede DB-Tabelle in meinem Projekt ..__ Nach dem Löschen aller Dateien orm.xml Die gestarteten Anmerkungen funktionieren ordnungsgemäß.

9
user4011534

Wenn Sie yml als Konfigurationsdateien für Ihre Entitäten verwenden, fügen Sie Folgendes hinzu:

Blogger\BlogBundle\Entity\Blog:
    type: entity
    table: Blog
    repositoryClass: Blogger\BlogBundle\Repository\BlogRepository
    ...

und dann wie oben erwähnt:

php app/console doctrine:generate:entities Blogger
4
s1x

Die andere Lösung besteht darin, alle durch generierte Entitäten hinzugefügten orm.xml-Dateien zu löschen. Wenn Sie den Ordner verschieben oder löschen, ist Ihr Mapping mit dem Repository betriebsbereit.

2
Benjamin Petit

Falls Sie PHP-FPM verwenden, kann dieses Problem auch nach den oben genannten Lösungen bestehen bleiben. Verwenden Sie dann Sudo service php5-fpm restart.

1
HBK
 * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")

Platzieren Sie die Repository-Klasse im selben Verzeichnis neben der Entity-Klasse:

     * @ORM\Entity(repositoryClass="Blogger\BlogBundle\BlogRepository")
0
K-Alex

In Symfony 3 fehlt wahrscheinlich die Repository-Klasse in Ihrer orm.xml-Datei.

repository-class="Bundle\Repository\MyRepository"

Beispiel:

<doctrine-mapping>
    <entity name="Bundle\Entity\MyEntity"
            table="tablename"
            repository-class="Bundle\Repository\MyRepository">
        <id name="id" type="integer" column="id">
            <generator strategy="AUTO"/>
        </id>
    </entity>
</doctrine-mapping>
0
tobias47n9e

Für mich half es, meine vm (Vagrant Box) neu zu starten

0
Heisoka