读《Yii 1.1应用程序开发实例》 笔记 1

本文介绍了Yii框架中的实用技巧,包括如何通过继承CComponent类简化getter和setter方法,如何使用Yii::import进行类导入以提高性能,以及如何利用Yii的核心组件进行请求处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

书地址:http://www.yiibook.com/book/yii1.1_application_development_cookbook

继承Ccomponent类可以省去 get 和 set的前缀

// 继承Ccomponent类是必需的
class MyClass extends CComponent
{
    private $property;
    
    public function getProperty()
    {
        return $this->property;
    }
 
    public function setProperty($value)
    {
        $this->property = $value;
    }
}
 
$object = new MyClass();
$object->property = 'value'; // 和 $object->setProperty('value');  一样
echo $object->property; // 和 $object->getProperty(); 一样</span>


使用Yii::import导入类是相当的明智:

  • 默认的,导入不是立即包含一个类。
  • 没被使用的类不会被包含。
  • 它不会再三的加载一个类,因此你可以放心的导入同一个类很多次。
<span style="white-space:pre">	</span>// 导入一个类
        Yii::import('application.apis.lyrics.LyricsFinder');
        
        $finder = new LyricsFinder();

我们来看看application.apis.lyrics.LyricsFinder:

路径别名

application是一个标准别名,指向你应用程序的protected文件夹,它被翻译成文件系统路径。下表显示了更多的标准的别名:

Alias Path
applicationpath_to_webroot/protected
systempath_to_webroot/framework
ziipath_to_webroot/framework/zii
webrootpath_to_webroot
extpath_to_webroot/protected/extensions

apis.lyrics 被转义成apis/lyrics 并且被附加到从小应用程序application中获取的路径;LyricsFinder是个我们想要导入的类名。

如果LyricsFinder需要一些额外的类处于目录中 ,我们可以使用Yii::import(‘application.apis.lyrics.*’)来导入整个目录。 注意* 并不包含子文件夹,因此如果你需要lyrics/includes, 你应该添加另外一条导入语句Yii::import(‘application.apis.lyrics.includes.*).

为了性能,当你使用一个单独的类时,使用明确的路径而不是*比较好。

使用Yii核心集合组件

Yii有一组集合组件类,主要为内部用途使用。虽然未在权威指南里描述,却对应用开发很有帮助:

  • Lists: CList, CTypedList
  • Maps: CMap, CAttributeCollection
  • Queue: CQueue
  • Stack: CStack

你可以使用Yii::app()->getRequest()访问你应用中的请求组件,我们来回顾下最有用的一些方法和它们的用途。 这些方法返回当前URL的不同部分。在下面的表格中,我们用粗体字样标记了返回的部分。

getUrlhttp://yiibook.local/test/index?var=val
getHostInfohttp://yiibook.local/test/index?var=val
getPathInfohttp://yiibook.local/test/index?var=val
getRequestUrihttp://yiibook.local/test/index?var=val
getQueryStringhttp://yiibook.local/test/index?var=val

允许我们确保请求类型的方法是getIsPostRequest, getIsAjaxRequest, and getRequestType。

  • 例如,我们可以使用getIsAjaxRequest来根据请求类型响应不同的内容:


class TestController extends CController
{
    public function actionIndex()
    {
        if(Yii::app()->request->isAjaxRequest)s
            $this->renderPartial('test');
        else
            $this->render('test');
    }
}

在上面的代码中,如果请求是通过AJAX,我们就渲染了一个没有布局的视图。

  • 尽管PHP为POST和GET都提供了超全局变量,但Yii的对应方法则允许我们省略一些额外的检查:
class TestController extends CController
{
    public function actionIndex()
    {
        $request = Yii::app()->request;
        
        $param = $request->getParam('id', 1);
        // 等价于
        $param = isset($_REQUEST['id']) ? $_REQUEST['id'] : 1;
        
        $param = $request->getQuery('id');
        // 等价于
        $param = isset($_GET['id']) ? $_GET['id'] : null;
        
        $param = $request->getPost('id', 1);
        // 等价于
        $param = isset($_POST['id']) ? $_POST['id'] : 1;
    }
}

getCookies方法。它返回一个CCookieCollection类实例,这个实例允许我们处理cookies。因为CCookieCollection继承自CMap,所以我们可以使用一些原始的PHP方法:

class TestController extends CController
{
    public function actionIndex()
    {
        $request = Yii::app()->request;
        // 获取cookie
        $cookie = $request->cookies['test'];
        if($cookie)
            // 打印 cookie 值
            echo $cookie->value;
        else {
            // 创建一个cookie实例
            $cookie=new CHttpCookie('test','I am a cookie!');
            $request->cookies['test'] = $cookie;
        }
    }
}

如果你有很多cookie值要处理,并且想精简所提供的代码,你可以使用像这样的助手方法:

class Cookie
{
    public static function get($name)
    {
        $cookie=Yii::app()->request->cookies[$name];
        if(!$cookie)
            return null;
       return $cookie->value;
    }
    
    public static function set($name, $value, $expiration=0)
    {
        $cookie=new CHttpCookie($name,$value);
        $cookie->expire = $expiration;
        Yii::app()->request->cookies[$name]=$cookie;
    }
}
在你把这份代码放到protected/components/Cookie.php后,你将可以这样做:

class TestController extends CController
{
    public function actionIndex()
    {
        $cookie = Cookie::get('test');
        if($cookie)
            echo $cookie;
        else
            Cookie::set('test','I am a cookie!!');
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值