您的位置:首页 > 编程语言 > PHP开发

Note on <Zend Framework - A Beginner's Guide> - 04 使用Doctrine初体验

2012-09-28 17:30 417 查看
Chapter 4: Working with Models

这章不长,不过却非常麻烦,因为作者都是在讲如何使用一个叫Doctrine的东东。而这个插件主要做的是ORM,这也是我之前在国外论坛里见到这本书遭非议的原因,ORM不适合初学者,也不是任何场合都适合用ORM。不过作者在这一章解释这样做的原因为:Zend Framework自身还没有Zend_Model组件,不过这是个时间和历史的限制,这本书写就时的ZF的版本与眼下比应该早很多,现在ZF中或许已经有了,我说或许,因为我也不清楚,至少现在我使用的ZF的路径下还没有命名为“Model”的PHP或文件夹。

在经过一个简短的关于Model的设计原理的介绍和讨论之后,作者就从Doctrine的安装讲起,杯具就开始了,从截图来看,作者安装的Doctrine是1.1.4版本,而现在的Doctrine版本是2.3:

http://www.doctrine-project.org/blog/doctrine-2-3-final.html

现在咱们来看看这个版本差异究竟意味神马。

首先把下载下来的压缩包打开之后,见到里面的情况是:



这与书中介绍的情况完全不同。这里面的文件夹,差不多分别对应着官网介绍的几个不同项目:

http://www.doctrine-project.org/projects.html

基本上现在的Doctrine是集成了几个东西在一起。通过比对文件夹内容,任何一个文件夹都不接近书中提及的。可是从上面的官网文章的介绍来看,想在的压缩包里的ORM好像接近书中1.1.4版本的Doctrine。于是最终我决定放弃使用最新版本的Doctrine来完成这个实验,而是使用能找到的ORM的最古老版本:1.2.4。

http://www.doctrine-project.org/projects/orm.html

很遗憾,即使这样,下载到的版本也与书中使用的版本相差甚远,首先第一个问题就是,新的压缩档并没有Doctrine/Doctrine.php这个文件,所以按照书中列出的代码并不能正常执行:

<?php
// include main Doctrine class file
include_once 'Doctrine/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));
// create Doctrine manager
$manager = Doctrine_Manager::getInstance();
// create database connection
$conn = Doctrine_Manager::connection(
'mysql://root@localhost/test', 'doctrine');
// get and print list of databases
$databases = $conn->import->listDatabases();
print_r($databases);
?>


而在Doctrine中搜索doctrine.php没有任何结果。。。。现在只能抛弃这本书,完全以官方网站的教程为指南了:http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/getting-started.html#implementing

10月11日:

我想有必要回来继续报告关于这个话题的进展。

我之前犯了些低级的错误,其实Doctrine.php文件就在压缩档案的根路径下。

总之,需要在PEAR/下面创建一个新的Doctrine文件夹,然后将压缩包内的东西都放进PEAR/Doctrine/下面。现在创建文件php/tmp/doctrine-test.php,其内容上面提到过,但是,注意,其中建立数据库连接一处,要按照你的数据库配置填写,上面的代码中是假设账号名为root,密码为空,如要指定密码,格式应为:

mysql://root:password@localhost/test

参见:http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/introduction-to-connections.html

现在终于可以在命令行里执行这个PHP文件了:



看来是成功了。

下面继续跟着书中的指导操作。

创建数据库与model

创建square数据库。这个我就用phpMyAdmin手动搞了。接着用Doctrine来扫描square数据库并创建对应的Model类文件。创建文件php/tmp/doctrine-models-generate.php:

<?php
// include main Doctrine class file
include_once 'Doctrine/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));

// create Doctrine manager
$manager = Doctrine_Manager::getInstance();

// create database connection
$conn = Doctrine_Manager::connection(
'mysql://root:appson@localhost/square',
'doctrine'
);

// auto-generate models
Doctrine::generateModelsFromDb(
'./tmp/models',
array('doctrine'),
array(
'classPrefix' => 'Square_Model_',
'classPrefixFiles' => false
)
);
?>


由于这个文件自身的路径与书中不同,所以我修改了generateModelsFromDb()的第一个参数:'./tmp/models';除此之外,我也按照书中建议,传递了classPrefixFiles设置,这样生成的PHP文件的文件名将不会有前缀,而这样做是为了符合ZF框架内对文件命名的规则。

生成的文件:



Doctrine会为每个数据表生成两个model类文件,一个是Base<table name>.php格式,放在generated文件夹内,另一个是<table name>.php格式。其中,前者继承自Doctrine_Record类,用来封装所有对数据表的操作;而后者继承了前者,用来给开发人员定制自己的扩展功能。现在要把所有这些生成的类文件放在路径square/library/Square/Model/下。

设定model之间的关系

那么,现在要做的是建立Item模型与Grade、Country和Type之间的关系,打开Item.PHP(此时应该见到它的类定义是空白的),添加setUp()方法为:

public function setUp()
{
$this->hasOne('Square_Model_Grade', array(
'local' => 'GradeID',
'foreign' => 'GradeID'
)
);
$this->hasOne('Square_Model_Country', array(
'local' => 'CountryID',
'foreign' => 'CountryID'
)
);
$this->hasOne('Square_Model_Type', array(
'local' => 'TypeID',
'foreign' => 'TypeID'
)
);
}


现在要做的是在ZF中设置Doctrine,令ZF认得后者。在application.ini中,加入:

doctrine.dsn = "mysql://root:password@localhost/square"


然后在application/Bootstrap.php中,加入_initDoctrine()的定义:

protected function _initDoctrine()
{
require_once 'Doctrine/Doctrine.php';
$this->getApplication()
->getAutoloader()
->pushAutoloader(array('Doctrine', 'autoload'),	'Doctrine');

$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(
Doctrine::ATTR_MODEL_LOADING,
Doctrine::MODEL_LOADING_CONSERVATIVE
);
$config = $this->getOption('doctrine');
$conn = Doctrine_Manager::connection($config['dsn'], 'doctrine');
return $conn;
}


这个方法将会被ZF自动执行,在每个请求到达的时候。而它做的事情就是读取之前在配置文件中写的链接参数,然后创建一个数据库连接。

在Square项目中使用Doctrine

作者在简单介绍了下如何通过Doctrine的DQL操作数据库数据之后,便回到Square,在其中创建一个新的模块catalog,并在其中使用Doctrine来显示数据库中的数据,在这个例子中,作者展示了如何用Doctrine获取数据。创建catalog模块的controllers和view的具体操作我就不复述了,大致流程还是在application.ini里添加一个新route,然后创建新的controller文件和view文件。

但是,又是很不幸,在弄好一切之后,见到的结果是



事实证明,这是书中作者的谬误,作者在文中说访问如下链接来测试这个新module:http://square.localhost/catalog/item/1

然而实际上应该是:http://square.localhost/catalog/item/display/1

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