0

我按照以下文章中的步骤来集成 Zend Framework 1.11 和 Doctrine 2:

http://jeboy25.blogspot.com/2010/08/doctrine-2-and-zend-framework-110.html

我对这篇文章有 3 个问题:

1-在“SchemaToolClass”部分我不明白为什么作者在 ZendProject/public/index.php 文件的底部包含 schema_tool.php : $application->bootstrap() ->run();

2-当我执行命令“php 学说 orm:schema-tool:create”时,我在命令行中有以下错误消息:HP Stack trace: PHP 1. {main}() /Library/WebServer/Documents/carlending/ application/tools/doctrine:0 PHP 2.include() /Library/WebServer/Documents/carlending/application/tools/doctrine:7 PHP 3.require() /Library/WebServer/Documents/carlending/application/tools/doctrine. php:41 PHP 4. Doctrine\Common\ClassLoader->loadClass($className = uninitialized ) cli-config.php 文件中的“$config = new \Doctrine\ORM\Configuration();”行中出现错误

3-你能解释一下为什么作者将学说生成的代理和模型放在域文件夹中。它们像任何其他模型类一样驻留在模型文件夹中不是更好吗?有时我还看到一些程序员在模型中使用“生成”文件夹。

如果您设法将 Zend 1.x 和 Doctrine 进行了工作集成,如果您也可以向我发送一个非常有用的工作项目,我将非常高兴。

谢谢你的帮助。

4

2 回答 2

1

阅读http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/getting-started-xml-edition.html中的“获取 EntityManager”部分后

我认为您需要以下三行来引导:

use Doctrine\ORM\Tools\Setup;
require_once 'Doctrine/ORM/Tools/Setup.php';
Setup::registerAutoloadPEAR();
于 2011-10-31T22:31:32.000 回答
0

几周前我已经让它工作了,这是我的代码。教义2真的很好:)

在我的引导程序中

/**
 * Initialize auto loader of Doctrine
 *
 * @return Doctrine_Manager
 */
protected function _initDoctrine() {
    $this->bootstrap('autoload');

    require_once('Doctrine/Common/ClassLoader.php');

    // Create the doctrine autoloader and remove it from the spl autoload stack (it adds itself)
    require_once 'Doctrine/Common/ClassLoader.php';
    $doctrineAutoloader = array(new \Doctrine\Common\ClassLoader(), 'loadClass');
    //$doctrineAutoloader->register();
    spl_autoload_unregister($doctrineAutoloader);

    $autoloader = Zend_Loader_Autoloader::getInstance();

    // Push the doctrine autoloader to load for the Doctrine\ namespace
    $autoloader->pushAutoloader($doctrineAutoloader, 'Doctrine');

    $classLoader = new \Doctrine\Common\ClassLoader('Entities', realpath(__DIR__ . '/models/'), 'loadClass');
    $autoloader->pushAutoloader(array($classLoader, 'loadClass'), 'Entities');

    $classLoader = new \Doctrine\Common\ClassLoader('Symfony', realpath(__DIR__ . '/../library/Doctrine/'), 'loadClass');
    $autoloader->pushAutoloader(array($classLoader, 'loadClass'), 'Symfony');

    $doctrineConfig = $this->getOption('doctrine');
    $config = new \Doctrine\ORM\Configuration();

    $cache = new \Doctrine\Common\Cache\ArrayCache;
    $config->setMetadataCacheImpl($cache);
    $config->setQueryCacheImpl($cache);

    $driverImpl = new Doctrine\ORM\Mapping\Driver\YamlDriver(APPLICATION_PATH . '/../configs/mappings/yaml');
    //$driverImpl = $config->newDefaultAnnotationDriver($doctrineConfig['path']['entities']);
    $config->setMetadataDriverImpl($driverImpl);

    $config->setProxyDir(APPLICATION_PATH . '/../proxies');
    $config->setProxyNamespace('App\Proxies');

    $connectionOptions = array(
        'driver' => $doctrineConfig['conn']['driv'],
        'user' => $doctrineConfig['conn']['user'],
        'password' => $doctrineConfig['conn']['pass'],
        'dbname' => $doctrineConfig['conn']['dbname'],
        'host' => $doctrineConfig['conn']['host']
    );

    $registry = Zend_Registry::getInstance();
    $registry->entitymanager = $em;

    return $em;
}

架构等

正如您在上面看到的那样,我使用 yaml,我没有看过教程,但我使用了命令行工具,它就像一个魅力,我的学说.php(位于 APPLICATION/bin 中):

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/..'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path()
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/../configs/application.ini'
);

$application->getBootstrap()->bootstrap('doctrine');


require_once __DIR__ . '/../Bootstrap.php';

$em = $application->getBootstrap()->getResource('doctrine');

$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
    'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em, APPLICATION_PATH . "/configs/mappings")
));

\Doctrine\ORM\Tools\Console\ConsoleRunner::run($helperSet);

您首先必须生成您的实体:

  • 生成所有模型而不删除,还创建注释 - ./doctrine orm:generate-entities ~/Public/my_app/application/models/ --regenerate-entities 0 --generate-annotations 1

然后生成你的模式 ./doctrine orm:schema-tool:create --dump-sql 或 ./doctrine orm:schema-tool:update --dump-sql

代理并不是你模型的一部分,它只是被 Doctrine 内部使用,所以我把它作为模型文件夹中的一个单独的实体,但我想这并不重要:./doctrine orm:generate-proxies ~ /公共/my_app/代理/

请记住为 apache 组的代理添加写权限。

嗯......我想我没有完全解释 Jeboy 的解决方案,但也许我的代码可以帮助你开始,我花了一段时间,但一旦它启动并运行它就像一个魅力:) PS 不要忘记“命名空间实体; " 在您的每个模型中(应该自动生成)

于 2011-01-05T22:01:32.583 回答