2007-01-30

Blogger们都怎么了?


最近发现很多bloger们写作的速度都明显慢了下来,甚至有些bloger们很久都没有更新他们的blog了,有些blog更多的是充满着



links for 2007-01-28


某某某昨日关注



可能是我关注的面比较窄,互联网,开发类占据了绝大多数。但是比起国外的一些bloger们,我们的速度和热度明显的下降了,难道是股市热潮把bloger们也吸引过去了?


在中国互联网也许不是2007最关注的话题了,也许,股市是大家更加关注的话题,也许股市让你觉得更加赚钱,但是我希望中国互联网积攒下来的这些优秀的bloger们不要再流失了。毕竟我们不是为了利益才去写blog。


update:就连前一段时间在中国极火的RoR最近也销声匿迹了。难道在中国什么东西就只能这样?昙花一现?


2007-01-25

关于DB2的JDBC驱动


昨天在用java链接db2的数据库时发现以前没有注意的一些问题,之前链接db2的jdbc通常是:





JDBC Driver:COM.ibm.db2.jdbc.net.DB2Driver


JDBC URL:jdbc:db2://127.0.0.1:6789/sample


组合后也就是:


Class.forName( " com.ibm.db2.jdbc.net.DB2Driver " );
String url = " jdbc:db2://192.9.200.108:6789/SAMPLE "
Connection conn = DriverManager.getConnection( url, sUsr, sPwd );



这是我们通常意义上所说的type3纯java驱动,这类驱动程序使用纯 JAVA 客户机,并使用独立于数据库的协议与中间件服务器通信,然后中间件服务器将客户机请求传给数据源。这个中间件服务器就是安装DB2后在服务中显示为"DB2 JDBC小应用程序服务器--对DB2应用程序提供JDBC服务支持"(当然我是在windwos上安装DB2的),务必使这个服务启动,否则type3型的JDBC是链接不上的。


此外用的比较多的是type4型的纯java驱动





JDBC Driver:com.ibm.db2.jcc.DB2Driver


JDBC URL:jdbc:db2://127.0.0.1:50000/sample



下面是一段IBM网站的引用:





依照 JDBC 规范,有四种类型的 JDBC 驱动程序体系结构:


Type 1:这类驱动程序将 JDBC API 作为到另一个数据访问 API 的映射来实现,如开放式数据库连通性(Open Database Connectivity,ODBC)。这类驱动程序通常依赖本机库,这限制了其可移植性。JDBC-ODBC 桥驱动程序就是 Type 1 驱动程序的最常见的例子。
Type 2:这类驱动程序部分用 JAVA 编程语言编写,部分用本机代码编写。这些驱动程序使用特定于所连接数据源的本机客户端库。同样,由于使用本机代码,所以其可移植性受到限制。
Type 3:这类驱动程序使用纯 JAVA 客户机,并使用独立于数据库的协议与中间件服务器通信,然后中间件服务器将客户机请求传给数据源。
Type 4:这类驱动程序是纯 JAVA,实现针对特定数据源的网络协议。客户机直接连接至数据源。
对于DB2 UDB V7.2来说,它不支持 Type 1 和 Type 4 的驱动程序,但是提供了分别支持 Type 2 和 Type 3 的驱动程序。


示例如下:


两种驱动程序均随产品安装由 db2java.zip 提供。


COM.ibm.db2.jdbc.app.DB2Driver
这是一种 Type 2 的 JDBC 驱动程序,它通过 DB2 本地客户机库的帮助建立和 DB2本地数据库或是远程数据库的连接(事先将远程数据库编目到本地)。因此,我们必须在应用系统所在的机器上同时部署 DB2 本地客户机库,这也许是它最大的一个不足之处。


使用格式如下:


Driver Name:COM.ibm.db2.jdbc.app.DB2Driver


URL Pattern:jdbc:db2:databasename


databasename: 需要访问的数据库名


COM.ibm.db2.jdbc.net.DB2Driver
这是一种 Type 3 的 JDBC 驱动程序,它通过与一台已经部署了 DB2 本地客户机库的机器通信来建立和 DB2 远程数据库的连接。


使用格式如下:


Driver Name:COM.ibm.db2.jdbc.net.DB2Driver


URL Pattern:jdbc:db2:ServerIP:databasename


ServerIP: 需要访问的数据库所在机器IP地址


databasename: 需要访问的数据库名


(目标DB2系统侦听该服务于默认端口6789,否则还需要在 URL Pattern 中指定目标端口号)


对于 DB2 UDB V8.1 来说,它仍然不支持 Type 1 的驱动程序。同时,它在 DB2 UDB V8.1的基础上,新增加了对 Type 4 驱动程序的支持。


示例如下:


