极湖

无不用其“极”

Subscribe to RSS feed

Posts tagged with "CakePHP"

CakePHP 和 Zend Framework 逐项比较

, , ,

提起 PHP的框架,目前最热门的莫过于 CakePHPZend Framework

如果您要在这两个框架间作出选择,推荐读这篇《Notes on Choosing a PHP Framework: A Comparison of CakePHP and the Zend Framework》,文章用一个表格比较了两个框架的各方面,尽管带有一些主观性,总体来说还算客观,因此是个不错的参考。

获取 PostgreSQL 数据库之 sequence 名称列表的 SQL

, , ,

较低版本(1.0 ?) CakePHP 的文件
cake/libs/model/dbo/dbo_postgres.php
中,有一句 SQL:

SELECT sequence_name FROM information_schema.sequences

在 PostgreSQL 8 中,以上 SQL 运行出错。

根据原意修改如下:

SELECT c.relname as sequence_name FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n WHERE c.relnamespace = n.oid AND c.relkind='S' and n.nspname = 'public'

其中的 'public' 是 schema 名,需要根据实际情况修改。

顺便把 dbo_postgres.php 中包含以上 SQL 的函数修改如下:
    function sequenceExists($seq) {
        $cache = parent::__cacheDescription('sequences');
        if($cache != null) {
            return in_array($seq, $cache);
        }
        $sequences = array();
        // ★修改这句
        //$res = $this->rawQuery("SELECT sequence_name FROM information_schema.sequences");
        $schema = $this->config['schema'];
        $res = $this->rawQuery("SELECT c.relname as sequence_name FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n WHERE c.relnamespace = n.oid AND c.relkind='S' AND n.nspname = '{$schema}'");
        while($row = $this->fetchRow($res)) {
            $sequences[] = $row[0]['sequence_name'];
        }
        
        parent::__cacheDescription('sequences', $sequences);
        return in_array($seq, $sequences);
    }

需要说明的是,在新版本的 CakePHP 中,已见不到以上函数。

CakePHP 动态设置 tablePrefix 的一个例子

, ,

遇到一个问题

用 CakePHP 开发的网站,有几个子网站,每个子网站有一个 webroot,共用数据库,其中有部分数据表格不能共用,因此需要根据实际情况设置表格的前缀。

这个在 CakePHP 下其实很简单,只是没有先例,所以摸索了半天,最后得出的方法如下:

首先,在各个 webroot 下的 index.php 追加一个常量(在载入 bootstrap.php 之前)

例:
app/webroot-a/index.php
define('SITE_ID', 1);

app/webroot-b/index.php
define('SITE_ID', 2);

app/webroot-c/index.php
define('SITE_ID', 3);


然后,在需要不同前缀的表格的 Model 中加入 settableprefix() 函数

例:
app/models/users.php
<?php
class Users extends AppModel {
    var $name = 'Users';
    var $useTable = 'users';
    var $primaryKey = 'user_id';

    function settableprefix() {
        if(SITE_ID == 1) {
            $this->tablePrefix = 'a_';
        } elseif(SITE_ID == 2)  {
            $this->tablePrefix = 'b_';
        } elseif(SITE_ID == 3)  {
            $this->tablePrefix = 'c_';
        }
    }
}
?>

这样就可以了。

其实,index.php 中的常量也可以不用追加,直接利用现成的常量就行,比如 WEBROOT_DIR。追加常量是为了程序照顾运行的效率。

cakePHP 动态选择数据库连接的方法

, ,

很简单,只要把 /app/config/database.php 文件的内容替换成以下形式:
<?php
class DATABASE_CONFIG {
    #localhost
    var $local = array('driver' => 'mysql',
        'connect' => 'mysql_connect',
        'host' => 'localhost',
        'login' => 'root',
        'password' => ",
        'database' => 'local',
        'prefix' => '');

    #dev server
    var $dev = array('driver' => 'mysql',
        'connect' => 'mysql_connect',
        'host' => 'mysql.dev.com',
        'login' => 'dev',
        'password' => 'password',
        'database' => 'dev',
        'prefix' => '');

