Не намиране на модели при използване на Doctrine 2 & Zend Framework

Започнах нов проект и исках да използвам Doctrine 2 в Zend Framework (1.11).

Конфигурирах всичко в рамките на Bootstrap & Config, което изглеждаше добре.

Ето първия ми модел, който създадох за употреба:

<?php
namespace Entities;
/**
 * @Entity
 * @Table(name="posts")
 */
class Post
{

    /** @Id @Column(type="integer") @GeneratedValue */
    public $id;

    /** @Column(length=100,nullable=true) */
    public $title;

    /** @Column(length=2000) */
    public $message;

    /** @Column(type="integer") */
    public $userId;

    /** @Column(type="timestamp") */
    public $dateAdded;

}

А ето и контролера:

<?php

class CityController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $em = Zend_Registry::get('em');

        $group = $em->find('Entities\Post', 1);
    }


}

Когато се опитам да осъществя достъп до модела Entities\Post, той просто показва грешка, като казва, че не съществува. Сигурен съм, че това е проблем с конвенцията за именуване на Zend, но опитах няколко различни неща и изглежда нищо не работи.

Някакви идеи? И аз прегледах всички уроци за Doctrine 2/Zend, които можах да намеря, и никой от тях не помогна много.

* АКТУАЛИЗАЦИЯ *

Ето моята Doctrine init в bootstrap:

public function _initDoctrine() {
    // include and register Doctrine's class loader
    require_once('Doctrine/Common/ClassLoader.php');
    $classLoader = new \Doctrine\Common\ClassLoader(
        'Doctrine',
        APPLICATION_PATH . '/../library/'
    );
    $classLoader->register();

    // create the Doctrine configuration
    $config = new \Doctrine\ORM\Configuration();

    // setting the cache ( to ArrayCache. Take a look at
    // the Doctrine manual for different options ! )
    $cache = new \Doctrine\Common\Cache\ArrayCache;
    $config->setMetadataCacheImpl($cache);
    $config->setQueryCacheImpl($cache);

    // choosing the driver for our database schema
    // we'll use annotations
    $driver = $config->newDefaultAnnotationDriver(
        APPLICATION_PATH . '/models'
    );
    $config->setMetadataDriverImpl($driver);

    // set the proxy dir and set some options
    $config->setProxyDir(APPLICATION_PATH . '/models/Proxies');
    $config->setAutoGenerateProxyClasses(true);
    $config->setProxyNamespace('App\Proxies');

    // now create the entity manager and use the connection
    // settings we defined in our application.ini
    $connectionSettings = $this->getOption('doctrine');
    $conn = array(
        'driver'    => $connectionSettings['conn']['driv'],
        'user'      => $connectionSettings['conn']['user'],
        'password'  => $connectionSettings['conn']['pass'],
        'dbname'    => $connectionSettings['conn']['dbname'],
        'host'      => $connectionSettings['conn']['host']
    );
    $entityManager = \Doctrine\ORM\EntityManager::create($conn, $config);

    // push the entity manager into our registry for later use
    $registry = Zend_Registry::getInstance();
    $registry->em = $entityManager;

    return $entityManager;
}

А ето и конфигурацията за доктрина (в application.ini):

doctrine.conn.host = 'localhost'
doctrine.conn.user = '****'
doctrine.conn.pass = '****'
doctrine.conn.driv = 'pdo_mysql'
doctrine.conn.dbname = '****'
doctrine.path.models = APPLICATION_PATH "/models"

Както можете да видите, той търси моделите в APPLICATION_PATH "/models"


person xil3    schedule 10.12.2011    source източник


Отговори (1)


Ако приемем, че настройката на вашата доктрина е правилна и Zend_Registry::get('em'); връща entitymanager, тогава ето правилния синтаксис за ORM на интегрираната доктрина на Zend Framework:

$group=$em->getRepository ( 'Entities\Post' )->find (1));

or

$group=$em->getRepository ( 'Entities\Post' )->findOneByUserid (1));

Ако търсите ценна книга за доктрина и ZF, тогава „Лесни PHP уебсайтове с Zend Framework“ е добро място за начало.

Ако проблемът продължава, опитайте да го промените

/** @Id @Column(type="integer") @GeneratedValue */

to

/**
 * @Id @Column(type="integer")
 * @GeneratedValue(strategy="AUTO")
 */

проверете тук за документация за анотация. PS: Ако имате проблеми относно ZF и Doctrine, моля, въведете кой метод за интегриране на ZF-Doctrine използвате оттогава.

person Mehdi Fanai    schedule 12.12.2011
comment
Благодаря за отговора, но това не решава проблема с това, че Entities\Post не се зарежда. Мисля, че има нещо общо с конвенциите за именуване на Zend, но не мога да го сложа с пръст. - person xil3; 13.12.2011
comment
@xil3, ако е така, тогава би трябвало да има проблем с настройката на вашата доктрина. Кой метод за интегриране на доктрина използвате? Настроили ли сте правилно конфигурацията на доктрината в config.ini? къде точно сте поставили вашите обекти? - person Mehdi Fanai; 13.12.2011
comment
@xil3, доколкото мога да разбера, пътят на обекти не е дефиниран във вашия автозареждащ механизъм. Ето го и моя: $classLoader = new \Doctrine\Common\ClassLoader ( 'Entities', realpath ( Zend_Registry::get ( 'config' )->resources->entityManager->connection->entities ), 'loadClass' ); $autoloader->pushAutoloader ( array ($classLoader, 'loadClass' ), 'Entities' ); Моля, опитайте да използвате следния метод за интегриране: https://github.com/wjgilmore/z2d2 - person Mehdi Fanai; 14.12.2011
comment
Благодаря ви за помощта drfanai - току-що погледнах видео и очевидно има много начини, по които това може да се направи, но явно пропускам някои важни конфигурации тук. Започва да се превръща в огромен хак, за да накара това да работи, така че реших просто да използвам Symfony2, който работи като чар от самото начало и използва новите пространства от имена на PHP 5.3, които ZF все още не е. Ще се върна към това, когато ZF2 излезе, но няма смисъл дотогава. - person xil3; 17.12.2011