Yii2 官方文档阅读笔记

时间:2023-01-30 22:19:40

1.抛出异常, 貌似不用加上try catch

use yii\web\NotFoundHttpException;


$model = Post::findOne($id);
if ($model === null) {
throw new NotFoundHttpException;
}

2.加载post过来的参数然后保存

if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
}

3.块赋值
块赋值只用一行代码将用户所有输入填充到一个模型,非常方便, 它直接将输入数据对应填充到 yii\base\Model::attributes() 属性。 以下两段代码效果是相同的, 都是将终端用户输入的表单数据赋值到 ContactForm 模型的属性, 明显地前一段块赋值的代码比后一段代码简洁且不易出错。

块赋值

$model = new \app\models\ContactForm;
$model->attributes = \Yii::$app->request->post('ContactForm');

以前的单独赋值

$model = new \app\models\ContactForm;
$data = \Yii::$app->request->post('ContactForm', []);
$model->name = isset($data['name']) ? $data['name'] : null;
$model->email = isset($data['email']) ? $data['email'] : null;
$model->subject = isset($data['subject']) ? $data['subject'] : null;
$model->body = isset($data['body']) ? $data['body'] : null;

4.字段
字段是模型通过调用yii\base\Model::toArray() 生成的数组的单元名。

默认情况下,字段名对应属性名,但是你可以通过覆盖 fields() 和/或 yii\base\Model::extraFields() 方法来改变这种行为, 两个方法都返回一个字段定义列表,fields() 方法定义的字段是默认字段, 表示toArray()方法默认会返回这些字段。 extraFields()方法定义额外可用字段,通过toArray()方法指定$expand参数来返回这些额外可用字段。 例如如下代码会返回fields()方法定义的所有字段 和extraFields()方法定义的prettyName and fullAddress字段。

$array = $model->toArray([], ['prettyName', 'fullAddress']);

可通过覆盖 fields() 来增加、删除、重命名和重定义字段, fields() 方法返回值应为数组, 数组的键为字段名,数组的值为对应的可为属性名或匿名函数返回的字段定义对应的值。 特使情况下,如果字段名和属性定义名相同,可以省略数组键, 例如:

//用的extrafields方法
public function extraFields(){
return [
'sender_avatar' => function () {
return isset($this->sender_avatar)? Yii::$app->params['LocalHostPath'] . $this->sender_avatar:'';
},
];
}

function getRequestList($receive_code){
$request_list = RequestModel::find()->where(['receive_code' => $receive_code, 'is_delete' => 0])->orderBy('ctime')->all();//现在返回的请求为接受者是当前用户的请求
$request_array = [];
foreach ($request_list as $request){
//sender_avata 用的是extraFields里面的方法
$request_array[] = $request->toArray([],['sender_avatar']);
}
return $this->modelReturn('Success', Yii::$app->params['successStatus'],['request_list' => $request_array]);
}

5.HTTP头
你可以通过 yii\web\Request::headers 属性返回的 header collection 获取HTTP头信息。 例如,

// $headers 是一个 yii\web\HeaderCollection 对象
$headers = Yii::$app->request->headers;

// 返回 Accept header 值
$accept = $headers->get('Accept');

if ($headers->has('User-Agent')) { /* 这是一个 User-Agent 头 */ } //判断是否有user agent字段
请求组件也提供了支持快速访问常用头的方法,包括:

yii\web\Request::userAgent://返回 User-Agent 头。
yii\web\Request::contentType://返回 Content-Type 头的值, Content-Type 是请求体中MIME类型数据。
yii\web\Request::acceptableContentTypes://返回用户可接受的内容MIME类型。 返回的类型是按照他们的质量得分来排序的。得分最高的类型将被最先返回。
yii\web\Request::acceptableLanguages://返回用户可接受的语言。 返回的语言是按照他们的偏好层次来排序的。第一个参数代表最优先的语言。
假如你的应用支持多语言,并且你想在终端用户最喜欢的语言中显示页面, 那么你可以使用语言协商方法 yii\web\Request::getPreferredLanguage()。 //这个方法通过 yii\web\Request::acceptableLanguages 在你的应用中所支持的语言列表里进行比较筛选,返回最适合的语言。

