yii框架-控制器/数据模型

Yii框架

命名空间
  • 相同类名在不同的命名空间里,会被认为是不同的类

  • 实例化类的时候 new 命名空间 类

  • use关键字 use 命名空间 类 默认后面使用的就都是声明命名空间里的类

  • use后,若要再使用指定命名空间里的类,可 use 命名空间 as 新的名字

  • 不在命名空间里的类,是全局类 new \类名 指的就是实例化顶层类

Yii框架 控制器
  1. 请求组件

    yii框架全局类里的请求组建:Yii::$app->request;
    
    Yii::$app->request->get('id',20);   //第二个参数指若id没有传值,默认用第二个值
    
    
    Yii::$app->request->isGet/isPost    //判断请求类型
    
    
    Yii::$app->request->userIp;          //获取请求的ip地址
    
  2. 响应组件

    $res =  Yii::$app->response;
    
    $res->statusCode = 404;       //状态码设置
    
    $res->headers->add('pragma','no-cache');    //消息头设置,不缓存消息
    
    $res->headers->set('pragma','max-age=5');    //消息头设置,缓存5s
    
    $res->headers->remove('pragma');    //消息头设置,移除
    
    //跳转
    
    $res->headers->add('location','http://home.corp.elong.com')  
    
    Yii的Controller提供专门函数:   $this->redirect('http://home.corp.elong.com')
    
    //文件下载
    
    $res->headers->add('content-disposition','attatchment',"filename='a.jpg'")  ;
    
    Yii提供包装方法:  $res->sendFile('./b.jpg'); //将消息存到b.jpg
    
  3. session

    //session组件
    
    $session = Yii::$app->session;
    
    $session->isActive;        //判断session是否被开启
    
    $session->open();          //开启session
    
    $session->set('user','hangview');    //前面变量,后面值,保存位置在php.ini里设置
    
    $session->get('user');          //取数据
    
    $session->remove('user');     //删除数据
    
    
    //数组形式设置
    
    $session['user'] = 'hangview';
    
    unset($session['user']);         //删除数据
    
    //为何session既能当对象,又能当数组使用:
    PHP中提供一个ArrayAccess的接口,实现这个接口的类,其对象都可以被当作数组来使用
    
    
    //不同浏览器向服务器发送请求时,服务器能识别出浏览器来源
    浏览器cookie里  PHPSESSIONID 作为入口去服务器对应文件找到session存储值 
    
    
    //response组件cookies集合
    $cookies = Yii::$app->response->cookies; 
    $cookie_data = ['name'=>'user','value'=>'hangview'];
    $cookies->add(new yii\web\Cookie($cookie_data));    //写cookie,值经过加密;修改的话重新插一次值即可
    $cookies->remove('user');           // 删除cookie
    
    
    //从请求中拿到cookie数据,用到请求组件里的cookie集合
    $cookies = Yii::$app->request->cookies;
    $cookies->getValue('user',20);         //想拿哪个拿哪个,不存在的值默认用第二个参数作为返回值
    
    //config  web.php   
    'cookieValidationKey' =>               //用来给cookie加密 
    
  4. view

    yii\helpers\Html
    Html::encode(); //跨站脚本攻击

Yii框架 数据模型
  • 数据模型

    活动记录 yii\db\ActiveRecord

    单表查询数据:

    • findBySql

      //class Test extends ActiveRecord{}
      
      
      $sql = 'select * from test where id = 1';
      $res = Test::findBySql($sql)->all(); //all()将每条sql记录包装成一个对象,然后返回一个数组
      
      //sql注入 : 用户传入参数  $id(如'1 or 1=1',会将所有数据都抓出来 )
      $sql = 'select * from test where id = ' . $id;
      //占位符,整体带入避免sql注入
      $sql = 'select * from test where id = :id';
      $res = Test::findBySql($sql,[':id'=>$id])->all(); 
      
    • find

      //id=1
      Test::find()->where(['id'=>1])->all();
      
      //id>0
      Test::find()->where(['>','id',0])->all();
      
      //1<id<2
      Test::find()->where(['between','id',1,2])->all();
      
      //title like "%hangview%"       
      Test::find()->where(['like','title','hangview'])->all();
      
      //查询结果转化为数组,降低内存使用率
      Test::find()->where(['like','title','hangview'])->asArray()->all();
      
      //批量查询
      foreach(Test::find->batch(1000) as $tests){   //每次拿1000条数据
          pirint_r(tests);
      }
      
    • 单表删除数据:

      //删除数据
      $res = Test::find()->where(['id'=>1])->all();
      $res[0]->delete();
      
      Test::deleteAll('id>:id',['id'=>0]);
      
    • 添加数据:

      //增加数据
      $test = new Test;
      $test->id  = 1;
      $test->title = 'hangview'
      $test->validate();           //启用rules校验
      if($test->hasErrors()){      //错误处理
      
      }
      $test->save(); 
      
      //合法验证
      //TEST
      public function rules(){
      
          return [                            //验证器
              ['id','integer'],
              ['title','string',length=>[0,5]],                 
          ];
      }
      
    • 修改数据

      $test = Test::find()->where['id'=>4]->one();
      $test->title = 'hang';
      $test->save(); 
      
    • 关联查询

      //获取顾客对应订单信息
      
      $customer = Customer::find()->where(['name'=>'hangview'])->one();
      $orders = $customer->hasMany('Order::className(),['customerId'=> id])->asArray()->all();
      
      //封装
      class Customer extends ActiveRecord{
          //获取顾客订单信息
          public function getOrders(){
              $return $this->hasMany(Order::className(),['customer_id' => 'id'])->asArray();
          }
      }
      
      $orders = $customer->getOrders();
      //当访问对象不存在属性时,php调用__get()方法-》AR里调用get+属性名字:getOrders()->all()
      $orders = $customer->orders;   
      
      //获取订单对应顾客
      
      $order->hasOne(Customer::className(),['id'=>'customerId'])->asArray();
      $order = Order::find()->where(['id'=>1])->one();
      $customer = $order->customer;
      
    • 查询性能问题

      //关联查询结果缓存
      $orders = $customer->orders; //select * frome order ...
      unset($customer->orders);     //  不unset的话会从缓存读取
      $orders = $customer->orders; 
      
      //关联查询的多次查询
      
      $customers = Customer::find()->all();
      foreach($customers as $customer){
          $orders = $customer->orders;                    //每次访问都会去赌一次数据库,效率很低
      }
      
      //with(属性)   selsect * from Order where customerId in(....)     //只进行一次数据库查询即可
      $customers = Customer::find()->with('orders')->all();
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值