zoukankan      html  css  js  c++  java
  • 在phpstudy中安装并使用ThinkPHP 5

     
     
    最近在慕课网学习 thinkphp,由于教师使用的是 MAC下的 MAMP 环境,而我使用的是 win7 的 phpstudy,区别不大,记录在这里,方便查询。
     
    不同系统集成环境安装:
    mac 安装MAMP
    windows 安装phpstudy
     
     
    我最近在用 mac 机,但是还没有使用过 MAMP ,因此先尝试使用 phpstudy 来学习,后续追加 MAMP 的方法。
     
    phpstudy安装ThinkPHP步骤:
    1. 进入ThinkPHP官网,下载完整版本:http://www.thinkphp.cn/
    2. 解压出下载的 ThinkPHP 复制所有文件
    3. 在 phpstudy 安装路径下的找到 www 文件夹,新建 tp5 文件夹,将解压的所有 ThinkPHP 文件粘贴到tp5中
    4. 重启 phpstudy
    5. 在浏览器中输入 http://localhost/tp5/public/
    6. 显示为 “ ThinkPHP V5
      十年磨一剑 - 为API开发设计的高性能框架”即为安装成功
    ThinkPHP 规范:
    1. 所有的目录要使用小写+下划线
    2. 函数文件名必须以 .php 结尾
    3. 命名空间 namespace 必须和目录路径一致:  <? php namespace appindexcontroller 
    4. 类库名必须和文件名保持一致,首字母必须大写,采用驼峰式书写:文件名为 Index.php 那么类库名必须为 class Index {...}
    5. 函数名必须为首字母小写,采用驼峰书写格式: pubilc function getUserName(){...}
    6. 变量名首字母小写,采用驼峰书写格式:public $userName = '';
    7. 构造函数名以双下载线+小写字母,这种文件尽量不用:public function __controll(){...}
    8. 常量必须全部大写并且以下划线连接:define('APP_STATE','dev');
    9. 所有配置名必须全部小写并且以下载线连接:'app_namespace' => 'app',
    10. 数据库或表名必须以小写字母加下载线连接,不能出现驼峰或首字母大写:user_name
    11. 顶及命名空间(目录)统一叫 app,形成良好的开发方式:namespace appindexcontroller  从命名空间来看这个路径就是目录的路径
     
    ThinkPHP 模块的建立:
    1. 将 application 文件夹名称更改为 app。可以此文件夹下新建各种模块,比如首页(index)、登录管理(admin)、用户管理(user)等
    2. 建立首页(index)为例,路径为:appindexcontrollerIndex.php(意为index模块的控制器controller下的Index.php 文件)
    3. 建立方法  1)定义模块的命名空间 namespace appindexcontroller;  2)定义类名 class Index {...}  3) 写方法 public function index(){...}
    4. 修改 public/index.php 路径,指向目录app,也就是入口路径 
      define('APP_PATH', __DIR__ . '/app/');
    <?php
          //定义app命名空间
          namespace appindexcontroller;
    
          //定义类名,类名和文件名保持一致
          class Index {
                //编写一个方法
                public function index(){
                      return "This is PHP Class Name."
                }
          }
    ?>
    ThinkPHP 通过别名导入其它模块中的方法,别名是通过操作符 use 来实现的:
    1. 导入:use appcommoncontrollerUser as commonUser;导入app模块名称controller文件名称 as 别名(别名以模块名称+方法名称,驼峰组合)】
    2. 继承: class User extends commonUser { ... } 将导入的方法继承给当前类,在当前类中的方法中使用
    3. 使用: 直接在当前方法中使用继承过来的方法
    class User extends commonUser
    {
         public function demo(){
              //直接return 继承过来的方法 showName()
              return $this -> showName("kevin.chen");
         }
    }

    ThinkPHP 浏览器测试模块地址:

    http://serverName/index.php(或者其它应用入口文件)/模块/控制器/方法/[参数名/参数值...]

    http://localhost/tp5/public/index.php/index/index/test
     
    这里需要注意一点,phpstudy中的入口文件默认为 www目录下的index.php,tp5的入口文件为 public目录下的index.php。
    因为要测试 tp5 的模块,因此,需要把 tp5 的入口文件作为应用的入口文件,serverName 后面应该为 tp5 的入口文件而非 phpstudy 的入口文件路径,否则会报一个莫名其妙的 403 错误!
     
    以下图为例,当前为 phpstudy的入口:
    1. 当前服务器地址为 http://localhost
    2. 当前入口文件路径为  tp5/public/index.php
    3. 当前模块/控制器/方法为  index/index/test
     
    我的目录树为下图,用下图来看上面的路径会一目了然

    Index.php

    测试当前模块

    ThinkPHP 修改默认配置 ,修改convention.php 可以达到修改配置php的目的,但是尽量不要对这个配置作任何的改变,否则以后对这个框架进行任何的升级会带来意想不到的错误。

    1. 在 public/index.php 中新建一个常量  
      //定义配置文件目录
      define('CONF_PATH', __DIR__ . '/../conf/')
    2. 与app同级新建一个 conf 目录
    3. 在index 模块的文件 Index.php 中新建一个方法,起名为 testConfig 
      public function testConfig(){
          dump(config());
      }
    4. 浏览器中测试 http://localhost/tp5/public/index.php/index/index/testConfig  返回当前状态的所有配置,当前状态的配置来源于 thinkphp>convention.php
    5. 修改 convention.php ,添加
       //默认作者
       'app_author'    => 'kevin.chen', 刷新 url 即可看到 config 配置中已经添加一个 app_author 的数组

    ThinkPHP 应用配置,修改当前应用的配置可以替换当前 PHP 默认的配置信息。应用配置目录 conf,所有的关于应用配置都在这个目录下修改

     
    1. 在 app 下新建一个后台的模块 admincontrollerIndex.php
    2. public function showAdminConfig(){
          dump(config());
      };
    3. 在浏览器中输入http://localhost/tp5/public/index.php/admin/index/showAdminConfig 同样可以打印出 php的配置,但是我们是不要使用 php 框架的配置文件信息的,我们是要打印自己应用的配置信息,因此需要建立自己应用的 config.php 配置文件
    4. 同 app 同级建立一个 conf 的目录,在这个目录下建立一个 config.php 配置文件,这个配置文件中直接 return 一个数组,这个数组就是 当前应用的配置信息
            return [
                  "app_name"            => "my_anviz",
                  "app_author"          => "kevin.chen",
                  "app_email"           => "11452155@qq.com",
            ]
    5. 再次刷新 http://localhost/tp5/public/index.php/admin/index/showAdminConfig 就可以看到 打印的配置信息的尾部,增加了刚刚增加的数组。
    6. 说明应用配置信息是可以改变 PHP框架的配置信息的。如果想改变 php 的配置信息不可以修改convention.php文件,只需修改当前应用的配置信息即可改变 php 的配置信息。
    7. 比如想要修改 PHP中的调试模式为 true,只需在当前应用的配置文件中增加一条 
      app_debug => true 的配置信息即可改变原 php 的配置信息。
           return [
                  "app_name"            => "my_anviz",
                  "app_author"          => "kevin.chen",
                  "app_email"           => "11452155@qq.com",
                  "app_debug"           => true
            ]
     上面url刷新之后显示为
    ThinkPHP 请求
    所有的请求都会进入 publicindex.php ,再通过携带不同的参数而进入不同的控制器中,不同的控制器实现不同的操作,最终实现不同的功能,如:增、删、改
     
    ThinkPHP 隐藏请求入口文件
    比如:http://localhost/tp5/public/index.php/index/index/test,可以正常返回数据

    此时 index.php 就是入口文件,所有要访问控制器模块的方法必须要经过这个入口文件才能进入控制器模块,这样是不安全的。隐藏入口文件就是这个原因需要修改 Apache中的 httpd.conf 文件,以 phpstudy 为例:

    phpstudy 面板 -> 其它选项菜单 -> 打开配置文件 -> httpd.conf
      ·
    第一步:搜索 rewrite ,将 LoadModule rewrite_module modules/mod_rewrite.so 这句打开

     第二步,找到网站根目录,DocumentRoot  "E:softphpstudy2018PHPTutorialWWW",将 AllowOverride 设置为 All

    第三步,重启 phpstudy
     
    这里我们在浏览器中重新输入去掉入口文件的请求地址:http://localhost/tp5/public/index/index/test  可以看到返回正确的数据
    此时,隐藏请求入口文件成功!
     
    如果以上文件配置不成功,必须要在请求地址中添加入口文件才可以请求成功!
     
    ThinkPHP 绑定特殊的入口文件
    比如开放给第三方人员时,只能让第三方访问特殊的入口文件
     
    以 api.php 为例方法为:
    第一步:在 入口目录中新建一个 api.php 入口文件,仿照默认入口文件中写它的目标常量配置。
    1. 定义应用目录入口
    2. 定义配置文件目录入口
    3. 加载框架引导文件

    第二步,打开 thinkphp 框架的配置文件 convention.php 找到  auto_bind_module 这个入口自动绑定模块的配置信息

    将它复制到 我们应用的配置文件中 appconfconfig.php 中,将默认值改为 true

    第三步,在我们的应用中新建一个提供给第三方的模块,appaipcontrollerApi.php

    此时,我们访问为第三方配置的接口为:http://localhost/tp5/public/api/api/testApi
     
    正常显示为:

     思考:如果我们有多个入口文件,路径相同,指向应用相同,入口文件对应应用中的模块,只要在写 url 请求时 ,更改应用的模块名就可以访问不同的模块。是这样吗?

     ThinkPHP 是个单入口框架,所有的入口都会进入 index.php 文件,通过 index.php来接收所有的http请求,请求中的所有参数都可以通过 Request 这个对象进行接收和处理。

    下面就写 thinkPHP 的 Request 这个对象是怎么对请求进行处理的,首先要知道如何获取 request 这个对象的?

    <?php
               namespace appindexcontroller;
               use think
    equest;  //Request 对象要从think
    equest 中获取
               class Index
               {
                     //注入对象的方式
                     public function index(Request $request){
                           dump($request);
                     }
               }
    ?>

    #如果想了解更加详细的 $request 的方法,就去 ThinkPHP/library/think/Request.php 中查看所有的方法

    以下列举了常用的对参数获取的方法:

    <?php
        namespace appindexcontroller;
        use think
    equest;
        
        class Index
        {
            
            public function getRequest(Request $request){
                     #获取浏览器的值
                     #如果当前请求地址为:http://localhost/tp5/public/index/index/getRequest
    
    dump($request -> domain());        //获取浏览器的域名,返回为 "http://localhost"
    dump($request -> pathinfo());      //获取参数前的所有的路径,返回为 "index/index/getRequest"
    dump($request -> path());          //获取不含文件后缀的路径,如果没有后缀,pathinfo()同path()返回的对象是一样的,返回为 "index/index/getRequest"
    
                      #判断请求类型
                      #如果当前请求地址为:http://localhost/tp5/public/index/index/getRequest?id=5
                      
    dump($request -> method());        //返回为 "GET" ,在web开发中一般只有GET与POST 两种请求类型
    dump($request -> isGet());         //判断当前请求是否为GET,返回为一个布尔值为true = bool(true)
    dump($request -> isPost());        //判断是否为post请求,返回应该 为false
    dump($request -> isAjax());        //判断当前请求是否为 Ajax 请求,返回应该 为false
    
                      #获取请求参数
                      #如果当前请求地址为:http://localhost/tp5/public/index/index/getRequest?id=5&page=10
                      
    dump($request -> get());           //获取当前的get ?后的参数,返回key为id,value为5: ["id"] => string(1) "5"
    dump($request -> param());         //获取当前的get ?前的参数,返回key为id,value为5: ["id"] => string(1) "5"
    dump($request -> post());          //获取当前 post 的值,当前url是个get请求,因此只会返回一个空的数组 array(0) {}
    
    
                      #测试session,获取当前浏览器的 session 的值,如果没有只会返回一个空的数组 array(0) {}
                      #1、如果想要在浏览器中打印出来,需要进入thinkphp/convention.php,复制session配置到当前应用的config.php中
                      #2、需要使用助手方法给session,set一个值
    
    session('name','kevin.chen');             //设置 session 的值
    dump($request -> session());              //返回一个数组 array(1) {["name"] => string(10) "kevin.chen"}
    
                      #测试 cookie,首先需要set一个值
    cookie('email','don-pan.cwf@163.com');    //设置cookie的值
    dump($request -> cookie());               //获取 cookie的值,会返回一个 PHPSESSID 的值
    
    
                      #获取某个参数的值
                      #如果当前请求地址为:http://localhost/tp5/public/index/index/getRequest?id=5&page=10
                      #在查询时通常使用通过某个 id 来查询等
                      
    dump($request -> get('id'));               //返回 "5"
    dump($request -> cookie('email'));         //返回 "don-pan.cwf@163.com"
    dump($request -> post("id"));              //不存在的id,返回为null
    dump($request -> param("page"));           //返回为 "10"
    
    
    
                     #获取当前的模块 控制器 方法
                     #如果当前请求地址为:http://localhost/tp5/public/index/index/getRequest?id=5&page=10
                     #在编写权限控制时,通过这三个选项共同来验证是否有权限访问
                      
    dump($request -> module());                //返回当前模块名为 index
    dump($request -> controller());            //返回当前控制器名为 Index (首字母大写)
    dump($request -> action());                //返回当前方法名为 getRequest
    
    
    
                     #获取当前 url
                     #如果当前请求地址为:http://localhost/tp5/public/index/index/getRequest?id=5&page=10
                      
    dump($request -> url());                   //返回 "/tp5/public/index/index/getRequest?id=5&page=10"
    dump($request -> baseUrl());               //返回不包含参数的url"/tp5/public/index/index/getRequest"
    
                    }
             }
    ?>        

     ThinkPHP 连接数据库,并查询表

    第一步,要新建数据库,phpMyAdmin,使用它来建库建表

    第二步,数据库必须与PHP进行配置,才可以使用PHP来调用数据库,操作数据库

    数据库配置路径为:

    1. 找到 thinkPHP -> convention.php ,找到 数据库设置【database】这个数组
    2. 在当前应用的 conf 目录下,新建一下 database.php 文件
    3. 将 database 里面的key,value复制到新建的 database.php 当中,分别对 数据库中的 key 设置它的 value(配置红色注释部分
    4. 将这个数组 return 返回
    <?php
        //数据库配置
        use	hinkEnv;
        
        return  [
            // 数据库类型
            'type'            => 'mysql',
            // 数据库连接DSN配置
            'dsn'             => '',
            // 服务器地址
            'hostname'        => '127.0.0.1',
            // 数据库名
            'database'        => 'test',
            // 数据库用户名
            'username'        => 'root',
            // 数据库密码
            'password'        => 'root',
            // 数据库连接端口
            'hostport'        => '3306',
            // 数据库连接参数
            'params'          => [],
            // 数据库编码默认采用utf8
            'charset'         => 'utf8',
            // 数据库表前缀
            'prefix'          => ''
        ]
    ?>

    第三步,配置好数据库之后,就可以对数据库进行操作了

    在当前模块下新建一个方法,取名为 testDataBase

    # 首先要加载 thinkphp 的db 方法
    # 再用 db 的助手方法查询表
    
    <?php
        namespace appindexcontroller;
        use thinkDb;
        
        class Index
        {
              #测试数据库是否连接成功
              public function testDataBase(){
                  $res = db('user') -> find();
                  dump($res);
              }
            }    
    ?>    

    我们在浏览器中输入如下 url ,就可以看到查询的表数据了:

    http://localhost/tp5/public/index/index/testDataBase

    array(3) {
      ["user_id"] => int(1)
      ["user_name"] => string(10) "kevin.chen"
      ["user_age"] => string(2) "34"
    }

    返回3个字段,每个字段的 key,数据类型,value


     
     
     
     
    ThinkPHP 目录说明:
     
    project  应用部署目录
    ├─application             应用目录(可设置),所有的应用都写在这里,经常使用
    │  ├─common                                        公共模块目录(可更改)
    │  ├─index(MVC)主要页面部分的逻辑              模块目录(可更改)
    │  │  ├─config.php       模块配置文件
    │  │  ├─common.php       模块函数文件
    │  │  ├─controller       控制器目录
    │  │  ├─model           模型目录
    │  │  ├─view            视图目录
    │  │  └─ ...            更多类库目录
    │   ├─admin(后台的逻辑,对应index模块)      
    │  ├─command.php                         php配置文件
    │  ├─common.php         php的公共函数,可以写在这里,任何地方都可以调用,应用公共(函数)文件
    │  ├─config.php                               php应用的配置文件,整个应用都读取这个文件,应用(公共)配置文件
    │  ├─database.php                          数据库配置文件,连接数据库的方法,需要修改这个文件
    │  ├─tags.php          是对 ThinkPHP 框架进行扩展而不需要修改源码
    │  └─route.php                                 路由配置文件,对url进行伪装美化,可以修改这个文件
    ├─extend               加载第三方库时使用,直接将类库下载到这个目录
    ├─public                                          网站根目录,所有网站的文件都要放在这个目录下,WEB 部署目录(对外访问目录)
    │  ├─static           静态资源存放目录(css,js,image)
    │  ├─index.php                                 网站的入口文件,应用入口文件
    │  ├─router.php                                更改url地址文件
      ├─robots.txt         搜索引擎爬虫定义规则
    │  └─.htaccess         用于 apache 的重写
    ├─runtime                                        网站运行中的缓冲文件,包含日志,缓存,编译文件等
    ├─vendor               第三方类库目录(Composer)
    ├─thinkphp             框架系统目录
    │  ├─lang             语言包目录
    │  ├─library           框架核心类库目录
    │  │  ├─think         框架的核心文件,Think 类库包目录
    │  │  └─traits         系统 Traits 目录
    │  ├─tpl              框架默认的一些模板,系统模板目录
    │  ├─.htaccess          用于 apache 的重写
    │  ├─.travis.yml        CI 定义文件
    │  ├─base.php           定义一些常量,基础定义文件
    │  ├─composer.json       composer 定义文件,配置文件
    │  ├─console.php        控制台入口文件
    │  ├─convention.php      框架默认的配置文件,惯例配置文件
    │  ├─helper.php         助手函数文件(可选)
    │  ├─LICENSE.txt        授权说明文件
    │  ├─phpunit.xml        单元测试配置文件
    │  ├─README.md          README 文件
    │  └─start.php          框架引导启动文件
    ├─build.php             自动生成定义文件(参考)
    ├─composer.json          composer 定义文件
    ├─LICENSE.txt           授权说明文件
    ├─README.md             README 文件
    ├─think                 命令行入口文件
     
  • 相关阅读:
    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介
    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学
    001 Android Studio 首次编译执行项目过程中遇到的几个常见问题
    Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
    Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
    监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
    轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
    轻量级ORM框架——第一篇:Dapper快速学习
    CF888G Xor-MST(异或生成树模板)
  • 原文地址:https://www.cnblogs.com/baiyygynui/p/8463715.html
Copyright © 2011-2022 走看看