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这个文件,所以按照书中列出的代码并不能正常执行:
而在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:
由于这个文件自身的路径与书中不同,所以我修改了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()方法为:
现在要做的是在ZF中设置Doctrine,令ZF认得后者。在application.ini中,加入:
然后在application/Bootstrap.php中,加入_initDoctrine()的定义:
这个方法将会被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
这章不长,不过却非常麻烦,因为作者都是在讲如何使用一个叫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
相关文章推荐
- Note on <Zend Framework - A Beginner's Guide> - 06
- Note on <Zend Framework - A Beginner's Guide> - 03
- Note on <Zend Framework - A Beginner's Guide> - 07
- Note on <Zend Framework - A Beginner's Guide> - 05
- Note on <Zend Framework - A Beginner's Guide> - 01:Apache的URL重寫,ZF項目結構
- Note on <Zend Framework - A Beginner's Guide> - 02 ZF原理;继续解决第二章的问题
- Note On <You Don't Know JS - Scope and Closures>
- Note On <Programming Entity Framework 2nd Edition> -04
- Note on <Beginning Microsoft SQL Server 2012 Programming> - 04
- Note on <Beginning Microsoft SQL Server 2012 Programming> - 02
- ASSIGN ('(SAPLV60A)TKOMP[]') TO <fs_komp>这样语句的理解和使用
- vs2005中使用'查找和替换'将 (&lt;link &gt;) 替换为 (&lt;link /&gt;)
- 关于C++ vector<S>使用时,错误 5 error C2719: “_Val”: 具有 __declspec(align('16')) 的形参将不被对齐
- Note on <C# 3.0 UNLEASHED With the .NET Framework 3.5> - 02
- 在字符串中使用特殊字符<>"'&空格
- Note on <C# 3.0 UNLEASHED With the .NET Framework 3.5> - 01
- Note on <Beginning Microsoft SQL Server 2012 Programming> - 05
- Note On <Programming Entity Framework 2nd Edition> -03
- Note On <Programming Entity Framework 2nd Edition> -05
- Note on <Beginning Microsoft SQL Server 2012 Programming> - 01