【问题标题】:How do I get zend to recognize the paths to Propel ORM如何让 zend 识别 Propel ORM 的路径
【发布时间】:2011-03-23 05:52:50
【问题描述】:

我正在尝试让 Propel 在我的 Zend 应用程序中工作,似乎我可以加载 Propel 库(从库/propel),但是当调用时我得到异常:'运行时配置文件中没有连接信息for datasource [default]'(当我尝试建立连接时:'Propel::getConnection')。我的数据库甚至没有被命名为“默认”。我的 bootstrap.php 中有这个来自另一个 SO 问题/答案:

           require_once 'propel/Propel.php';
       Propel::setConfiguration($this->getOptions('propel/MyPropel-conf.php'));
       Propel::initialize();

       // so we can get the connection from the registry easily
       return Propel::getConnection();

我希望 Propel 配置(以及 classmap conf)位于“/application/configs”中(现在也有副本),但我想如果我可以让 Propel 从 library/propel 加载,那么也许将我的“conf”文件移到那里,我也可以让它们加载。似乎如果我通过手动加载参数来“强制”配置,或者如果我似乎将它放在临时的“正确”位置(或使用绝对路径),那么我得到的异常是: '无法打开 PDO 连接 [wrapped: SQLSTATE [28000] [1045] 用户 'www-data'@'localhost' 的访问被拒绝 好像 Propel 没有注意我的配置。 我的配置看起来像这样;从xml转换:

    $conf = array (
  'datasources' => 
  array (
    'unmActTestDB' => 
    array (
      'adapter' => 'mysql',
      'connection' => 
      array (
        'dsn' => 'mysql://root:PASSWORD@localhost/unmActTestDB',
      ),
    ),
    'default' => 'unmActTestDB',
  ),
  'log' => 
  array (
    'ident' => 'propel-act',
    'level' => '7',
  ),
  'generator_version' => '1.5.6',
);
$conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classmap-unmActTestDB-conf.php');
return $conf;

如果有帮助,我仍然在 application.ini 文件中加载 Zend PDO DB 适配器,这会导致冲突吗?有没有让 Propel 与 Zend 一起工作的标准方法?或者任何人都可以看到我做错了什么?

我在 SO 上看过几个帖子,还有几个受欢迎的帖子,比如这个 The Adventures Of Merging Propel With Zend Framework 和 Zend 开发区 Integrating Propel with the Zend Framework 的这个帖子,其中包括 Propel Docs。他们一直很有帮助,但我真的很挣扎。提前致谢!我当前的 Zend 目录结构如下所示(在 library/propel 文件夹中还有两个 propel conf:

【问题讨论】:

  • 我已经解决了路径问题,连接问题是由于我在运行时 conf xml 文件中忽略了 造成的。
  • 您应该将其发布为答案。回答自己的问题没有错
  • @PHil Brown 你说得对,对不起......我会马上解决的! :)

标签: database zend-framework orm pdo propel


【解决方案1】:

我最终做的是:

我很好地掌握了如何使用 Propel 从“反向”生成模型。它(和以前一样)创建了一个“schema.xml”文件供我构建模型。

此外,我的“runtime.xml”文件不符合我的需要,在构建后我没有连接到正确的数据库,因为我遗漏了一些标签,但总的来说它非常简单:

    <?xml version="1.0" encoding="UTF-8"?>
<config>
 <log>
  <ident>unmActTestDB</ident>
  <level>7</level>
 </log>
 <propel>
  <datasources default="unmActTestDB">  
   <datasource id="unmActTestDB">
    <adapter>mysql</adapter>    
    <connection>
    <dsn>mysql:host=localhost;dbname=unmActTestDB</dsn>
    <user>zend</user>
    <password>PASSWORD</password>
    <database>unmActTestDB</database>
    </connection>    
   </datasource>   
  </datasources> 
 </propel>
</config>

“dsn”标签必须采用上述格式,并添加“用户”、“密码”和“数据库”标签。这解决了我的数据库连接错误问题。正如上面(和这里)所引用的那样,抛出的异常是:“数据源的运行时配置文件中没有连接信息[默认]”

就我的模型的加载而言,我最终将它们放在我的“库”文件夹中,我已经在我的应用程序中自动加载了该文件夹,而且它似乎是它们的一个好地方。

这是我的“更新”目录结构的图像:

注意在我的目录中添加了“unmActTestDB”文件夹,这是我的 ORM 模型。 另一件需要注意的是,我将生成的“conf”文件放入了“application/configs”文件夹中。在更正 runtime.xml 文件和“重建”之后,这些现在是正确的。

作为旁注,我不得不手动编辑我的“schema.xml”文件(多次:))...原始数据库使用复数名称作为表,所以我编辑了所有的“phpname”声明(实际上,在声明标签上的属性)是单数的,所以我不会访问一个名为“用户”的对象......相反,我现在可以访问一个“用户”对象。我保持表名相同(表是复数,导入现有数据等不会有任何问题)这是我的另一个问题的答案建议的,请参阅此处How to get related object Propel ORM

我所做的另一项重大修改是为数据库中的许多 SQL 视图添加主键声明(同样是属性),我还在声明中添加了一个“只读”和一个“noSQL”属性,这样我会可以(通过 Propel 模型)访问我的视图。

而且,为了彻底,对于那些对此感兴趣的人,我的“bootstrap.php”文件中添加了我的“Propel Init”...

protected function _initPropel()
        {
            $this->_logger->info('Bootstrap ' . __METHOD__);

            require '../library/propel/Propel.php';
            Propel::init(APPLICATION_PATH . '/configs/unmActTestDB-conf.php');
            Propel::initialize();

            return Propel::getConnection();
        }

另一个注意事项:'$this->_logger->info('Bootstrap' . METHOD);'调用我的“日志”方法,它只是告诉“firePHP”该方法已加载。 /configs/unmActTestDB-conf.php'调用Propel生成的第二个'conf'文件......这里是该文件的'更正'版本(即unmActTestDB.conf文件),注意'连接'数组。

<?php
// This file generated by Propel 1.5.6 convert-conf target
// from XML runtime conf file runtime-conf.xml
$conf = array (
  'datasources' => 
  array (
    'unmActTestDB' => 
    array (
      'adapter' => 'mysql',
      'connection' => 
      array (     
        'dsn' => 'mysql:host=localhost;dbname=unmActTestDB',
        'user' => 'zend',
        'password' => 'PASSWORD', 
        'database' => 'unmActTestDB', 
      ),
    ),
    'default' => 'unmActTestDB',
  ),
  'log' => 
  array (
    'ident' => 'unmActTestDB',
    'level' => '7',
  ),
  'generator_version' => '1.5.6',
);
$conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classmap-unmActTestDB-conf.php');
return $conf;

我现在开始跑步了!这是一个很好的方法,否则我正在为我的应用程序寻找和编写太多的映射类。 Propel(目前)为此应用程序生成了 300 多个模型!加上基类,这将花费我很长时间......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多