DB2 UDB V8.1 仍然支持上面所述 V7.2 支持的两种驱动程序,随产品安装由 db2java.zip 提供,但具体实现上和 DB2 UDB V7.2 产品发布的包有所不同,所以可能存在下文所要进行实验验证的兼容性问题。


除了 COM.ibm.db2.jdbc.app.DB2Driver 之外,DB2 UDB V8.1 还提供了另外一种 Type 2 的驱动程序,随产品安装由 db2jcc.jar 提供。其实现包名是 com.ibm.db2.jcc.DB2Driver,在DB2 UDB V8.1 最初的实现中,此驱动程序只用于使用 Type 4 驱动程序体系结构与 DB2 服务器进行直接的 JAVA 连接,这类驱动程序由于不需要另外部署 DB2 本地客户机库以及性能相对较好而收到开发人员的欢迎。自从 DB2 UDB V8.1.2(安装了 FixPack 2)之后,开发人员还可以在 Type 2 体系结构中使用该驱动程序,以提高本地应用程序的性能。


这里,两种驱动程序具有相同的实现类名称,有两种不同的方法可以区分 DB2 系统在内部最终会实例化哪个驱动程序:


使用不同的 URL Pattern 来区分两种不同的驱动程序
Type 2 Driver URL Pattern:jdbc:db2:databasename


这当中 databasename 是需要访问的数据库名


Type 4 Driver URL Pattern:jdbc:db2://ServerIP:50000/databasename


这当中 ServerIP 是需要访问的数据库所在机器IP地址,databasename 是需要访问的数据库名,DB2 服务器会在默认端口 50000 上进行侦听。


使用连接特性来区分数据库连接是否会使用 DB2 本地客户机库,或者是使用JAVA 直接连接。
DB2 UDB V8.1 新增加支持的这种 Type 4 驱动程序,常被称为"通用 JDBC 驱动程序",是一种与驱动程序类型连通性或目标平台无关的抽象 JDBC 处理器,因此常用于进行分布式和本地 DB2 UDB 访问。因为"通用 JDBC 驱动程序"独立于任何特定 JDBC 驱动程序类型连通性或目标平台,所以它在一个 DB2 UDB 驱动程序实例中同时支持所有 JAVA 连通性(Type 4 驱动程序)和基于 JNI 的连通性(Type 2 驱动程序)。该驱动程序可以用于独立 JAVA 应用程序或多层应用程序,是开发人员一个不错的选择。



关于DB2 JDBC驱动的jar包:



db2java.zip包含两个驱动类COM.ibm.db2.jdbc.app.DB2Driver.class(第二类驱动,现在不推荐使用),另一个COM.ibm.db2.jdbc.net.DB2Driver.class(第三类驱动,也叫applet驱动,网络驱动)
db2jcc.jar是IBM推荐使用的,其包含一个新的第二类驱动和一个第四类驱动,二者通过uril来区分




参考信息:



http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512kokkat/


http://www.ibm.com/developerworks/cn/db2/library/techarticles/0402chenjunwei/0402chenjunwei.html






2007-01-23

充足的带宽


看到keso的文章东拉西扯:当每个人都有充足的带宽,有了下面一些想法。


1.Microsoft Office和Visual Studio不是因为带宽的增长就不需要购买了,这个和音乐,电影这些数据不一样。带宽可以解决数据传输的问题,但是你需要的不仅仅是数据,你需要的是服务。


2.如果没有Box.net这样的网络资源的存储地,或者是下载网站这些类似的存储地,恐怕你需要把所以的东西都要备份在硬盘上了,带宽更加没有用了。


3.BitTorrent、eMule、P2P的价值不在于缓解带宽的不足,带来下载的速度。他们的意义是一种资源的交流和共享。


4.个人认为充足的带宽带来的是服务的多样话,多元化,和分散,也许以后没有像google,微软这样的巨无霸的,我们需要的服务都分散在各地,各人。也许以后连上班都不用了,每个人提供一种服务,用自己提供的服务,去换取别人的服务。呵呵,希望有这么一天。


5.随着互联网的发展,人们似乎越来越倾向于把应用都搬到互联网上了,可是似乎人们都走上了浏览器这个方式,当然目前你需要上网就必然需要浏览器,以至于人么在浏览器中做出各种各样的应用,以至于OS。我总觉得大家似乎走了弯路,难道没有浏览器互联网就不是互联网?那天大家都没有浏览器的概念,一开电脑什么都有了,音乐从音乐的服务商那里取得,新闻从专门提供新闻的服务商那里获取。让互联网服务想用自来水一样,打开电脑想要什么就有了,而不是现在,大家首先要开一个浏览器。


google.cn有意思的变化

