整理一些Yii框架常用到的实用功能(持续更新中...)

发布日期:2017-05-19    浏览量:1549

Yii框架常用功能

获取 YII2执行的 SQL 语句

  1. $query = User::find()
  2. ->where(['id'=>[1,2,3,4])
  3. ->select(['username'])
  4. // get the AR raw sql in YII2
  5. $commandQuery = clone $query;
  6. echo $commandQuery->createCommand()->getRawSql();
  7. $users = $query->all();

获取登录用户信息

Yii框架在用户登录后,会在user组件中保存登录用户的相关信息,
这时就可以通过以下方法来获取:

  1. Yii::$app->user->getIdentity()
  2. // 与上面一样
  3. Yii::$app->user->identity;

Yii验证码

2016-08-19更新:

  1. // Yii框架提供验证码组件,默认在SiteController中已经有了captcha action
  2. // 可直接在views中调用了
  3. public function actions()
  4. {
  5. return [
  6. 'error' => [
  7. 'class' => 'yii\web\ErrorAction',
  8. ],
  9. 'captcha'=>[
  10. 'class' => 'yii\captcha\CaptchaAction',
  11. 'backColor'=>0xFFFFFF,
  12. 'maxLength'=>4,
  13. 'minLength'=>4,
  14. 'height'=>rand(48, 50),
  15. 'width'=>100,
  16. 'foreColor'=>0xFF9900,
  17. 'fixedVerifyCode'=> in_array(YII_ENV, ['dev']) ? '8888' : null,
  18. ],
  19. ];
  20. }
  21. // view中调用方法:
  22. <?= $form->field($model, 'captcha', $captchaFieldOptions)
  23. ->label(false)
  24. ->widget(Captcha::classname(), [
  25. 'captchaAction'=>'signin/captcha',
  26. 'options'=>[
  27. 'class'=>'form-control',
  28. 'placeholder'=>'captcha',
  29. 'maxlength'=>4,
  30. 'style' => 'display:inline-block;'
  31. ],
  32. 'template' => '{input}{image}',
  33. 'attribute' => 'captcha',
  34. 'imageOptions'=>[
  35. 'class'=>'cpatcha-img',
  36. 'style' => 'cursor:pointer',
  37. 'title'=>'点击更换一张'
  38. ],
  39. ]);
  40. ?>

某个字段加1

  1. $model = $model->findModelById($de_id);
  2. $model->updateCounters(['read_num' => 1]);

8月21日更新:

post和Ajax时400错误

第一种解决办法是关闭Csrf验证

可以在init()和beforeAction()中关闭相应的csrf token,在此推荐后者:

  1. /**
  2. * Ajax请求过滤csrf验证,否则报:Bad Request (#400)
  3. * 该例子设置了发送短信时关闭csrf验证
  4. * @param \yii\base\Action $action 当前请求的action对象
  5. * @return bool|void
  6. */
  7. public function beforeAction($action) {
  8. $disableCsfrActions = ['send-sms'];
  9. if (in_array($action->id, $disableCsfrActions)) {
  10. $this->enableCsrfValidation = false;
  11. }
  12. return parent::beforeAction($action);
  13. }

第二种解决办法是在form表单中加入隐藏域

csrf token有两种获取方法:
1、直接用meta的:

  1. // JS
  2. var csrfToken = $('meta[name="csrf-token"]').attr("content");

2、使用Yii::$app->request->csrfToken

注:Yii::$app->request->csrfTokenYii::$app->request->getCsrfToken()结果是一样的。

  1. <input name="<?= Yii::$app->request->csrfParam ?>" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">

另附:生成meta标签:<?= \yii\helpers\Html::csrfMetaTags() ?>


8月22日更新:

表单关闭验证

在form处关闭:'enableClientValidation'=>false

  1. <?php $form = ActiveForm::begin([
  2. 'options' => [],
  3. 'fieldConfig' => [],
  4. 'enableClientValidation'=>false,
  5. ]); ?>

9月20日更新:

修改错误页面的layout

默认情况下,Yii的错误处理使用的layout是main.php,这对于后台来说并不安全,因为只要出错,就可以看到整个后台。

现在有个折中的办法,就是修改\yii\web\ErrorAction中的run()方法,在:

  1. // 这里指定layout
  2. $this->controller->layout = 'single';
  3. return $this->controller->render($this->view ?: $this->id, [
  4. 'name' => $name,
  5. 'message' => $message,
  6. 'exception' => $exception,
  7. ]);

然后在layouts文件夹中创建single.php文件,模仿main.php中的内容修改了适合自己就可以了。


9月29日更新:

使用Yii发送邮件

由于Yii框架的文档中没有给出详细的使用说明,这肯定会让我们看完手册后也不知道怎么才能成功发送邮件,以下方法简要描述了如何配置到最后成功发送邮件:

step.1 在common/config/main_local.php处配置
当然你也可以在任何一处配置文件中配置该项,因为我发现在该处有mailer配置项,所以就在这里进行配置了。

  1. 'mailer' => [
  2. // 这里不用动
  3. 'class' => 'yii\swiftmailer\Mailer',
  4. 'viewPath' => '@common/mail',
  5. // 该项默认是true,表示把邮件保存到文件而不进行发送,这里可以改成false或注释掉都行
  6. // 'useFileTransport' => true,
  7. // 下面这个配置项文档中没有给出,但缺了它就不能发送邮件,也不知道官方是怎么想的。
  8. 'transport' => [
  9. // 制定用哪个类进行处理邮件,照搬过来不用动它
  10. 'class' => 'Swift_SmtpTransport',
  11. // 你的邮件服务器,这里我用的是163的。
  12. 'host' => 'smtp.163.com',
  13. // 邮件用户名
  14. 'username' => 'your_account',
  15. // 邮件密码或客户端授权码
  16. 'password' => 'your_passport',
  17. // 'port' => '', 可选
  18. ],
  19. // 可选配置项
  20. 'messageConfig' => [
  21. 'charset' => 'UTF-8',
  22. ],
  23. ],
  24. // 至此,邮件配置结束

step.2 发送邮件

  1. // 你的controller中
  2. // compose指定一个html模板
  3. Yii::$app->mailer->compose(['html' => 'html'],
  4. ['title' =>'test mail', 'content' => 'this is a test mail'])
  5. // 也可以使用纯文本
  6. // Yii::$app->mailer->compose(['text' => 'mail.txt'])
  7. ->setFrom('发件邮箱,要跟你上面配置的一致')
  8. ->setTo('发到谁的邮箱')
  9. ->setSubject('邮件标题')
  10. ->send();