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

106 篇文章 1 订阅
9 篇文章 0 订阅

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


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


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

doctrine-files


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

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文件了:

run-doctrine-test


看来是成功了。


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


创建数据库与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框架内对文件命名的规则。


生成的文件:

generated-models


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文件。


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

error-doctrine


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


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

success-doctrine


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值