zoukankan      html  css  js  c++  java
  • thinkphp5.1学习笔记

    tp配置技巧

    配置的get和set

    tp5.1的配置在config目录里,一个文件是一个一级配置项,每个文件一行是二级配置项。

    use thinkfacadeConfig;//导入Config 门脸
     public function get(){
            //获取全部配置
    //        dump(Config::get());
            //只获取app配置项
            dump(Config::get('app.'));
            dump(Config::pull('app'));
            //获取二级配置项
            dump(Config::get('app.app_debug'));
            dump(Config::get('app_debug'));//由于app是默认一级配置项,可以省略
            dump(Config::has('default_lang'));//检查是否有这个配置项,true/false
            dump(Config::get('database.hostname'));
        }
        public function set(){
            //动态设置,静态设置是修改配置文件
            dump(Config::set('app_debug'));
        }
    }
    

    使用助手函数

    public function helper(){
            //助手函数不依赖于Config,不需要导入Config类
            //dump(config());//获取全部配置,相当于Config::get()
            dump(config('default_lang'));
            dump(config('?default_lang'));//查看是否存在,true/false
            dump(config('database.hostname','localhost'));//设置,返回新的设置值localhost
        }
    

    trait

    trait 方法优先级小于父类,
    当两个trait 方法同名,会出错,需要如下:

         use Demo1 ,Demo2{
         Demo1::hello insteadof Demo2;
        Demo2::hello as Demo2hello;
    }
    

    容器/依赖注入/静态代理/请求对象

    容器与依赖注入的原理

    任何url的访问都是定位到控制器的,

    <?php
    namespace appindexcontroller;
    class Demo1
    {
       public function d1(appcommonB $b){//拿B做参数,当访问的d1方法自动实例化一个B,但是URL里不含参数。
           $b->speak();
       }
    }
    <?php
    namespace appcommon;
    class B
    {
        public function speak(){
            echo "i am b and i am speaking";
    }
    
    }
    调用  /index/Demo1/d1  ,得出i am b and i am speaking,
    

    绑定一个类到容器

    <?php
    namespace appcommon;
    class B
    {
        private $name;
        public function __construct($name='peterz')
        {
            $this->name=$name;
        }
        public function speakName(){
            echo 'my name is'.$this->name;
        }
    
    }
    <?php
    namespace appindexcontroller;
    class Demo1
    {
    
       public function bindClass(){
           	hinkContainer::set('Balias','appcommonB');
        //或者使用bind('Blias','appcommonB)
           $bb=	hinkContainer::get('Balias',['name'=>'constru']);
    //或者使用app('Balias',['name'=>'constru']);
           echo $bb->speakName();
       }
    
    }
    访问http://localhost/tp5/public/index.php/index/Demo1/bindClass,得到:my name isconstru
    

    将闭包绑定到容器

    <?php
    namespace appindexcontroller;
    class Demo1
    {
       public function bindClosure(){
           	hinkContainer::set('CC',function($param){
               return  'this is params:'.$param;
           });
           return 	hinkContainer::get('CC',['param'=>'parameters']);
       }
    }
    访问http://localhost/tp5/public/index.php/index/Demo1/bindClosure,得到this is params:parameters
    

    facade静态代理使用

    facade类在thinkfacade里

    <?php
    namespace appcommon;
    class B
    {
        public function speak($param){
            return 'i am '.$param;
        }
    }
    <?php//这是B类的代理
    namespace appfacade;
    class Testfacade extends 	hinkfacade
    {
        protected static function getFacadeClass(){
            return 'appcommonB';
        }
    
    }
    <?php//测试
    namespace appindexcontroller;
    class Demo1
    {
       public function d1(){
           return appfacadeTestfacade::speak('tom');
       }
    }
    http://localhost/tp5/public/index.php/index/Demo1/d1    输出: i am tom
    

    动态代理

    <?php
    namespace appcommon;
    class B
    {
       public function speak($p){
           return $p;
       }
    }
    <?php
    namespace appfacade;
    class Testfacade extends 	hinkFacade //什么也不写,就是一个facade类
    {
    
    }
    <?php
    namespace appindexcontroller;
    class Demo1
    {
        public function d1()
        {
            	hinkFacade::bind('appfacadeTestfacade','appcommonB');//动态代理,注意参数里app前面不要加
            return appfacadeTestfacade::speak('tim');
        }
    }
    

    控制器

    控制器不依赖于Controller,但推荐继承Controller,
    控制器里返回值一般是字符串,一般是return,
    默认输出格式是html,也可以指定为其他的,比如 json,

    request

    使用静态Request
    <?php
    namespace appindexcontroller;
    use 	hinkfacadeRequest;
    class Demo1
    {
        public function d1()
        {
            dump(Request::get());
        }
    }
    http://localhost/tp5/public/index.php/index/Demo1/d1?name=%27tom%27&age=30  
    输出   array(2) {
      ["name"] => string(5) "'tom'"
      ["age"] => string(2) "30"
    }
    依赖注入方式:
     public function d1(Request $request)
        {
            dump($request->get());
        }
    还可以用Controller里面的request
    public function d1()
        {
            dump($this->request->get());
        }
    

    数据库

    配置

    1,全局配置 config/databas.php
    2,动态配置: thinkdbquery.php
    3.DSN连接: 数据库类型://用户名:密码@数据库地址:端口号/数据库名称/字符集

    增删改查

    <?php
    namespace appindexcontroller;
    use thinkDb;
    class Demo1
    {
    
        public function d1()
        {
        /**
         * 数据库操作入口类Db,静态调用	hinkdbquery.php
         */
        $a=Db::table('student')
    //        ->field('id,name')
            //SELECT `id` AS `编号`,`name` AS `姓名` FROM `student` WHERE `id` = 3 LIMIT 1
                ->field(['id'=>'编号','name'=>'姓名'])
            ->where('id','=',3)
    
            ->find();
        dump(is_null($a)?'meizhaodao':$a);
        }
        //查询多条
        public function d2(){
            $a=Db::table('student')
                ->field('id,name,gender')
                ->where([
                    ['id','<',4],
                    ['id','>',1],
                ])->select();
            foreach ($a as $b){
                dump($b);
            }
        }
        public function insert(){
            $data=[
                'id'=>6,
                'name'=>'ppp',
                'age'=>20,
                'gender'=>'boy',
            ];
    //        return Db::table('student')->insert($data);//运行成功返回1
    //        return Db::table('student')->data($data)->insert();
            //插入同时返回新增的主键
            return Db::table('student')->insertGetId('$data');
        }
        //多条插入
        public function  insertmany(){
            $data=[
                ['id'=>6, 'name'=>'ppp', 'age'=>20, 'gender'=>'boy',],
                ['id'=>6, 'name'=>'ppp', 'age'=>20, 'gender'=>'boy',],
            ];
            return Db::table('student')->insertAll($data);
        }
        public function update(){
    //        return Db::table('student')->where('id',20)->update(['name'=>'ximenq']);
            //如果更新的是主键,比如id
            return Db::table('student')->update(['name'=>'ximenq','id'=>'20']);
    
    
        }//此外还可以原生查询
    }
    

    模型输出

     $nav=Catagory::where('id','>','0')->order('order')->select()->toArray();
           $this->assign('nav',$nav);
    模板中
    {foreach $nav as $key=>$vo}
    {$vo.name}
    {/foreach}
     $displayimg=Db::table('imageurl')->where('ifdisplay',1)->select();  //输出一样,不需要toArray();
           $this->assign('img',$displayimg);
    

    模板中{(vo.title},{)vo['title']}都可以,但是嵌入php时,需要用后者。
    {php} echo mb_strcut($vo['text'],0,150,'utf-8');{/php}

    url生成示例

    {:url('index/index/detail',['id'=>$vo['id'],])}
    
  • 相关阅读:
    MyEclipse 2015反编译插件安装
    RocketMQ事务消费和顺序消费详解
    Rocket重试机制,消息模式,刷盘方式
    前端js上传文件 到后端接收文件
    Junit进行单元测试
    json简单使用
    valgrind的使用--检测内存
    使用scrapy框架爬取自己的博文(3)
    使用scrapy框架爬取自己的博文
    Scrapy下xpath基本的使用方法
  • 原文地址:https://www.cnblogs.com/webdev8888/p/8933915.html
Copyright © 2011-2022 走看看