今天在搜索时发现google.cn的有趣变化(也许早变化了,我没有发现)









google.com









图片可以看出google.cn多出了搜索建议和相应的结果数。记得以前iask.com(新浪的爱问)好像有这个功能,现在没有了。不过有道似乎一开始就提供了这个功能。回头在看看google.com却发现并没有这个功能,呵呵,很有意思,这意味着什么?难道谷歌又有什么新动作了?

2007-01-09

CakePHP Manual翻译2.5:基础概念


基础概念


第一节



介绍


这一节很短,只是介绍一下MVC在Cake中的实现。加入你刚刚得知MVC模式,那么这一节将非常适合你。下面我们通过CakePHP里面的一些MVC应用来讨论基础的MVC概念,然后展示一些简单的CakePHP中使用MVC模式的例子。


第二节



MVC模式


Model-View-Controller(模型-视图-控制器)是一种软件设计模式,他可以帮助你分离一些逻辑代码,使他们可以复用,更加易于维护,从而变得更好。MVC是有author group Gang of Four(译者注:《设计模式》那本书的四位作者,简称四人组)首先提出的。Dean Helman写到(从Objective Toolkit Pro white paper截取):




"The MVC paradigm is a way of breaking an application, or even just a piece of an application's interface, into three parts: the model, the view, and the controller. MVC was originally developed to map the traditional input, processing, output roles into the GUI realm.


Input -> Processing -> Output


Controller -> Model -> View


"The user input, the modeling of the external world, and the visual feedback to the user are separated and handled by model, view port and controller objects. The controller interprets mouse and keyboard inputs from the user and maps these user actions into commands that are sent to the model and/or view port to effect the appropriate change. The model manages one or more data elements, responds to queries about its state, and responds to instructions to change state. The view port manages a rectangular area of the display and is responsible for presenting data to the user through a combination of graphics and text."



在CakePHP中,Model描述了一条数据库表中的记录,并且它可以关联其他表的记录。Model中还包含数据的验证规则,这些规则将在model中的数据向数据库插入和更新的时候起作用。View描述了CakePHP的展现文件,这些文件是一些嵌入了php代码的规则的HTML文件。Cake (CakePHP)的Controller从服务器处理请求。他们获得用户输入(从URL和POST数据中),运行业务逻辑,使用Model从数据库读写数据,然后输出数据到对应的展现文件。


为了尽可能简单的组织你的应用,Cake使用这种模式(当然不是仅仅使用MVC)管理object(对象)如何同你的应用交互,同时也管理你的文件,我们在下一节将详细讨论这个。


第三节



Cake文件布局概览


当你解压Cake后在你的服务器上你会看到下面一些文件夹




app
cake
vendors

cake文件夹放置了Cake的核心库,一般情况下不需要做修改。


app文件夹是你应用的文文件存放的地方。cakeapp文件夹分开可以使你的多个应用共享一个Cake库。这样也使你升级CakePHP更加便捷:你只需要下载最新的Cake覆盖你现有的Cake库,而不需要担心这样会覆盖你写的应用程序。


vendors目录用于存储第三方的类库。你可以通过Cake的vendor()函数来访问你放置在vendors目录中的类。关于vendors在后面我们会详细介绍。


让我们看看整个文件的布局:




/app
/config - 包含数据库、ACL等的配置文件.

/controllers - Controllers放在这里
/components - Components放在这里

/index.php - 可以部署cake和/app为服务器的DocumentRoot

/models - Models放在这里

/plugins - Plugins放在这里

/tmp - 用于存储缓存(cache)和日志(logs)

/vendors - 应用程序中用到的第三方库放在这里

/views - Views放在这里
/elements - Elements,和少量的views放在这里
/errors - 自定义的错误页面放在这里
/helpers - Helpers放在这里
/layouts - 应用程序布局文件放在这里
/pages - 静态的展现页面放在这里

/webroot - web应用的根目录(DocumentRoot)
/css
/files
/img
/js

/cake - Cake的核心库。不要编辑这里的文件

index.php

/vendors - 用于服务器端的第三方类库。

VERSION.txt - 你运行的CakePHP的版本信息文件。




CakePHP Manual翻译5:脚手架(Scaffolding)


脚手架(Scaffolding)



第一节



Cake的Scaffolding非常的优美并且酷毙了


