您的位置:首页 > 编程语言 > PHP开发

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

2015-06-19 13:49 651 查看
书地址: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文件夹,它被翻译成文件系统路径。下表显示了更多的标准的别名:

AliasPath
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!!');
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: