yii2部分常见问题
yii2 2017-02-06 14:53:23

1、将根目录指向 域名/web/   出现open_basedir错误

2、关于URL被转义的问题,/ 转义为 %2F

3、修改默认控制器

4、composer删除扩展组件 / composer重置 

5、获取客户端IP和host name 

6、API跨域的问题

7、自动加载类文件 

8、修改自定义入口目录

9、searchModel 搜索条件无效 

10、在控制器中指定action关掉csrf验证 

11、控制器方法返回json 

12、加一个类,基于基类,添加初始化函数 

13、渲染页面是否使用布局:

14、easywechat报错Symfony\Contracts\EventDispatcher\EventDispatcherInterface

15、yii2 Expected response code 220 but got an empty response

 

1、将根目录指向 域名/web/   出现open_basedir错误

1.jpg

打开apache/httpd-vhosts.conf

搜索:

ServerName 本地解析的域名

将open_basedir注释掉

2.jpg

 

 2、关于URL被转义的问题

3.jpg

比如 / 被转义成了  %2F

修改文件:

/vendor/yiisoft/yii2/web/UrlManager.php

4.jpg

丢掉urlencode即可

 

3、修改默认控制器

默认的controller为SiteController.php

在控制器中加一行:

PHP Code复制内容到剪贴板
  1. public $defaultAction='login';  

5.jpg

 

4、composer删除扩展组件

composer.json去掉要删除的扩展或者库

运行

PHP Code复制内容到剪贴板
  1. composer update -vvv  

 

PHP Code复制内容到剪贴板
  1. composer dump-autoload  

 

PHP Code复制内容到剪贴板
  1. composer update  

 

5、获取客户端IP和host name

PHP Code复制内容到剪贴板
  1. $userHost = Yii::$app->request->userHost;    
  2. $userIP = Yii::$app->request->userIP;  

 

PHP Code复制内容到剪贴板
  1. 链接:      
  2. http://gzh.com/course/app/list?mode=hot      
  3.       
  4. echo \Yii::$app->request->hostInfo;     
  5. //## http://gzh.com      
  6.       
  7. echo \Yii::$app->request->getUrl();     
  8. //## /course/app/list?mode=hot      
  9.     
  10.       
  11. echo \Yii::$app->request->getAbsoluteUrl();    
  12. //##  http://gzh.com/course/app/list?mode=hot      
 
 
PHP Code复制内容到剪贴板
  1. echo \Yii::$app->request->pathInfo;  
  2. //## course/app/list  

 

PHP Code复制内容到剪贴板
  1. $moduleID = \Yii::$app->controller->module->id;  
  2. $controllerID = \Yii::$app->controller->id;    
  3. $actionID = \Yii::$app->controller->action->id;    

 

 

 6、API跨域的问题

如果是Google浏览器,打开chrome://flags/#out-of-blink-cors

WX20200417-150655@2x.png

 

 两种情况,

第一种,在基类controller中,如api/common/Controller.php中的

 WX20200417-214601@2x.png

 

第二种情况

PHP Code复制内容到剪贴板
  1. $response = $event->sender;  
  2.         $response->data = [  
  3.             'code' => $response->statusCode,  
  4.             'message' => $response->statusText,  
  5.             'data' => $response->data,  
  6.         ];  

 

 这里不能用array_merge了

 

7、自动加载类文件,在YII里面,由于底层目录被改的乱七八糟,已经无法使用use来引入类文件了,这里可以放在use之前 ,或之后 都可以,根据加载的类来引入文件

PHP Code复制内容到剪贴板
  1. define("DIR_SERVICE",__DIR__);  
  2.   
  3. /* 自动加载类文件 */  
  4. spl_autoload_register(function ($class) {  
  5.     if ($class) {  
  6.         echo $class.'<br>';    //  命名空间:service\widgets\models\Widget  
  7.         $file = str_replace('service', DIR_SERVICE, $class);  
  8.         $file .= '.class.php';  
  9.         echo $file;            // 替换service以后 E:\\www\web\widgets\models\Widget  
  10.         die;  
  11.         require($file);  
  12.     }  
  13. });  

 

 8、apache自定义入口目录:

Apache目录 /conf/httpd-vhosts.conf

QQ图片20170423191616.png 

重启 apache

 

9、searchModel 搜索条件无效

PHP Code复制内容到剪贴板
  1. <?php  
  2. //常规的渲染页面:  
  3. $searchModel = new LifeSearch();  
  4. $dataProvider = $searchModel->search(Yii::$app->request->queryParams);  
  5. return $this->render('/life/index', [  
  6.     'searchModel' => $searchModel,  
  7.     'dataProvider' => $dataProvider,  
  8. ]);  
  9.   
  10.   
  11. //自定义条件,或搜索字段名与表中不一致的:  
  12. $searchModel = new LifeSearch();  
  13. $search = [  
  14.     $searchModel->formName() =>  
  15.         [  
  16.             'plan_id' => $id  
  17.         ]  
  18. ];  
  19. $dataProvider = $searchModel->search($search);  
  20. return $this->render('/life/index', [  
  21.     'searchModel' => $searchModel,  
  22.     'dataProvider' => $dataProvider,  
  23. ]);  
  24.   
  25.   
  26. // 当然,在searchModel中,对于要搜索的字段,rules中请加safe规则  
  27. public function rules()  
  28. {  
  29.     return [  
  30.         [['id''plan_id'], 'safe']  
  31.     ];  
  32. }  

 