它非常酷,你会想在你的应用中应用它。现在,我们都认为它非常的酷,但是脚手架是……哦,……它仅仅是一个脚手架。在项目的开始他能够快速的为你的项目创造原型。这也就是说他不是很灵活。所以,如果你想真的自定义你的业务逻辑和试图(views),那么是时候放下脚手架,写一些代码了。脚手架是在开发 web应用开始阶段,获得早期版本的非常好的方式。早期的数据库定义会时常发生变化,脚手架非常适合早期的设计过程。一个web开发人员非常讨厌创佳一些不会真正使用的表单,脚手架可以减少这些表单的创建。为了减少开发人员的变化,Cake提供了脚手架。脚手架分析数据库中的表,为数据库的每一条记录创建标准列表的增加,删除和编辑按钮,标准的编辑表单和标准的视图(view)。为应用添加脚手架只需要在controller中添加$scaffold变量:





<?php
class CategoriesController extends AppController
{
var $scaffold;
}
?>


关于脚手架要注意非常重要的一条:它假设 _id 结尾的字段为外键,并且_id前是外键表的名称。例如,有一个嵌套的类别,你可能有一个列,列名叫parent_id。当他发布,他会调用他的parentid。同样,当你有一个外键在表中(例如titles表中有category_id),他会关联一个正确的model(参见《理解关联》6.2),一个查询会自动从外键表对应的model中组装结果。title类中代码如下:




<?php
class Title extends AppModel
{
var $name = 'Title';

var $displayField = 'title';
}
?>




第二节



自定义脚手架视图


如果你想脚手架有一些不同,你可以自己创建他们。我们仍然不建议在成型的产品中使用这中技术,但是这样的定制对于原型的迭代非常有效。


如果你想改变脚手架的视图,你需要自己提供:


为单个的Controller定制视图



在下面这些地方为PostsController定制脚手架视图:


/app/views/posts/scaffold/index.scaffold.thtml
/app/views/posts/scaffold/show.scaffold.thtml
/app/views/posts/scaffold/edit.scaffold.thtml
/app/views/posts/scaffold/new.scaffold.thtml

为整个应用定制脚手架视图



在下面这些地方为整个应用定制脚手架视图:


/app/views/scaffold/index.scaffold.thtml
/app/views/scaffold/show.scaffold.thtml
/app/views/scaffold/edit.scaffold.thtml
/app/views/scaffold/new.scaffold.thtml

如果你想自己定义controller的逻辑,那么是时候让从脚手架上下来,自己创建他们了。


有一个特性可能会非常有用,那就是Cake的代码生成器:Bake。Bake可以生为脚手架生成一个代码版本,然后你可以修改这些代码,按照需求去定制你的应用。




2007-01-08

CakePHP Manual翻译4:配置




配置


第一节


数据库配置


所有的数据库配置都在 app/config/database.php 文件中。 新安装的Cake中没有 database.php, 所以你需要拷贝一份 database.php.default 将它重命名为database.php你会看到如下内容在app/config/database.php 文件中:





app/config/database.php




var $default = array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'project_name',
'prefix' => '');



为你的应用配置数据库链接信息,只需要替换一些默认的配置。


关于前缀:输入的这些配置将会在应用执行SQL之前配置数据库。你只需要在这里定义一次。如果你的主机只有一个数据库可以使用(译者注:在一个数据库上跑多个应用),同样也要遵循Cake的表命名约定。注:对于HABTM(hasAndBelongsToMany,参见Model章节)连接表,你只需要增加前缀一次,如:prefix_apples_bananas,而不是 prefix_apples_prefix_bananas(apples和bananas是两张关联表)。


CakePHP提供如下数据库驱动:




  1. mysql




  2. postgres




  3. sqlite




  4. pear-drivername (so you might enter pear-mysql, for example)




  5. adodb-drivername




$default中的'connect'链接允许你指定要做持久化的数据库链接。database.php.default中的注释详细说明了数据库配置中的连接类型。


数据库的表必须遵循如下约定:




  1. 表名习惯用英文单词的复数形式组成,如:"users", "authors" 或 "articles"。对应的models用单数形式,如:"user", "author" 或 "article"。




  2. 表必须要有一个主键,名称为id。




  3. 如果表需要做关联,则外键必须看起来像这样: article_id,关联表名的单数形式后面接下划线(_)后面接id。




  4. 如果表中包含'created' 或者 'modified' 列,Cake将自动向改列中写入和修改其值。




在database.php文件中有$test连接设置,在models中添加如下语句:


var $useDbConfig = 'test';


你就可以运用$test中的连接设置。


你可以用这种添加多个连接设置。



第二节



全局配置


CakePHP的全局配置在文件app/config/core.php中。我们不喜欢配置文件,它仅仅是一些必要的配置。这里只有一些内容,你可以改变,每一个配置你都可以在 core.php 的注释中找到说明。


DEBUG:设置它为不同的值,将会帮助你调试你的应用。将他设置成一个非0的值,Cake将会打印出pr()debug()函数的调用结果,并且自动停止页面的跳转。将他设置成2或者更大将作用鱼SQL语句,SQL语句将被打印在输出页面的底部。同样,当处于调试模式(DEBUG被设置成0或者更大),Cake将提示一些页面生成的错误,如"Missing Controller","Missing Action",等待。尽管在产品模式(DEBUG被设置成0),Cake显示的"Not Found"页面,也可以在 app/views/errors/error404.thtml 中被重写。


CAKE_SESSION_COOKIE:设定在Cake应用中使用的用户session的cookie的名字。


CAKE_SECURITY:这个值设定你的sessions检查级别。Cake中的sessions过期时间,生成新sessions的id,删除旧sessions文件,会依赖你在这里的设置。设置的值如下:




  1. high: sessions将在处于不活动状态10分钟后过期,并且为每一个请求重新生成一个新的session id。




  2. medium: sessions将在处于不活动状态20分钟后过期。




  3. low: sessions将在处于不活动状态30分钟后过期。




CAKE_SESSION_SAVE:设定保存session数据的保存方式. 设置的值如下:




  1. cake: Session数据保存在应用中的 tmp/ inside 下。




  2. php: 按照 php.ini 中设置的方式保存Session数据。




  3. database: Session数据保存在数据库连接设置中'default'关键词设置的数据库中。





第三节



路由配置


路由(Routing)是一个纯PHP的类似mod_rewrite的功能,它可以映射URL到controller/action/params这样的模式,并且返回数据。它可以美化URL而不需要mod_rewrite,并且可配置。尽管如此,使用mod_rewrite,可以使地址栏看起来非常整洁。


路由有独立的规则将URL映射到指定的controllers和actions。在app/config/routes.php配置路由。设置如下:




路由模式



<?php
$Route->connect (
'URL',
array('controller'=>'controllername',
'action'=>'actionname', 'firstparam')
);

在上面代码中:




  1. URL 是一个你希望在Cake中映射的URL的正则表达式,




  2. controllername 是你希望调用的controller的名称,




  3. actionname 是你希望调用的action的名称,




  4. and firstparam 调用action的第一个参数.




任何在firstparam 后的参数同样被当作参数传递给controller action.


下面的例子演示将所有的在/blog后的URL映射到BlogController。controller中默认的action是BlogController::index()。



路由示例



<?php
$Route->connect ('/blog/:action/*', array('controller'=>'Blog', 'action'=>'index'));
?>

像 /blog/history/05/june 的URL将被捕获:


Controller中的路由捕获



<?php
class BlogController extends AppController
{
function history ($year, $month=null)
{
// .. Display appropriate content
}
}
?>




在Blog的路由中'history'将匹配:action(也就是'history'做为controller的action)。匹配*的URL中的元素将被作为参数传递给当前活动controller(如上面代码的BlogController)的方法,上面的代码中就是参数$year 和 $month。请求URL /blog/history/05 只传递一个参数05给history()方法。


下面的示例是CakePHP中默认的路由,它用于PagesController::display('home')。Home是一个可以在/app/views/pages/home.thtml中重写的view(视图)。


默认路由设置



<?php
$Route->connect ('/', array('controller'=>'Pages', 'action'=>'display', 'home'));
?>




第四节



高级路由设置: Admin 路由和 Webservices


你可以利用/app/config/core.php文件中的一些设置,组织你的应用,优化URL,使用户获得更好的体验。


第一个是admin路由。假如在你的应用中有ProductsController和NewsController两个controller,也许你希望有管理权限的用户能够访问这些controller中某个特别的action。为了保持URL的美观和易读,人们希望URL是 /admin/products/add 和 /admin/news/post 这样,而不是/products/adminAdd and /news/adminPost。


如果你想这样,首先,取消/app/config/core.php文件中CAKE_ADMIN行的注释。CAKE_ADMIN的默认值是'admin',你也可以把它改成你想要的任何值。


记住这个值,因为你需要根据这个值,对管理权限的用户能够访问的action做一些预处理。所以,在这种情况中admin action可能命名为admin_actionName()。下面的例子,是一些你希望看到的URL,CAKE_ADMIN相应的值,和 controller中相应action的设置。



/admin/products/add CAKE_ADMIN = 'admin'
name of action in ProductsController = 'admin_add()'

/superuser/news/post CAKE_ADMIN = 'superuser'
name of action in NewsController = 'superuser_post()'

/admin/posts/delete CAKE_ADMIN = 'admin'
name of action in PostsController = 'admin_delete()'


使用admin路由能够更有效的组织你的逻辑。
请记住一点,admin路由不等同于任何类型的认证和安全机制。你需要自己去实现他们。
同样,你也可以这样使用Cake的webservices路由。你想将一个controller的action作为webservice暴露出来么?首先,将/app/config/core.php文件中的WEBSERVICES的值设置成'on'。在设置了路由前缀后,这些设置可以做一些如同 admin的路由,路由前缀如下:


  1. rss




  2. xml




  3. rest




  4. soap




  5. xmlrpc