    #live server
    var $live = array('driver' => 'mysql',
        'connect' => 'mysql_connect',
        'host' => 'mysql.live.com',
        'login' => 'live',
        'password' => 'password',
        'database' => 'live',
        'prefix' => ");

    #switch between configs
    var $default = array();
    var $test = array();
    function __construct() {

        #wildcard the subdomains
        $host_r = explode('.', $_SERVER['SERVER_NAME']);
        if(count($host_r)>2) while(count($host_r)>2)array_shift($host_r);
        $mainhost = implode('.', $host_r);

        #switch between servers
        switch(strtolower($mainhost)) {
            case 'localhost':
                $this->default = $this->local;
                break;
            case 'dev.com':
                $this->default = $this->dev;
                break;
            case 'live.com':
                $this->default = $this->live;
                break;
            default:
                $this->default = $this->local;
        }
    }

    #php 4 compatibility
    function DATABASE_CONFIG() {
        $this->__construct();
    }
}
?>

★注:以上方法来自 这儿

不选 Zend, 也不选 Symfony,而选 CakePHP 的10个理由

, , , ...

在一个日本人的博客上看到《Zendでも、Symfonyでもなく、CakePHPを選んだ10の理由》,题目翻译过来就是《不选 Zend, 也不选 Symfony,而选 CakePHP 的10个理由》。文中所列举的理由,比较有参考价值,因此整理翻译如下:

理由1 PHP4、5两头对应

这个对开发者来说是值得庆幸的。

因为有时候客户现有的服务器环境,无法选择PHP的版本。这时候,如果原有的环境是 PHP4,Zend 和 Symfony 就鞭长莫及了


理由2 不依赖于 PEAR

这个和理由1一样,可以确信自己所写的代码在什么地方都能运行。

还有就是,若有在框架之外还有依赖的东西,从开发环境到实际环境的移行,有时候会有意外的麻烦。


理由3 设置简单

Symfony 由于依存于 PEAR,敲几个命令就能把环境搭起。CakePHP 则只要解压缩就OK了,

在设置简便这一点上,CakePHP 无疑高出一筹。

Zend 与其说是开发框架,还不如说是函数库群,光是设定就非常麻烦。


理由4 模型(Model)很智能

Symfony 的 YAML 不能不写,

Zend_DB 的预先设置就很麻烦,SQL 也不能不写,这可不行。


理由5 不会用 mod_rewrite 也不要紧

无法使用 mod_rewrite 的环境下,用近似的 URL 访问,发现也能正确动作。这是一个非常让人称谢的功能。


理由6 控制器(Controller)的参数非常出色

CakePHP 下处理 get 参数,只需给控制器的 Action 方法准备好参数即可,它能自动传递,这是个出色的功能。

若结合 mod_rewrite,可通过

/user/index/userid001

这样的静态 URL 取得参数。


理由7 错误处理太亲切了

缺少 Controller,或是缺少 Model,像这样根本性的错误,错误画面上会给出所需的最低限代码。初学者得感谢有这样的功能。


理由8 数据净化(Sanitize)方便

每当进行数据净化(Sanitize)的时候,$this->这东西做不了。
h就行,相当轻松。
译者注:以上两句偶也不太明白)

理由9 日期输入很轻松

Helper(v1.1是HTML, v1.2是Form)中有专门处理日期输入的方法,稍微改动一下就够用,在这种地方不用太费力气,是很具魅力的。


理由10 很容易集成第三方的制品

只要把东西放在 vendors 下,然后在 bootstrap.php 中写一行 vendor(),就能在任何地方使用了。
大体上,若需在框架中实现比较麻烦的功能,选用现成代码那是理所当然。从这些方面考虑,CakePHP 实在是太棒了!


译者注:Zend、Symfony 和 CakePHP,这几个框架我也有过接触,实在是难以取舍。最近在修改一个采用 CakePHP 开发的项目,发现 CakePHP 确实有不少优点,这篇文章基本上说出了 CakePHP 的优点,所以和大家分享一下。
February 2012
S M T W T F S
January 2012March 2012
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29