TP5.1初学

thinkphp5.1

介绍

此为初次tp5.1的系统学习


安装

Git安装

可以直接使用git版本库安装,ThinkPHP5.1主要分为应用和核心两个仓库主要包括:

  • 应用项目:https://github.com/top-think/thinktps
  • 核心框架:https://github.com/top-think/framework
步骤:
  1. 克隆下载应用项目仓库

    git clone https://github.com/top-think/think tp5

  2. 切换到tp5目录下,再克隆核心框架仓库(目录名称不要改变)

    git clone https://github.com/top-think/framework thinkphp


入口文件及访问方式

ThinkPHP采用的是单一入口模式进行项目部署,无论完成什么功能都由此入口进入,其主要目的是为了提高安全性。

tp5.1默认的应用入口文件位于:public/index.php

静态文件存放地点(css/js/images):public/static/

url访问方式:
http://localhost(主机名)/index.php/模块/控制器/操作/[参数名/参数值...]


php设计模式

单例模式

常见的类构造方式如下

class Site
{
    //属性
    public $siteName;
    protected static $instance = null;
    //禁用掉构造器
    private function __construct($siteName)
    {
        $this->siteName = $siteName
    }
    //获取本类唯一实例
    public static function get Instance($siteName='1')
    {
        if(!self::$instance instanceof self)
        {
            self::$instance = new self($siteName);
        }
        return self::$instance;
    }
}
工厂模式

批量生成类对象

class factory
{
    //创建指定类实例
    public static function create()
    {
        return Site::getInstance(siteName:'帅康');
    }
}
注册树模式
  1. 注册:set()把对象挂到树上
  2. 获取:get()把对象取下来用
  3. 注销:_unset()把对象弄死
class Register
{
  //创建对象池:数组
  protected static $objects = [];
  //生成对象并上树
  public static function set($alias,$object)
  {
      self::$objects[$alias] = $object;
  }
  //从树上取下对象
  public static function get($alias)
  {
    return self::$objects[$alias];
  }
  //把树上的对象销毁
  public static function _unset($alias)
  {
    unset(self::$objects[$alias]);
  }
}
//将Site类的实例上树
Register::set('1',Factory::creat());
//从树上取一个对象下来
$obj = Register::get('1');
//销毁对象
Register::_unset('1');

自动依赖注入

允许向类中的方法中传递对象

常见命名空间

名称 描述 实际位置
think 系统核心类库 thinkphp/library/think
traits 系统Trait类库 thinkphp/library/traits
app 应用类库 application

公用类Temp

name = $name;
    }
    public function set($name)
    {
        $this->name = $name;
    }
    public function get()
    {
        return '当前方法为:'.__METHOD__.'当前属性为:'.$this->name;
    }
}
?>

在Demo类中使用依赖注入,为当前方法传入一个自动实例化的类,实例化后赋值给$temp变量

set($name);
        return $temp->get();
    }
    public function getInfo(\app\common\Temp $temp)
    {
        return $temp->get();
    }
    public function getName(\app\common\Temp $temp)
    {
        return $temp->name;
    }
}
?>

Facade静态代理

可以让类无须实例化就可以静态掉用类里面的方法

目录位置: app/common(自建)/Test.php

被代理类Test



目录位置: app/facade(自建)/Test.php

静态类文件,注意一定要和你需要被代理的那个类名相同



目录位置: app/index/controller/Demo.php

调用静态代理类中的方法

hello();
      使用静态代理访问可以看成app\facade\Test替代了app\common\Test中的内容
    */
    public function index()
    {
        return Test::hello();
    }
}
?>

Request请求对象

用来获取浏览器传回来的数据等信息

以下为Demo案例

get());
    }
}



//以下为静态代理方法
//Request静态代理创建见上一条
class Demo extends \think\Controller
{
    public function test()
    {
        dump(Request::get());
    }
}



//以下为依赖注入方法
class Demo extends \think\Controller
{
    public function test(Request $request)
    {
        dump($request->get());
    }
}
?>

数据库

全局配置

数据库全局配置位于:config/database.php