10、关于如何在单独的action中关闭Csrf验证

新建一个Behavior

PHP Code复制内容到剪贴板
  1. <?php  
  2. namespace app\common\behaviors;  
  3. use Yii;  
  4. use yii\base\ActionEvent;  
  5. use yii\base\Behavior;  
  6. use yii\web\Controller;  
  7.   
  8.   
  9. class NoCsrf extends Behavior  
  10. {  
  11.     public $actions = [];  
  12.     public $controller;  
  13.     public function events()  
  14.     {  
  15.         return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];  
  16.     }  
  17.     public function beforeAction($event)  
  18.     {  
  19.         $action = $event->action->id;  
  20.         if(in_array($action$this->actions)){  
  21.             $this->controller->enableCsrfValidation = false;  
  22.         }  
  23.     }  
  24. }  

 在控制器中use:

PHP Code复制内容到剪贴板
  1. use app\common\behaviors\NoCsrf;  
  2.   
  3.     /** 
  4.      * {@inheritdoc} 
  5.      */  
  6.     public function behaviors()  
  7.     {  
  8.         return [  
  9.             'verbs' => [  
  10.                 'class' => VerbFilter::className(),  
  11.                 'actions' => [  
  12.                     'delete' => ['post','get'],  
  13.                 ],  
  14.             ],  
  15.             'csrf' => [  
  16.                 'class' => NoCsrf::className(),  
  17.                 'controller' => $this,  
  18.                 'actions' => [  
  19.                     'switcher'  
  20.                 ]  
  21.             ]  
  22.         ];  
  23.     }  

 

或者在 model中添加:

PHP Code复制内容到剪贴板
  1. public function beforeAction($action)  
  2. {              
  3.     if ($action->id == 'my-method') {  
  4.         $this->enableCsrfValidation = false;  
  5.     }  
  6.   
  7.     return parent::beforeAction($action);  
  8. }  

 

11、控制器方法返回json:

一、

PHP Code复制内容到剪贴板
  1. public function actionSwitcher(){  
  2.     \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;  
  3.     return [  
  4.         'search' => "11",  
  5.         'code' => 100,  
  6.     ];  
  7. }  

二、

PHP Code复制内容到剪贴板
  1. public function actionSwitcher(){  
  2.     $test = [  
  3.         'code' => '200',  
  4.         'abc'  => '测试',  
  5.     ];  
  6.     return \yii\helpers\Json::encode($test);  
  7. }  

三、在controller中指定方法返回json:

PHP Code复制内容到剪贴板
  1. use yii\filters\ContentNegotiator;  
  2. use yii\web\Response;  
  3.   
  4.     /** 
  5.      * {@inheritdoc} 
  6.      */  
  7.     public function behaviors()  
  8.     {  
  9.         return [  
  10.             'contentNegotiator' => [  
  11.                 'class' => ContentNegotiator::className(),  
  12.                 'formats' => [  
  13.                     'application/json' => Response::FORMAT_JSON,  
  14.                 ],  
  15.                 'only' => ['switcher'],  
  16.             ],  
  17.         ];  
  18.     }  
  19.   
  20.   
  21.     public function actionSwitcher(){  
  22.         $test = [  
  23.             'code' => '200',  
  24.             'abc'  => '测试',  
  25.         ];  
  26.         return $test;  
  27.     }  

如果在module中的话 就要['控制器/动作']

 

 12、加一个类,基于基类

yii2默认在执行完__construct()后,执行init() 函数 ,所以,自己添加的类,可以加方法:

PHP Code复制内容到剪贴板
  1. function init(){  
  2.     //...  
  3. }  

 重写init,beforeAction,根据你的需要。初始化变量建议重写init

 

13、渲染页面是否使用布局:

 方案1:控制器内成员变量

PHP Code复制内容到剪贴板
  1. public $layout = false; //不使用布局public $layout = "main"; //设置使用的布局文件  

 

方案2:控制器成员方法内

PHP Code复制内容到剪贴板
  1. $this->layout = false; //不使用布局  
  2. $this->layout = "main"//设置使用的布局文件  

 

 方案3:视图中选择布局

PHP Code复制内容到剪贴板
  1. $this->context->layout = false; //不使用布局  
  2. $this->context->layout = 'main'//设置使用的布局文件  

 

方案4:在controller中指定的方法中不使用布局文件的写法:

PHP Code复制内容到剪贴板
  1. return $this->renderPartial('index',$data);//第二个参数用来传递数组给模板文件  

 

14、easywechat报错Symfony\Contracts\EventDispatcher\EventDispatcherInterface

升级到php7.2.9 + 

或者

PHP Code复制内容到剪贴板
  1. composer require symfony/event-dispatcher:~4.3  

 

15、yii2发送邮件:yii2 Expected response code 220 but got an empty response

如果使用ssl端口,则encyption配置项必须为465/994,如果使用非ssl则应该使用25

 

 

本文来自于:http://www.yoyo88.cn/study/yii2/72.html

Powered by yoyo苏ICP备15045725号