提示: 你也可以使用 ContentNegotiator 过滤器进行动态确定哪些内容类型和语言应该在响应中使用。 这个过滤器实现了上面介绍的内容协商的属性和方法。
客户端信息
你可以通过 yii\web\Request::userHost 和 yii\web\Request::userIP 分别获取host name和客户机的IP地址, 例如,

$userHost = Yii::$app->request->userHost;
$userIP = Yii::$app->request->userIP;

6.状态码
构建响应时,最先应做的是标识请求是否成功处理的状态,可通过设置 yii\web\Response::statusCode 属性,该属性使用一个有效的 HTTP 状态码。例如,为标识处理已被处理成功, 可设置状态码为200,如下所示:

Yii::$app->response->statusCode = 200;

尽管如此,大多数情况下不需要明确设置状态码, 因为 yii\web\Response::statusCode 状态码默认为200, 如果需要指定请求失败,可抛出对应的HTTP异常,如下所示:

throw new \yii\web\NotFoundHttpException;

当错误处理器 捕获到一个异常,会从异常中提取状态码并赋值到响应, 对于上述的 yii\web\NotFoundHttpException 对应HTTP 404状态码, 以下为Yii预定义的HTTP异常:

yii\web\BadRequestHttpException:状态码 400。
yii\web\ConflictHttpException:状态码 409。
yii\web\ForbiddenHttpException:状态码 403。
yii\web\GoneHttpException:状态码 410。
yii\web\MethodNotAllowedHttpException:状态码 405。
yii\web\NotAcceptableHttpException:状态码 406。
yii\web\NotFoundHttpException:状态码 404。
yii\web\ServerErrorHttpException:状态码 500。
yii\web\TooManyRequestsHttpException:状态码 429。
yii\web\UnauthorizedHttpException:状态码 401。
yii\web\UnsupportedMediaTypeHttpException:状态码 415。

如果想抛出的异常不在如上列表中,可创建一个yii\web\HttpException异常, 带上状态码抛出,如下:

throw new \yii\web\HttpException(402);

7.HTTP 头部
可在 response 组件中操控yii\web\Response::headers来发送HTTP头部信息, 例如:

$headers = Yii::$app->response->headers;

// 增加一个 Pragma 头,已存在的Pragma 头不会被覆盖。
$headers->add('Pragma', 'no-cache');

// 设置一个Pragma 头. 任何已存在的Pragma 头都会被丢弃
$headers->set('Pragma', 'no-cache');

// 删除Pragma 头并返回删除的Pragma 头的值到数组
$values = $headers->remove('Pragma');

8.发送文件
和浏览器跳转类似,文件发送是另一个依赖指定HTTP头的功能, Yii提供方法集合来支持各种文件发送需求,它们对HTTP头都有内置的支持。

这些方法都将响应对象作为返回值,如果要发送的文件非常大,应考虑使用 yii\web\Response::sendStreamAsFile() 因为它更节约内存, 以下示例显示在控制器动作中如何发送文件:

public function actionDownload()
{

return \Yii::$app->response->sendFile('path/to/file.txt');
}

如果不是在动作方法中调用文件发送方法, 在后面还应调用 yii\web\Response::send() 没有其他内容追加到响应中。

\Yii::$app->response->sendFile('path/to/file.txt')->send();

9.魔法函数

__METHOD__  => client\modules\push\controllers\IndexController::actionGetDataExceptId

10.日志可以通过以下配置, 然后在代码里面 用Yii:warning(); Yii::error();来记录

'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['warning'],
'logVars' => [''],
'logFile' => '/data/www/log/warning.log',
],
[
'class' => 'yii\log\FileTarget',
'levels' => ['error'],
'logVars' => ['_POST'],
'logFile' => '/data/www/log/error.log',
],
],
],