where('id',1)->find();
        //查询多条语句
        Db::table('表名')->where('sex','男')->select();
        //查询某个字段值
        Db::table('表名')->where('id',1)->value('name');
        //查询某一列的值
        Db::table('表名')->where('sex','男')->column('name')
        //使用助手函数
        db('表名')->where('id',1)->find();
        //处理大量数据集
        $cursor = Db::table('user')->where('status', 1)->cursor();
        foreach($cursor as $user)
        {
            echo $user['name'];
        } 
        
        
        
        //插入语句
        $data = ['sex' => '男','name' => '1'];
        Db::name('表名')->insert($data);
        //如果不希望无关字段报错,可以使用下面一条,他会将不存在的字段直接抛弃
        $data = ['sex' => '男','name' => '1'];
        Db::name('表名')->strict(false)->insert($data);
        //添加多条语句
        $data = [
            ['name' => '1', 'sex' => '男'],
            ['name' => '彭于晏', 'sex' => '男'],
            ['name' => '迪丽热巴', 'sex' => '女']
            ];
        Db::name('表名')->insertAll($data);
        
        
        
        //更新数据
        Db::name('user')
            ->where('id', 1)
            ->data(['name' => '彭于晏'])
            ->update();
            
            
        //删除数据
        //根据条件删除
        Db::table('think_user')->where('id','<',10)->delete();
        //根据主键删除
        Db::table('think_user')->delete([1,2,3]);
    }
}
?>
动态配置
'mysql',
            'hostname'=>'127.0.0.1',
            'database'=>'数据库名',
            'username'=>'用户名',
            'password'=>'密码',
        ])->table('表名')->where('id',1)->value('name');
    }
}
?>

模型

mvc中的model层,自动对应数据表,不用每次操作都要选择数据表。

建议:

单独一个人做项目时可以直接使用Db类更加方便,但是如果同一项目多人合作就应当使用模型类。

新建文件夹:application/index/model/表名.php


跳转文件:application/index/controller/Demo.php

大部分增删改查操作和Db类似只不过不用每次都选择数据表

find();
    }
}
?>

视图

模板渲染

常用方法:
控制器在继承系统控制器基类(\think\Controller)后调用fetch方法

格式:fetch('[模板文件]'[,'模板变量(数组)'])

典型用法

以下例子将会自动定位到相应的模板文件,规则如下:

当前模块/view/当前控制器名(小写)/当前操作(小写).html
app/index/view/demo/index.html
//假设此文件名为Demo.php
fetch();
    }
}

助手函数

控制器并未继承系统的控制器基类,则使用系统提供的助手函数 view ,可以完成相同的功能:

namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
        // 渲染模板输出
        return view('hello', ['name' => 'thinkphp']);
    }
}

模板

渲染内容

如果希望直接解析内容而不通过模板文件的话,可以使用 display 方法:

namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
        // 直接渲染内容
        $content = '{$name}-{$email}';
        return $this->display($content, ['name' => '', 'email' => '[email protected]']);
}
}

模板赋值

在控制器继承了系统的控制器基类的情况下,可以使用 assign 方法进行模板变量赋值。

view()助手函数,fetch()和display()均支持直接传入模板变量,例如:

$this->fetch('index', [ 'name' => '凯', 'email' => '[email protected]' ]);

namespace index\app\controller;
class Index extends \think\Controller
{
    public function index()
    {
    // 模板变量赋值
    $this->assign('name','凯');
    $this->assign('qq','2633990932');
    // 或者批量赋值
    $this->assign([
        'name' => '凯',
        'qq' => '2633990932'
    ]);
    // 模板输出
    //这时候只需要在view目录下的demo目录下的对应的html网页里面直接输入本控制器的变量就可以看见值啦,比如{$name},{$qq}
    return $this->fetch('index');
}
}

模板布局

1.打开全局模板配置:config/template.php

2.添加如下信息:

return [
    'layout_on' => true,
    'layout_name' => 'layout',
]

此时模板渲染路径就会出现变化,在不开启layout_on布局模板之前,会直接渲染application/index/view/user/add.html模板文件,开启之后,首先会渲染application/index/view/layout.html 模板

thinkphp5.1大致内容如上,还有很多细节没有展现出来,打算之后在用thinkphp框架时再创建一个文档用来记录更多的细节问题。

你可能感兴趣的:(TP5.1初学)