配置
第一节
数据库配置
所有的数据库配置都在 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提供如下数据库驱动:
mysql
postgres
sqlite
pear-drivername (so you might enter pear-mysql, for example)
adodb-drivername
在$default中的'connect'链接允许你指定要做持久化的数据库链接。database.php.default中的注释详细说明了数据库配置中的连接类型。
数据库的表必须遵循如下约定:
表名习惯用英文单词的复数形式组成,如:"users", "authors" 或 "articles"。对应的models用单数形式,如:"user", "author" 或 "article"。
表必须要有一个主键,名称为id。
如果表需要做关联,则外键必须看起来像这样: article_id,关联表名的单数形式后面接下划线(_)后面接id。
如果表中包含'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文件,会依赖你在这里的设置。设置的值如下:
high: sessions将在处于不活动状态10分钟后过期,并且为每一个请求重新生成一个新的session id。
medium: sessions将在处于不活动状态20分钟后过期。
low: sessions将在处于不活动状态30分钟后过期。
CAKE_SESSION_SAVE:设定保存session数据的保存方式. 设置的值如下:
cake: Session数据保存在应用中的 tmp/ inside 下。
php: 按照 php.ini 中设置的方式保存Session数据。
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')
);
在上面代码中:
URL 是一个你希望在Cake中映射的URL的正则表达式,
controllername 是你希望调用的controller的名称,
actionname 是你希望调用的action的名称,
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的路由,路由前缀如下:
rss
xml
rest
soap
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的单数、复数形式相同)。
根据配置文件中的说明,或者取消文件中的一些注释来配置规则。在你做这些之前,你需要懂得一些正则表达式。
没有评论:
发表评论