开源视窗在本期推荐项目中推荐SOLAR PHP

============================
Solar简介
============================
Solar(Simple Object Library and Application Repository的缩写)是基于PHP 5的web应用框架。她继承了Savant模板系统、DB_Table对象-关系管理包以及PEAR组织结构的优良特性及先进思想。
Solar由Paul M. Jones创办,他也是Solar系统的“独裁者”。其他开发人员主要为标准项目分发包开发组件,所有这些代码和分发包都遵守New BSD协议。
============================
Solar特点
============================
1. 优雅和一致的:代码库本身是很容易理解的,坚持文档友好的命名规则,并有很强的概念完整性。
2. 完整的名字空间: Solar类库有它们自己的PHP5.2名字空间 ,并且Solar中的vendor同样有自己的名字空间。这样一来,混合其他组件和框架也不是什么难事了,因为他们不会产生名字冲突。
3. 配置是可继承的:在配置文件配置好某个类,该类的所有子类都会默认继承该配置。
4. 本地化是可继承的:设置某个类的本地化字符串,该类的所有子类都会继承那些本地化字符串。
5. 针对SQL注入,跨站点脚本的攻击和其他常见的攻击有非常容易使用的防卸体系。
6. 验证和查审有户输入,有健壮和可扩展的数据过滤体系。
7. 用于LDAP、TypeKey、数据库htpasswd及其他源的验证适配器。
8. 用于memcache、APC、XCache及其他系统的缓存适配器。
9. 用于超链接, 图像, 样式, 本地化文本, 表单生成等的视图辅助类。
10. 健全和强大的模型系统 ,让你可以使用记录对象自动生成表单。
11. 充分集成企业的开发模式,例如:
* 数据映射
* 依赖注入和服务定位器
* 延迟加载
* MVC 模式
o Front 控制器
o Page 控制器
o Table Module和Active Record
o 模板视图
o 两步视图
* 查询对象
* 注册表
* 服务器会话状态
============================
Solar 理解
============================
Paul <http://paul-m-jones.com> 把 Solar 设计得足够好了,整个 Solar 是一个系统,你可以把它理解为操作系统,它由 Solar 内核和辅助工具组成,我们在 Solar 上开发应用就相当于在操作系统上开发软件一样,这个比喻应该好理解而且不过分。一般来说,我们有两种途径访问 Solar:一种是从浏览器访问,这个时候入口文件是 /docroot/index.php 或 /index.php;一种是从 CLI(命令行)访问,这个时候入口文件是 /script/solar。这两个文件都通过 Solar 的架构类 /source/solar/Solar.php 来使用 Solar 内核。

在 Solar 上开发应用是以 vendor 为单位的,你开发的应用的所有代码都是高度集中的,事实上一个 vendor 是一个文件夹。这就是说你在部署代码时,只需要部署 vendor 就行了,非常简单高效。
============================
Solar 入门
============================
Solar入门相比国内的ThinkPHP, FleaPHP及国外的CodeIgniter框架来说要稍微难一些,但背后隐藏的是优雅的代码和优秀的设计。恩,刚开始接触Solar可能会让你有点晕的感觉(^^不要瞎想),即便如此,也挡不住我们继续学习Solar的决心。

Solar对操作系统有一定要求,从Solar的角度来看,操作系统分为以下3类:
1. Linux/Unix
2. Win NT 6以后(也即Win Vista之后的系统,支持Symlink)
3. Win NT 6以前(也即Win Xp, Win 2000, Win 2003等,不支持Symlink)
============================
打断一下,这里插入一个话题:为什么要区分操作系统?

这个问题确实让我们没办法回避,事实上这可能也是Solar目前尚不流行的原因,许多人看到这里肯定会问:“ PHP 不是跨平台的么,为何一个PHP框架不是跨平台的呢?”恩,这个问题我现在可以回答你。不错,PHP是跨平台的,但是PHP在两个平台下肯定有不同的实现。Solar也一样,Solar 出生在 Linux 家庭。其实Solar可以直接在WIN下运行(只要有WAMP环境),但是Solar CLI(命令行工具)要用到文件系统的 Symlink 特性,所以其实是 Solar CLI不能很好地在 WIN 下工作。命令行工具是帮助我们快速开发的得力助手,我们当然不允许它不能使用。

============================
看到这里觉得很复杂?呵呵,不用担心,现在已经有很成熟的方案处理所有这些问题,读读我们的手册,你一定会大有收获。中文手册地址:http://solarphp.cn/manual-new,英文手册地址:http://www.solarphp.com/manual/

Solar工厂模式/工厂方法

SOLAR PHP 群中有人要求我写一篇介绍如何开发Solar插件的文章,恩,我也觉得很有必要,不过要介绍Solar插件,我认为必须先介绍Solar工厂模式和Solar依赖注入才能更好的了解Solar插件。那么这篇文章就来介绍下Solar的工厂模式。

首先来看下Solar工厂方法,对于一个框架来说工厂函数至关重要,所以该方法在Solar架构类中,点击这里查看,由此可见其重要性。

