Yii框架常见问题

Yii的MVC基础知识

basic版非常清晰,分别位于controllers, models, views文件夹下

controllers下的文件通常心Controller结尾,如IndexController.php, 需访问通常在类中添加actionXxx方法,如需通过?r=index/index方法,在IndexController类中添加actionIndex方法

models下的文件名通常与数据表名称一致

views下的目录名通常与控制器一致

1.Database Exception – yii\db\Exception

SQLSTATE[HY000] [2002] No such file or directory

本地开发时如出现这一错误,请尝试将config/db.php中的mysql:host= localhost修改成mysql:host=127.0.0.1

 

2.如何去除顶部默认的导航条?

Yii Layout

// 方法一:在controller中加入
$this->layout = false; // 在类中加入可作用下其它的所有方法
// 方法二:将return $this->render('index')替换为如下代码
return $this->renderPartial('index');

3.No such file or directory in vendor/yiisoft/yii2/db/Connection.php at line 603

请检查common/config/main-local.php中配置文件host是否为localhost并尝试修改127.0.0.1进行连接

CentOS 6 Yii框架开发

基本环境准备

yum install httpd mysql php -y
yum install php-devel php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt -y
yum install mysql-server mysql mysql-devel -y
#设置MySQL密码
mysql_secure_installation
#安装Nginx
yum -y install nginx

Yii的安装

#安装composer:
curl -sS http://install.phpcomposer.com/installer | php 
#安装全局插件
php composer.phar global require "fxp/composer-asset-plugin:~1.1.1" 
#安装yii框架 
php composer.phar create-project --prefer-dist yiisoft/yii2-app-basic basic 2.0.10

Yii框架学习笔记

以下均在basic框架中进行的操作,advanced版可以参考

视图文件:

//以下common.php位于views下的layouts文件夹中,about.php位于views文件夹下面的hello文件夹中
class HelloController extends Controller{
  public $layout = 'common'; //视图文件夹中的common.php,在其中输出$content
  public function actionIndex(){
    return $this->render('about'); //视图文件夹中的about.php内容返回到一个$content变量中
  }
}

视图文件中的转义

//对JS等代码进行转义仍显示在前端
use yii\helpers\Html;
Html::encode()
//对JS等代码进行处理不显示在前端
use yii\helpers\HtmlPurifier;
HtmlPurifier::process()

HelloController.php(访问路径web/index.php?r=hello/index)

namespace app\controllers;
use yii\web\Controller;

class HelloController extends Controller{
//方法前要加action
  public function actionIndex(){
    // get\post相关方法需使用全局命名空间YII
    // $request = \YII::$app->request;

    // 下面的DEFAULT_VALUE为name不存在时所显示的值
    // $request->post('name','DEFAULT_VALUE');

    // 判断是否通过GET方式请求,同理isPost
    // if($request->isGet){
    //   echo $request->get('id','DEFAULT_VALUE');
    // }
    // //获取用户IP地址
    // echo $request->userIp;

    // 响应设置
    $res = \YII::$app->response;
    // $res->headers->add('pragma', 'no-cache');
    // $res->headers->set('pragma','max-age=5');
    // $res->headers->remove('pragma');
    //跳转
    // $res->redirect('http://www.baidu.com',302);
    // $this->redirect("http://alanhou.org",301);
    //下载文件
    // $res->headers->add('content-disposition','attachment; filename="a.jpg"');
    // $res->sendFile('./robots.txt');
    // $res->statusCode = '404';
  }
}

Session相关

$session = \YII::$app->session;
$session->open();
//判断session是否开启
// if($session->isActive){
//   echo "session is active";
// }
// 方法一:$session->set('user','Alan');
// 方法二:$session['user'] = 'Alan';
// echo $session->get('user');
// $session->remove('user');
// unset($session['user']);

Cookie相关

namespace app\controllers;
use yii\web\Controller;
use yii\web\Cookie;

class HelloController extends Controller{

  public function actionIndex(){
    // $cookies = \YII::$app->response->cookies;
    // $cookie_data = array('name'=>'user', 'value'=>'Alan');
    // $cookies->add(new Cookie($cookie_data));
    // $cookies->remove('user');

    $cookie = \YII::$app->request->cookies;
    //DEFAULT_VALUE为user这个cookie不存在时默认显示的值
    echo $cookie->getValue('user','DEFAULT_VALUE');
  }
}

Model文件-操作数据库

1.在config/db.php配置数据库信息
2.models下创建一个Test.php,用于操作test表

namespace app\models;
use yii\db\ActiveRecord;

class Test extends ActiveRecord{

}

3.在controller的文件中进行操作

//首先引入:
use app\models\Test;
//在方法中进行代码书写

//**查询数据**
// $sql = 'SELECT * FROM test WHERE id=1';
// $results = Test::findBySql($sql)->all();
//当用户传入值时可通过占位符:id形式防止sql注入
// $sql = 'SELECT * FROM test WHERE id=:id';
// $results = Test::findBySql($sql, array(':id'=>'1 or 1=1'))->all();
//如果是id>1则将where修改为where(['>','id',1])
//id>=1 and id<=2 where('between', 'id', 1, 2) //默认返回对象的形式,比较占用资源,可以添加asArray()转换成数组 $results = Test::find()->where(['id'=>1])->asArray()->all();
print_r($results);
//批量查询
foreach(Test::find()->batch(2) as tests){
  print_r($tests);
}

//**删除数据**
// 方法一
// $results = Test::find()_>where(['id'=>2])-all();
// $results[0]->delete();
//方法二
Test::deleteAll('id>=:id', array(':id'=>2));

增加数据时为保证安全通常会进行数据的检测,详细内容可参考 http://www.yiichina.com/doc/guide/2.0/tutorial-core-validators
以下简单的在models/Test.php加入代码进行验证

class Test extends ActiveRecord{
  public function rules(){
    return [
      ['id', 'integer'],
      ['title', 'string', 'length'=>[0,10]]
    ];
  }
}

controller文件中:

// 增加数据
$test = new Test;
$test->id = '1';
$test->title = 'blahblah';
$test->validate();
if($test->hasErrors()){
  die("ERROR");
}
$test->save();

修改数据

// 修改数据
$test = Test::find()->where(['id'=>1])->one();
$test->title = 'title 1 modified';
$test->save();

Composer安装

curl -sS http://install.phpcomposer.com/installer | php
php composer.phar global require "fxp/composer-asset-plugin:~1.1.1"
php composer.phar create-project --prefer-dist yiisoft/yii2-app-basic 2.0.7