这些前缀可以提供一个可选的view(视图),当访问 /rss/controllerName/actionName 或 /soap/controllerName/actionName 时会自动应用这些view。这样可以创建一个action并且拥有两个表现的view:如一个为普通的HTML浏览者,另外一个提供给 webservices用户。通过这些你可以轻松的将应用中的功能以webservices的方式暴露出来。例如,我的应用中有一些逻辑告诉用户我办公室中谁在打电话。对于这些数据我已经有了一个HTML的view,但是我还想有一个XML的,使这些数据能够运用在桌面的windget或者被其他应用使用。首先我们需要应用Cake的webservice路由:


/app/config/core.php (部分)



/**
* The define below is used to turn cake built webservices
* on or off. Default setting is off.
*/
define('WEBSERVICES', 'on');



下面我们和以前一样在controller中构建我们的应用逻辑:


messages_controller.php


<?php
class PhonesController extends AppController
{
function doWhosOnline()
{
// 这个action完成查看我的办公室里谁在打电话……

// 如果我想使这个action以Cake的xml webservices路由方式获得,
// 我需要在定义一个view--/app/views/posts/xml/do_whos_online.thtml
// 注意:默认的view布局模版使用/app/views/layouts/xml/default.thtml.

// 如果请求 /phones/doWhosOnline, 结果将是一个HTML版本。
// 如果请求 /xml/phones/doWhosOnline, 将获得一个XML版本。
}
}
?>


第五节



(可选) 自定义变形配置(Inflections Configuration)


Cake的命名约定非常优美,你可以命名你的model,controller,一切都可以设计出来。但有一些时候(特别是对于一些非英语国家的朋友) Cake的词尾变化(class的复数,单数,大小写分隔和下划线分隔单词)可能并不是像你希望的那样工作。如果Cake不能够处理 Foci 或者 Fish(处理这些单词的单数复数形式的变化),编辑自定义变形配置文件(custom inflections configuration)能够满足你的需要。


/app/config/inflections.php列出了一些Cake的变量,你可以使用他们去判别Cake中class名称的单数,复数形式,根据定义的规则,并不能变换所有的单、复数形式,例如一些不规则的单复数单词Foci或者Fish(Fish的单数、复数形式相同)。


根据配置文件中的说明,或者取消文件中的一些注释来配置规则。在你做这些之前,你需要懂得一些正则表达式。





2007-01-07

CakePHP Manual翻译3:安装CakePHP


安装CakePHP


第一节


介绍

你现在已经知道CakePHP的目的和结构了,如果你仅仅是想开始使用CakePHP,不关心这些文档,而跳过这部分,那么后面你将会遇到一些麻烦。


这一章将讲述服务器上必须安装的东西,配置服务器的不同方式,下载安装CakePHP,展现CakePHP的默认页面,和一些不在计划内的问题的解决方式。


第二节


安装需求

为了使用CakePHP,你必须先有一个包含能够运行CakePHP的库和程序的服务器。


服务器需求

下面是一些运行CakePHP的服务器需求:


Here are the requirements for setting up a server to run CakePHP:




  1. 一个HTTP服务器(例如:Apache) 并且使这些模块有效-- sessions, mod_rewrite (这个不是必须的但是最好有这个功能)。




  2. PHP 4.3.2 或者更新的版本。CakePHP可以工作在PHP 4和5或者更新的版本。




  3. 一个数据库引擎(现在CakePHP支持MySQL, PostgreSQL 和一个wrapper for ADODB).




第三节


安装CakePHP

获得最新的稳定版本

通过这些方式你可以安全的获取一份CakePHP的拷贝:从CakeForge获取稳定版本,抓取每日构建,或者从SVN获取最新的代码。


去http://cakeforge.org/projects/cakephp/下载CakePHP项目的稳定版本。


去http://cakephp.org/downloads/index/nightly获得一个每日构建的版本。这些版本是稳定的,但是在发布成稳定版本之前常常会有一些bug需要修订。


选择你最喜欢的SVN客户端去https://svn.cakephp.org/repo/trunk/cake/获得一份你想要版本的CakePHP代码。


解压缩

现在你已经下载了最新的版本,把下载的压缩包放在你web服务器上的根目录下。现在你需要将CakePHP解压缩。解压有两种方式,一种是使用开发设置,这种方式可以方便的在一个域上放置多个CakePHP应用;另外一种是产品设置,这种方式可以在一个域上运行一个单独的CakePHP应用。


第四节


设置CakePHP