public static function factory($class, $config = null)
{
    Solar_Class::autoload($class);
    $obj = new $class($config);
    // is it an object factory?
    if ($obj instanceof Solar_Factory) {
        // return an instance from the object factory
        return $obj->factory();
    }
    // return the object itself
    return $obj;
}

大致意思如下:

首先通过Solar_Class::autoload()方法加载文件,该方法会在被PHP或SOLAR包含过的所有路径中查找类文件。
然后实例化类,如果该对象是Solar_Factory的实例,则直接调用对象的factory方法,并返回结果。如果不是则直接返回对象。

代码很简单,但设计得很巧妙。妙就妙在Solar_Factory类,它是一个抽象类,不能直接实例化它。适配器模式主要就是由它实现的。请看factory方法:

    public function factory()
    {
        // bring in the config and get the adapter class.
        $config = $this->_config;
        $class = $config['adapter'];
        unset($config['adapter']);

        // return the factoried adapter object
        return new $class($config);
    }

在实例化Solar_Factory类型的对象时,接收的数组参数中一般都有’adapter’项,如:

array(
    'adapter' => 'Solar_Foo',
    // ... more
    // ,
)

该选项告诉工厂函数要真正实例化的类,数组参数中的其他项将会被传递给真正需要实例化的类,在上面代码中,Solar_Foo是我们真正要实例化的类。

这个有什么用呢?呵呵,当然有用了,举个例子吧:

现在你要写个支付模块,我们都知道支付手段不只一种(常见的有,支付宝、财付通、百付宝、网银在线等)。我们希望增加或删除任何一种支付手段无需修改支付模块代码。如果是这样你会怎么设计呢?

我们要做的就是遵从Solar_Factory的设计,如下:

| - /source/solar/Solar
     | - Pay.php (class Solar_Pay)
     | - Pay
          | - Adapter.php
          | - Adapter
               | - Alipay.php (class Solar_Pay_Adapter_Alipay)
               | - Alipay
               | - Tenpay.php (class Solar_Pay_Adapter_Tenpay)
               | - Tenpay
               | - ...

简单写下代码吧,:)

# /source/solar/Solar/Pay.php
class Solar_Pay extends Solar_Factory
{
    $_Solar_Pay = array(
        'adapter' => 'Solar_Pay_Adapter_Alipay',
    );
    // ...
}

# /source/solar/Solar/Pay/Adapter.php
class Solar_Pay_Adapter extends Solar_Base
{
    // ...
}

# /source/solar/Solar/Pay/Adapter/Alipay.php
class Solar_Pay_Adapter_Alipay extends Solar_Pay_Adapter
{
    // ...
}

# call
$params = array('Adapter' => 'Solar_Pay_Adapter_Alipay',
                'partner' => '...',
                'security_code' => '...',
                'seller_email' => 'your@email.com',
                'show_url' => '...',
                'notify_url' => '...',
                'return_url' => '...',
);
// call alipay
$alipay = Solar::factory('Solar_Pay', $params);

Solar连接Oracle存在的问题!

前段时间朋友@东疯 使用Solar连接Oracle,死活都连不上,搞了好久天,所以我也找时间研究了下。看这里:http://wiki.oracle.com/page/PHP+Oracle+FAQ。使用PDO连接Oracle:

try {
$dbh = new PDO('oci:dbname=myhost/XE', 'myusername', 'mypassword');
}
catch (PDOException $e) {
trigger_error("Could not connect to database: ". $e->getMessage(), E_USER_ERROR);
}

有三种合法字符串:
1. 简易连接

$c = oci_connect('myusername', 'mypassword', 'mymachine.mydomain/MYDB');
$d = new PDO('oci:dbname=myhost/XE', 'myusername', 'mypassword');
//或
$c = oci_connect('myusername', 'mypassword', '127.0.0.1/XE');
$d = new PDO('oci:dbname=127.0.0.1/XE', 'myusername', 'mypassword');

Continue reading

Solar中文手册已成功嵌入官方站框架!

有人反映solar中文手册的界面太丑了,不过我认为手册最主要的是访问速度快,越快越好;只要结构清晰,越简洁越好。

为了满足部分人的需求,所以今早把手册嵌入到网站框架中了。原来的仍能访问。

新版地址入口: http://solarphp.cn/manual-new/
旧版地址入口: http://solarphp.cn/manual/

那么我是怎么做的呢?为了赶快放上去,我用editplus把这将近100个文件一次性打开,然后统一替换其中的某些文本符。这是傻瓜式做法,为了方便以后更快地把手册嵌入到官方站框架中,特意写了这个脚本:
Continue reading

PHP框架 Solar 1.1.2发布!

伴随着冬天的到来,Solar迎来了她的1.1.2版本,并更新手册2章(Command-line tools及Mail),请移步英文官方站查看:
http://solarphp.com/。2010-11-09,Paul在Mail-list上发贴,宣布Solar 1.1.2已经发布。代码比之前更精练,所以仍有必要尽快升级。而且Paul做了很多针对Windows 平台的工作,可惜仍有一些兼容问题,仍不支持Windows Xp,所以修改源码仍有必要。Solar Demo站(http://demo.solarphp.cn)已更新至1.1.2,且运行在windows 2003平台。
这是一个Bug修复版,更新如下:
Continue reading