• thinkphp5基础


    前面的话

      ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。遵循Apache2开源许可协议发布,意味着可以免费使用ThinkPHP,甚至允许把基于ThinkPHP开发的应用开源或商业产品发布/销售。ThinkPHP5.0版本是一个颠覆和重构版本,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构,不适合原有3.2项目的升级,但绝对是新项目的首选

    目录结构

      thinkphp5安装完成后,初始目录结构如下所示

    www  WEB部署目录(或者子目录)
    ├─application           应用目录
    │  ├─common             公共模块目录(可以更改)
    │  ├─module_name        模块目录
    │  │  ├─config.php      模块配置文件
    │  │  ├─common.php      模块函数文件
    │  │  ├─controller      控制器目录
    │  │  ├─model           模型目录
    │  │  ├─view            视图目录
    │  │  └─ ...            更多类库目录
    │  │
    │  ├─command.php        命令行工具配置文件
    │  ├─common.php         公共函数文件
    │  ├─config.php         公共配置文件
    │  ├─route.php          路由配置文件
    │  ├─tags.php           应用行为扩展定义文件
    │  └─database.php       数据库配置文件
    │
    ├─public                WEB目录(对外访问目录)
    │  ├─index.php          入口文件
    │  ├─router.php         快速测试文件
    │  └─.htaccess          用于apache的重写
    │
    ├─thinkphp              框架系统目录
    │  ├─lang               语言文件目录
    │  ├─library            框架类库目录
    │  │  ├─think           Think类库包目录
    │  │  └─traits          系统Trait目录
    │  │
    │  ├─tpl                系统模板目录
    │  ├─base.php           基础定义文件
    │  ├─console.php        控制台入口文件
    │  ├─convention.php     框架惯例配置文件
    │  ├─helper.php         助手函数文件
    │  ├─phpunit.xml        phpunit配置文件
    │  └─start.php          框架入口文件
    │
    ├─extend                扩展类库目录
    ├─runtime               应用的运行时目录(可写,可定制)
    ├─vendor                第三方类库目录(Composer依赖库)
    ├─build.php             自动生成定义文件(参考)
    ├─composer.json         composer 定义文件
    ├─LICENSE.txt           授权说明文件
    ├─README.md             README 文件
    ├─think                 命令行入口文件

    开发规范

    【目录和文件】

      1、目录不强制规范,驼峰和小写+下划线模式均支持

      2、类库、函数文件统一以.php为后缀

      3、类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致

      4、类名和类文件名保持一致,统一采用驼峰法命名(首字母大写)

    【函数和类、属性命名】

      1、类的命名采用驼峰法,并且首字母大写,例如 UserUserType,默认不需要添加后缀,例如UserController应该直接命名为User

      2、函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip

      3、方法的命名使用驼峰法,并且首字母小写,例如 getUserName

      4、属性的命名使用驼峰法,并且首字母小写,例如 tableNameinstance

      5、以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload

    【常量和配置】

      1、常量以大写字母和下划线命名,例如 APP_PATH和 THINK_PATH

      2、配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert

    【数据表和字段】

      1、数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表字段命名

    常见概念

      ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织。下面是一些常见概念

    【入口文件】

      用户请求的PHP文件,负责处理一个请求(注意,不一定是URL请求)的生命周期,最常见的入口文件就是index.php,有时候也会为了某些特殊的需求而增加新的入口文件,例如给后台模块单独设置的一个入口文件admin.php或者一个控制器程序入口think都属于入口文件

    【应用】

      应用在ThinkPHP中是一个管理系统架构及生命周期的对象,由系统的  hinkApp类完成,应用通常在入口文件中被调用和执行,具有相同的应用目录(APP_PATH)的应用我们认为是同一个应用,但一个应用可能存在多个入口文件。应用具有自己独立的配置文件、公共(函数)文件

    【模块】

      一个典型的应用是由多个模块组成的,这些模块通常都是应用目录下面的一个子目录,每个模块都有自己独立的配置文件、公共文件和类库文件

    【控制器】

      每个模块拥有独立的MVC类库及配置文件,一个模块下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的控制器类。

      控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。严格来说,控制器不应该过多的介入业务逻辑处理

      一个典型的Index控制器类如下:

    namespace appindexcontroller;
    class Index 
    {
        public function index()
        {
            return 'hello,thinkphp!';
        }
    }

    【操作】

      一个控制器包含多个操作(方法),操作方法是一个URL访问的最小单元。

      下面是一个典型的Index控制器的操作方法定义,包含了两个操作方法:

    namespace appindexcontroller;
    class Index 
    {
        public function index()
        {
            return 'index';
        }
        public function hello($name)
        {
            return 'Hello,'.$name;
        }
    }

      操作方法可以不使用任何参数,如果定义了一个非可选参数,则该参数必须通过用户请求传入,如果是URL请求,则通常是$_GET或者$_POST方式传入

    【模型】

      模型类通常完成实际的业务逻辑和数据封装,并返回和格式无关的数据

    【视图】

      控制器调用模型类后返回的数据通过视图组装成不同格式的输出。视图根据不同的需求,来决定调用模板引擎进行内容解析后输出还是直接输出。

      视图通常会有一系列的模板文件对应不同的控制器和操作方法,并且支持动态设置模板目录

    【驱动】

      系统很多的组件都采用驱动式设计,从而可以更灵活的扩展,驱动类的位置默认是放入核心类库目录下面,也可以重新定义驱动类库的命名空间而改变驱动的文件位置

    【行为】

      行为(Behavior)是在预先定义好的一个应用位置执行的一些操作。类似于AOP编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类AOP编程的思想。所以,行为通常是和某个位置相关,行为的执行时间依赖于绑定到了哪个位置上。

      要执行行为,首先要在应用程序中进行行为侦听,例如:

    // 在app_init位置侦听行为
    	hinkHook::listen('app_init');

      然后对某个位置进行行为绑定:

    // 绑定行为到app_init位置
    	hinkHook::add('app_init','appindexehaviorTest');

      一个位置上如果绑定了多个行为的,按照绑定的顺序依次执行,除非遇到中断

    【命名空间】

      ThinkPHP5采用了PHP的命名空间进行类库文件的设计和规划,并且符合PSR-4的自动加载规范、

    入口文件

      ThinkPHP5.0版本的默认自带的入口文件位于public/index.php(实际部署的时候public目录为应用对外访问目录),入口文件内容如下:

    // 定义应用目录
    define('APP_PATH', __DIR__ . '/../application/');
    // 加载框架引导文件
    require __DIR__ . '/../thinkphp/start.php';

      这段代码的作用就是定义应用目录APP_PATH和加载ThinkPHP框架的入口文件,这是所有基于ThinkPHP开发应用的第一步

      官方提供的默认应用的实际目录结构和说明如下:

    ├─application           应用目录(可设置)
    │  ├─index              模块目录(可更改)
    │  │  ├─config.php      模块配置文件
    │  │  ├─common.php      模块公共文件
    │  │  ├─controller      控制器目录
    │  │  ├─model           模型目录
    │  │  └─view            视图目录
    │  │
    │  ├─command.php        命令行工具配置文件
    │  ├─common.php         应用公共文件
    │  ├─config.php         应用配置文件
    │  ├─tags.php           应用行为扩展定义文件
    │  ├─database.php       数据库配置文件
    │  └─route.php          路由配置文件

      5.0版本采用模块化的设计架构,默认的应用目录下面只有一个index模块目录,如果要添加新的模块可以使用控制台命令来生成。

      切换到命令行模式下,进入到应用根目录并执行如下指令:

    php think build --module demo

      就会生成一个默认的demo模块,包括如下目录结构:

    ├─demo   
    │  ├─controller      控制器目录
    │  ├─model           模型目录
    │  ├─view            视图目录
    │  ├─config.php      模块配置文件
    │  └─common.php      模块公共文件

      同时也会生成一个默认的Index控制器文件

    资源访问

      网站的资源文件访问不会影响正常的操作访问,只有当访问的资源文件不存在的时候才会解析到入口文件,一般就会提示模块不存在的错误。

      网站的资源文件一般放入public目录的子目录下面,例如下面是一个建议规范:

    public
    ├─index.php       应用入口文件
    ├─static                静态资源目录   
    │  ├─css      样式目录
    │  ├─js         脚本目录
    │  └─img      图像目录

      访问资源文件的URL路径是:

    http://tp5.com/static/css/style.css
    http://tp5.com/static/js/common.js
    http://tp5.com/static/img/picture.jpg

      如果没有设置域名绑定,而是使用子目录方式访问的话,那么可能的资源访问地址是:

    http://localhost/public/static/css/style.css
    http://localhost/public/static/js/common.js
    http://localhost/public/static/img/picture.jpg

    调试模式

      ThinkPHP支持调试模式,默认情况下是开启状态(5.0.10+版本开始,默认关闭调试模式,需要自己开启)。调试模式以除错方便优先,而且在异常的时候可以显示尽可能多的信息,所以对性能有一定的影响。

      强烈建议开发者在使用ThinkPHP开发的过程中使用调试模式,5.0默认情况下可以捕获到任何细微的错误并抛出异常,这样可以更好的获取错误提示和避免一些问题和隐患,不要畏惧错误,要勇敢面对,并消除隐患。

      开发完成后,实际进行项目部署的时候,修改应用配置文件(application/config.php)中的app_debug配置参数:

    // 关闭调试模式
    'app_debug' =>  false,

    控制器

      找到index模块的Index控制器(文件位于application/index/controller/Index.php 注意大小写),把Index控制器类的index方法修改为Hello,World!

    <?php
    namespace appindexcontroller;
    class Index
    {
        public function index()
        {
            return 'Hello,World!';
        }
    }

      访问URL地址时,就会看到Hello,World!的输出结果

      如果要访问一个驼峰命名的控制器,例如我们把上面的例子改成一个HelloWorld控制器

    <?php
    namespace appindexcontroller;
    class HelloWorld
    {
        public function index($name = 'World')
        {
            return 'Hello,' . $name . '';
        }
    }

      默认情况下正确的方法是使用下面的URL进行访问

    http://tp5.com/index.php/index/hello_world

      下面的访问地址是错误的

    http://tp5.com/index.php/index/HelloWorld

      因为默认的URL访问是不区分大小写的,全部都会转换为小写的控制器名,除非在应用配置文件中,设置了关闭url自动转换如下:

    'url_convert' => false,

      那么就可以正常访问

    http://tp5.com/index.php/index/HelloWorld

      如果要继承一个公共的控制器类,可以使用:

    <?php
    
    namespace appindexcontroller;
    
    use appindexcontrollerBase;
    
    class Index extends Base
    {
        public function index()
        {
            return 'Hello,World!';
        }
    }

      可以为操作方法定义参数,例如:

    <?php
    
    namespace appindexcontroller;
    
    class Index
    {
        public function index($name = 'World')
        {
            return 'Hello,' . $name . '';
        }
    }

      当带name参数访问入口文件地址(例如 http://tp5.com?name=ThinkPHP)的时候,在浏览器中可以看到如下输出:

    Hello,ThinkPHP!

      控制器类可以包括多个操作方法,但如果操作方法是protected或者private类型的话,是无法直接通过URL访问到该操作的,也就是说只有public类型的操作方法才是可以通过URL访问的。

      下面来验证下,把Index控制器类的方法修改为:

    <?php
    namespace appindexcontroller;
    
    class Index
    {
        public function hello()
        {
            return 'hello,thinkphp!';
        }
    
        public function test()
        {
            return '这是一个测试方法!';
        }
    
        protected function hello2()
        {
            return '只是protected方法!';
        }
    
        private function hello3()
        {
            return '这是private方法!';
        }
    }

      当我们访问如下URL地址的时候,前面两个是正常访问,后面两个则会显示异常

    http://tp5.com/index.php/index/index/hello
    http://tp5.com/index.php/index/index/test
    http://tp5.com/index.php/index/index/hello2
    http://tp5.com/index.php/index/index/hello3

    视图

      现在我们在给控制器添加视图文件功能,我们在application/index目录下面创建一个view目录,然后添加模板文件view/index/hello.html(注意大小写),我们添加模板内容如下:

    <html>
    <head>
    <title>hello {$name}</title>
    </head>
    <body>
        hello, {$name}!
    </body>
    </html>

      要输出视图,必须在控制器方法中进行模板渲染输出操作,现在修改控制器类如下:

    <?php
    namespace appindexcontroller;
    
    use thinkController;
    
    class Index extends Controller
    {
        public function hello($name = 'thinkphp')
        {
            $this->assign('name', $name);
            return $this->fetch();
        }
    }

      [注意]如果没有使用use thinkController;就必须使用class Index extends hinkController

      Index控制器类继承了 thinkController类之后,我们可以直接使用封装好的assignfetch方法进行模板变量赋值和渲染输出。

      fetch方法中我们没有指定任何模板,所以按照系统默认的规则(视图目录/控制器/操作方法)输出了view/index/hello.html模板文件。

      接下来,我们在浏览器访问

    http://tp5.com/index.php/index/index/hello

      输出:

    hello,thinkphp!

    读取数据

      在开始之前,我们首先在数据库demo中创建一个think_data数据表(这里以mysql数据库为例):

    CREATE TABLE IF NOT EXISTS `think_data`(
        `id` int(8) unsigned NOT NULL AUTO_INCREMENT,
        `data` varchar(255) NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
    
    INSERT INTO `think_data`(`id`,`data`) VALUES
    (1,'thinkphp'),
    (2,'php'),
    (3,'framework');

      首先我们需要在应用的数据库配置文件application/database.php中添加数据库的连接信息如下:

    return [
        // 数据库类型
        'type'        => 'mysql',
        // 服务器地址
        'hostname'    => '127.0.0.1',
        // 数据库名
        'database'    => 'demo',
        // 数据库用户名
        'username'    => 'root',
        // 数据库密码
        'password'    => '',
        // 数据库连接端口
        'hostport'    => '',
        // 数据库连接参数
        'params'      => [],
        // 数据库编码默认采用utf8
        'charset'     => 'utf8',
        // 数据库表前缀
        'prefix'      => 'think_',
        // 数据库调试模式
        'debug'       => true,
    ];

      接下来,我们修改下控制器方法,添加读取数据的代码:

    <?php
    namespace appindexcontroller;
    
    use thinkController;
    use thinkDb;
    
    class Index extends Controller
    {
        public function index()
        {
            $data = Db::name('data')->find();
            $this->assign('result', $data);
            return $this->fetch();
        }
    }

      定义好控制器后,我们修改模板文件,添加数据输出标签如下:

    <html>
    <head>
    <title></title>
    </head>
    <body>
    {$result.id}--{$result.data}
    </body>
    </html>

      模板标签的用法和Smarty类似,就是用于输出数据的字段,这里就表示输出think_data表的iddata字段的值。

      我们访问会输出:

    1--thinkphp
  • 相关阅读:
    也谈谈关于WEB的感想
    spring boot,https,双向ssl认证
    Spring Cloud Gateway(二)
    Spring Cloud Gateway(一)
    .Net Web Service 自定义返回值命名
    随便记一下,C#并行环境操作Winform的代码段
    随便记一下,解决Windows Server 2012无法远程登录的方法
    记录C#控件DataGridView绑定BindingList无法排序问题(转)
    记录SQL Server 2019链接Oracle 11g R2的过程
    Json CPP 中文支持与入门示例
  • 原文地址:https://www.cnblogs.com/xiaohuochai/p/8107815.html
Copyright © 2020-2023  润新知