设置CakePHP的第一种方式使用开发环境的设置,但是这种方式不是很安全。另外一种更加安全的方式是使用产品环境设置。


注:当你的web服务器运行的时候/app/tmp 目录必须可写。


开发方式的设置

在开发方式时,我们可以把整个Cake的安装目录放到web服务器的根目录下(DocumentRoot)像下面这样:




/wwwroot
/cake
/app
/cake
/vendors
.htaccess
index.php


在这种设置下wwwroot文件夹是你web server的根目录,你的url可能像下面这样(如果你启用web server的mod_rewrite功能)


www.example.com/cake/controllerName/actionName/param1/param2


产品方式的设置


为了使用产品方式的设置,你需要有一些修改web server的根目录(DocumentRoot )的权限。这样做可以使整个web server的域运行一个CakePHP应用。


产品方式设置的文件布局如下:




../path_to_cake_install
/app
/config
/controllers
/models
/plugins
/tmp
/vendors
/views
/webroot <-- 将web server的根目录(DocumentRoot )指向这里
.htaccess
index.php
/cake
/vendors
.htaccess
index.php



建议产品方式的web服务器配置httpd.conf


DocumentRoot /path_to_cake/app/webroot


在这种设置下wwwroot文件夹是你web server的根目录,你的url可能像下面这样(如果你启用web server的mod_rewrite功能)


http://www.example.com/controllerName/actionName/param1/param2


高级设置: 可选的安装选项


下面有一些案例,展示了将Cake的目录放在不同的地方。这些情况是当你的应用在一台共享的主机(译者注:如在租用的空间上放置你的web应用),或者当你想多个应用共享一个Cake库。


Cake应用有三个主要的部分:






  1. CakePHP的核心库 - 在 /cake





  2. 应用的代码 (如:controllers, models, layouts和views) - 在 /app





  3. 应用的根目录访问文件 (如:images, javascript和css) - 在 /app/webroot





这些文件夹可以放在文件系统的任何位置,除了webroot,他是需要被web server访问的。你可以将webroot放到app的外面,当你移动webroot的时候同时也要告诉Cake你把他放到哪里了。


如果你这样做了,你需要修改/app/webroot/index.php 。有三个常量需要更改:








  1. ROOT 必须设置成包含 app 文件夹的目录.





  2. APP_DIR 别需设置成 app 目录(译者注:通常就是'app').





  3. CAKE_CORE_INCLUDE_PATH 应该被设置成 Cake 库的目录(译者注:是指包含Cake的目录).





/app/webroot/index.php (去掉了部分注释)


if (!defined('ROOT'))
{
define('ROOT', dirname(dirname(dirname(__FILE__))));
}
if (!defined('APP_DIR'))
{
define ('APP_DIR', basename(dirname(dirname(__FILE__))));
}
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
define('CAKE_CORE_INCLUDE_PATH', ROOT);
}


用一个例子说明可能会更容易理解。假设我想设置Cake工作在下面的方式:






  1. 我像让Cake被其他应用共享, 并且Cake在 /usr/lib/cake.





  2. 我Cake的webroot目录是 /var/www/mysite/.





  3. 我的应用的文件存储在 /home/me/mysite.





那么文件的布局可能会像这样:

/home
/me
/mysite <-- 相当于 /cake_install/app
/config
/controllers
/models
/plugins
/tmp
/vendors
/views
index.php
/var
/www
/mysite <-- 相当于 /cake_install/app/webroot
/css
/files
/img
/js
.htaccess
css.php
favicon.ico
index.php
/usr
/lib
/cake <-- 相当于 /cake_install/cake
/cake
/config
/docs
/libs
/scripts
app_controller.php
app_model.php
basics.php
bootstrap.php
dispatcher.php
/vendors

在这种设置下,我需要修改我webroot下的index.php文件(在该示例中文件应该是/var/www/mysite/index.php)如下:
这里推荐使用'DS'常量,而不是用斜线('/')分隔文件路径。这种方式避免了你可能误用错误的分隔符而导致的"文件丢失错误",并且这样会使你的代码更加轻便。


if (!defined('ROOT'))
{
define('ROOT', DS.'home'.DS.'me');
}
if (!defined('APP_DIR'))
{
define ('APP_DIR', 'mysite');
}
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib'.DS.'cake');
}


第五节



配置 Apache 的 mod_rewrite


当CakePHP没有mod_rewrite支持时候,我们发现许多用户由于不能完美运行他们的系统而苦恼。下面是一些可能需要尝试并且使之正确运行的事情:






  1. 确认.htaccess 允许被重载:在httpd.conf,你的服务器上你必须确认为每一个Directory(虚拟目录)定义一个section。 确认当前Directory的AllowOverride 选项被设置成 All





  2. 确定你修改的是系统的httpd.conf,而不是用户或者特定站点的httpd.conf。





  3. 由于一些原因你可能获得了一份没有.htaccess文件的CakePHP的拷贝。这种情况有可能是因为一些操作系统将以'.'开头的文件看作隐藏文件,从而没有拷贝他们。确认你的CakePHP拷贝是从官方网站或者SVN库中下载的。





  4. 确认你正确的加载了mod_rewrite模块。你需要在你的httpd.conf中查看一下LoadModule rewrite_module libexec/httpd/mod_rewrite.so 和 AddModule mod_rewrite.c





  5. 如果你安装CakePHP在一个用户目录 (如:http://example.com/~myusername/), 你需要在Cake安装的根目录中修改.htaccess文件,添加一行 "RewriteBase /~myusername/".





  6. 如果因为某些原因你的URL后缀太长, 如令人讨厌的session ID (http://example.com/posts/?CAKEPHP=4kgj577sgabvnmhjgkdiuy1956if6ska),你可以在Cake安装的根目录中的.htaccess文件添加"php_flag session.trans_id off" 。





第六节



确认他在工作


好的,让我们看看Cake是如何工作在你的设置下的。在浏览器中输入http://www.example.com 或者 http://www.example.com/cake,你会看到CakePHP的默认页面,页面上会显示一些数据库链接的信息。那么恭喜你,你已经准备好创建一个基于Cake的应用了。


2007-01-06

CakePHP Manual翻译2:CakePHP介绍


CakePHP介绍


第一节


CakePHP是什么?

CakePHP是一个免费、开源的PHP快速开发框架。它是一个用于创建web应用的给予类库的运行时框架,最开始的灵感来自于Ruby on Rails框架。我们的主要目标是使你的开发更加快速有条理,而不失灵活性。


第二节


为什么选择CakePHP?

CakePHP的一些特性使他成为一个更加快速而少争议的应用开发框架。下面是他的一些特性:




  1. 活跃,友好的社区支持




  2. 灵活的监听




  3. 兼容 PHP4 和 PHP5




  4. 整合数据库CRUD操作和简单的查询




  5. 应用脚手架(译者注:这里是指不需要写代码即可对一个表进行简单的CRUD,来源与ROR)




  6. 基于MVC构架




  7. 支持漂亮并且可以定制的url的请求分发




  8. 内置数据验证




  9. 快速灵活的框架 (PHP 语法, 结合helpers类)




  10. 提供展示AJAX, Javascript, HTML Forms……的帮助类




  11. 安全, Session, 和处理请求的组件




  12. 灵活的访问控制




  13. Data Sanitization




  14. Flexible View Caching




  15. 可以工作在你站点的任何目录下,并且只需要很少的apache配置




第三节


CakePHP的历史

2005年,Michal Tatarynowicz写了一个很小的PHP快速开发框架。他发现这是一个非常不错的框架,于是他在MIT license下发布了这个框架,叫做Cake,并且向社区的开发者开放,这就是现在的CakePHP。


2007-01-05

CakePHP Manual翻译:前言

随着ROR的火热,PHP世界中也出现了不少类似的框架,CakePHP就是其中的佼佼者。在学习的过程中把Manual(手册)翻译出来,其中有不少不当或者是错误,希望高手指点。

---------------------------------------------------------------------------------

前言

第一节

Audience

这个手册是为那些想更愉快和快速的建立web应用的人们写的。CakePHP的目标是帮助所有水平的PHP用户快速而简单的建立健壮,可维护的应用程序。

读这个手册需要一些基础的PHP和HTML知识。如果你熟悉MVC编程模式会更有帮助,但是我们会帮助那些刚刚了解MVC的人们学习这个手册。配置web服务器,将不在本手册的讨论范围内。此外一些基础知识也不在本手册的讨论范围。

第二节

CakePHP是免费的

CakePHP是免费的。你可以用任何方式使用他,而并不需要为他付费。CakePHP是在MIT License下开发的。CakePHP是一个开放源代码的项目,也就是说你可以看到他所有的源码。获得最新代码的最好地方是CakePHP的网站 (http://www.cakephp.org)。在那里你可以浏览最新和最伟大的代码。

第三节

社区

CakePHP是有社区的人努力开发的。他们来自世界各国,聚集在一起创建CakePHP框架,提供了最广泛的功能。访问http://www.cakephp.org可以得到更多的Cake开发者和用户社区的消息。

我们的IRC频道总是有很多技术精通、友好的志愿者。如果你在代码上有什么棘手的问题、需要了解或讨论代码规范,请发给我们。我们希望听到你的声音。请访问irc.freenode.com。

用Windows live writer测试

用Windows live writer测试,post一篇到blogger。