当前位置: 澳门新濠3559 > 服务器运维 > 正文

对应用的所有请求都定向到应用的入口文件,T

时间:2019-11-08 22:07来源:服务器运维
ThinkPHP5的安装使用/tp5快速入门,thinkphp5tp5 点击进入视频教程 前面的话 本文实例讲述了thinkPHP5.0框架模块设计。分享给大家供大家参考,具体如下: 一、 ThinkPHP的认识: 说明 本手记是

ThinkPHP5的安装使用/tp5快速入门,thinkphp5tp5


点击进入视频教程


前面的话

本文实例讲述了thinkPHP5.0框架模块设计。分享给大家供大家参考,具体如下:

一、ThinkPHP的认识:

说明

本手记是在thinkPHP5.0.1的基础上的手记。因为ThinkPHP5的小版本的更新比较快,所以5.0.0和5.0.1的差别还是有点儿大,比如5.0.0的部分功能在后续版本中会废弃或者改变使用方法等。所以在看本手记时需要保证你所使用的ThinkPHP的版本为5.0.1,本记录的流程非框架学习的一般流程,是以有框架使用经验的程序员快速掌握并使用为目的而编写的。会从如何快速开始一个框架的使用开始到框架的深入说明层层递进。

本文将详细介绍thinkphp5URL和路由

5.0版本对模块的功能做了灵活设计,默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以app作为根命名空间(可配置更改)。

ThinkPHP是一个快速、简单的基于MVC和面向对象的轻量级PHP开发框架。

ThinkPHP5框架的说明

ThinkPHP5在国内是一个非常流行的框架,虽然项目发布的时间不算长。关于ThinkPHP要从之前的ThinkPHP3.2.3说起,ThinkPHP3.2.3是非常非常流行的一个php框架,也是非常简单的一个框架,随着时间的推移像比较流行的PHP框架(Laravel,yii2等)都的设计思想被不断的推崇,ThinkPHP3.2.3的不足也暴露的非常明显,ThinkPHP5的诞生是完全的改变了3.2.3版本的设计思想,更好的向着Yii2和Laravel靠近,这也表现了国产框架向着精品发展的决心。
在ThinkPHP5中引入了一些PHP的新特性,比如trait等,而且ThinkPHP可以支持xml或者json格式数据的响应,对于ajax请求直接将数据处理成json再返回,以及资源控制器,这体现出了作为api开发时的便利性。

URL访问

目录结构

二、下载后的目录结构:

ThinkPHP5框架的安装

ThinkPHP采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL参数中解析当前请求的模块、控制器和操作,下面是一个标准的URL访问格式:

标准的应用和模块目录结构如下:

├─ThinkPHP.php     框架入口文件

配置服务器运行框架

http://domainName/index.php/模块/控制器/操作

├─application           应用目录(可设置)
│  ├─common             公共模块目录(可选)
│  ├─common.php         公共函数文件
│  ├─route.php          路由配置文件
│  ├─database.php       数据库配置文件
│  ├─config.php         应用配置文件
│  ├─module1            模块1目录
│  │  ├─config.php      模块配置文件
│  │  ├─common.php      模块函数文件
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  └─ ...            更多类库目录
│  │
│  ├─module2            模块2目录
│  │  ├─config.php      模块配置文件
│  │  ├─common.php      模块函数文件
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  └─ ...            更多类库目录

 ├─Common 框架公共文件

配置虚拟主机:

在Nginx的vhosts的虚拟主机文件中配置server。将root配置为项目的public目录。并配置个server_name然后将域名映射到本地hosts文件中。

server { 
  listen 80;
  server_name local.tp5.com;
  access_log /data/wwwlogs/local.tp5.com_nginx.log combined;
  index index.html index.htm index.php;
  root /data/wwwroot/edutp5/public;

  if (!-e $request_filename) {
          rewrite  ^(.*)$  /index.php?s=/$1  last;
          break;
     }

   location ~ .php {
    #fastcgi_pass remote_php_ip:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    set $real_script_name $fastcgi_script_name;
    if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$") {
      set $real_script_name $1;
      #set $path_info $2;
    }
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    #fastcgi_param PATH_INFO $path_info;
  }

}

其中那个if判断是URL重写规则。为了省去URL中的index.php。配置完Nginx一定要重启Nginx服务

其中index.php就称之为应用的入口文件(注意入口文件可以被隐藏,后面会提到)

遵循ThinkPHP5.0的命名规范,模块目录全部采用小写和下划线命名。

 ├─Conf 框架配置文件

在hosts中添加URL映射:

打开系统中的hosts文件在其中添加如下一行并保存
127.0.0.1 local.tp5.com

模块在ThinkPHP中的概念其实就是应用目录下面的子目录,而官方的规范是目录名小写,因此模块全部采用小写命名,无论URL是否开启大小写转换,模块名都会强制小写

模块名称请避免使用PHP保留关键字(保留字列表参见 ),否则会造成系统错误。

 ├─Extend 框架扩展目录

运行框架:

在浏览器中输入local.tp5.com就可以访问到框架内容

应用的index模块的Index控制器定义如下:

其中common模块是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类库用于其他模块的继承。

 ├─Lang 核心语言包目录

认识目录找到MVC

edutp5 应用部署目录
├─application 应用目录(可设置)
│ ├─common 公共模块目录(可更改)
│ ├─index 模块目录(可更改)
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ └─ … 更多类库目录
│ ├─command.php 命令行工具配置文件
│ ├─common.php 应用公共(函数)文件
│ ├─config.php 应用(公共)配置文件
│ ├─database.php 数据库配置文件
│ ├─tags.php 应用行为扩展定义文件
│ └─route.php 路由配置文件
├─extend 扩展类库目录(可定义)
├─public WEB 部署目录(对外访问目录)
│ ├─static 静态资源存放目录(css,js,image)
│ ├─index.php 应用入口文件
│ ├─router.php 快速测试文件
│ └─.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 命令行入口文件

本目录结果是从thinkphp5官方文档中复制的,其中重点需要了解的目录为标位红色的目录及文件。

这儿需要重点注意的是application是应用目录我们的每一个应用可能是由多个模块构成的,例如本项目中的index是一个模块。在每一个模块中包含了完整的配置以及mvc结构。配置实在config.php中,关于配置文件的类型其实是可以自己定义的灵活使用json或者xml格式的配置。controller,model,view分别为控制器目录,模型目录,视图目录。

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

模块类库

 ├─Lib 核心类库目录

项目的访问

URL结构解释:

这个URL的含义为访问index模块下的index控制器中的test操作。在这个例子中我们知道URL的一般格式。其中index.php是可以省略了的。在Nginx的配置中如果是按照我的笔记中配置的那么已经写入了URL重写规则,在访问时不加index.php也是可以访问的。

可以改成:

那么对应的文件就是在edutp5/index/Index.php中的test操作了。如果自己新建了控制器也是按照这种访问的方式的 当然路由规则的定义以及路由的使用我们在后续说明定义了路由后请求的方式可能有所不同。


1


1

   

如果直接访问入口文件的话,由于URL中没有模块、控制器和操作,因此系统会访问默认模块(index)下面的默认控制器(Index)的默认操作(index),因此下面的访问是等效的:

一个模块下面的类库文件的命名空间统一以app模块名开头,例如:

 │  ├─Behavior 核心行为类库

查看评论

点击进入视频教程 说明 本手记是在thinkPHP5.0.1的基础上的手记。因为ThinkPHP5的小版本的更新比较...


// index模块的Index控制器类
appindexcontrollerIndex
// index模块的User模型类
appindexmodelUser

 │  ├─Core 核心基类库

如果要访问控制器的hello方法,则需要使用完整的URL地址

其中app可以通过定义的方式更改,例如我们在应用配置文件中修改:

 │  ├─Driver 内置驱动

'app_namespace' => 'application',

 │  │  ├─Cache 内置缓存驱动

访问URL地址后页面输出结果为:

那么,index模块的类库命名空间则变成:

 │  │  ├─Db 内置数据库驱动

Hello,thinkphp!

// index模块的Index控制器类
applicationindexcontrollerIndex
// index模块的User模型类
applicationindexmodelUser

 │  │  ├─TagLib 内置标签驱动

由于name参数为可选参数,因此也可以使用

更多的关于类库和命名空间的关系可以参考下一前面一篇《thinkPHP5.0框架命名空间详解》。

 │  │  └─Template 内置模板引擎驱动

模块和控制器隐藏

 │  └─Template 内置模板引擎

访问URL地址后页面输出结果为:

由于默认是采用多模块的支持,所以多个模块的情况下必须在URL地址中标识当前模块,如果只有一个模块的话,可以进行模块绑定,方法是应用的公共文件中添加如下代码:

 └─Tpl 系统模板目录

Hello,World!

// 绑定当前访问到index模块
thinkRoute::bind('index');

 

默认情况下,URL地址中的控制器和操作名是不区分大小写的,因此下面的访问其实是等效的:

绑定后,我们的URL访问地址则变成:

注意,框架的公共入口文件ThinkPHP.php是不能直接执行的,该文件只能在项目入口文件中调用才能正常运行。


]

三、入口文件:

如果控制器是驼峰的,例如定义一个HelloWorld控制器(application/index/controller/HelloWorld.php): 

访问的模块是index模块。

默认入口:public/index.php(实际部署的时候public目录为你的应用对外访问目录)。

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

如果你的应用比较简单,模块和控制器都只有一个,那么可以在应用公共文件中绑定模块和控制器,如下:

引入入口文件:

正确的URL访问地址(该地址可以使用url方法生成)应该是

// 绑定当前访问到index模块的index控制器
thinkRoute::bind('index/index');

<?php

设置后,我们的URL访问地址则变成:

require ‘/ThinkPHP框架所在目录/ThinkPHP.php’;

系统会自动定位到HelloWorld控制器类去操作

]

?>

如果使用

访问的模块是index模块,控制器是Index控制器。

访问路径:http://localhost/app/

单一模块

自动生成项目目录,目录结构如下:

将会报错,并提示Helloworld控制器类不存在

如果你的应用比较简单,只有唯一一个模块,那么可以进一步简化成使用单一模块结构,方法如下:

├─index.php     项目入口文件

如果希望严格区分大小写访问(这样就可以支持驼峰法进行控制器访问),可以在应用配置文件中设置:

首先在应用配置文件中定义:

 ├─Common 项目公共文件目录

// 关闭URL自动转换(支持驼峰访问控制器)
'url_convert' => false,
// 关闭多模块设计
'app_multi_module' => false,

 ├─Conf 项目配置目录

关闭URL自动转换之后,必须使用下面的URL地址访问(控制器名称必须严格使用控制器类的名称,不包含控制器后缀):

然后,调整应用目录的结构为如下:

 ├─Lang 项目语言目录


├─application        应用目录(可设置)
│  ├─controller      控制器目录
│  ├─model           模型目录
│  ├─view            视图目录
│  ├─ ...            更多类库目录
│  ├─common.php      函数文件
│  ├─route.php       路由配置文件
│  ├─database.php    数据库配置文件
│  └─config.php      配置文件

 ├─Lib 项目类库目录

如果服务器环境不支持pathinfo方式的URL访问,可以使用兼容方式,例如:

URL访问地址变成

 │  ├─Action Action类库目录

]

 │  ├─Behavior 行为类库目录

其中变量s的名称的可以配置的

同时,单一模块设计下的应用类库的命名空间也有所调整,例如:

 │  ├─Model 模型类库目录

5.0不再支持普通的URL访问方式,所以下面的访问是无效的,你会发现无论输入什么,访问的都是默认的控制器和操作

原来的

 │  └─Widget Widget类库目录

appindexcontrollerIndex
appindexmodelUser

 ├─Runtime 项目运行时目录

参数传入

变成

 │  ├─Cache 模板缓存目录

通过操作方法的参数绑定功能,可以实现自动获取URL的参数,仍然以上面的控制器为例,控制器代码如下:

appcontrollerIndex
appmodelUser

 │  ├─Data 数据缓存目录

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

更多的URL简化和定制还可以通过URL路由功能实现。

 │  ├─Logs 日志文件目录

当我们访问

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》、《smarty模板入门基础教程》及《PHP模板技术总结》。

 │  └─Temp 临时缓存目录

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

 └─Tpl 项目模板目录

就是访问appindexcontrollerIndex控制器类的hello方法,因为没有传入任何参数,name参数就使用默认值World。如果传入name参数,则使用:

您可能感兴趣的文章:

  • 浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
  • Thinkphp5.0自动生成模块及目录的方法详解
  • thinkPHP5.0框架安装教程
  • thinkPHP5.0框架命名空间详解
  • thinkPHP5.0框架配置格式、加载解析与读取方法
  • ThinkPHP5.0多个文件上传后找不到临时文件的修改方法

移动修改目录入口文件的路径:

 

页面输出结果为:

<?php

Hello,thinkphp!

define(‘APP_NAME’,’app’);

现在给hello方法增加第二个参数:

define(‘APP_PATH’,’./app/’);

public function hello($name = 'World', $city = '')
  {
    return 'Hello,' . $name . '! You come from ' . $city . '.';
  }

require ’/ThinkPHP框架所在目录/ThinkPHP.php’;

访问地址为

?>

页面输出结果为:

APP_NAME和APP_PATH分部用于定义项目名和项目目录,项目名通常就是指项目的目录名称。

Hello,thinkphp! You come from shanghai.

四、调试模式:

可以看到,hello方法会自动获取URL地址中的同名参数值作为方法的参数值,而且这个参数的传入顺序不受URL参数顺序的影响,例如下面的URL地址输出的结果和上面是一样的:

ThinkPHP的运行模式包括调试模式和部署模式,默认情况下是运行在部署模式下面。部署模式下面性能优先,并且尽可能少地抛出错误信息,调试模式则以除错方便优先,关闭任何缓存,而且尽可能多的抛出错误信息,所以对性能有一定的影响。

开启调试模式(开发完后关闭):

或者使用

<?php

还可以进一步对URL地址做简化,前提就是我们必须明确参数的顺序代表的变量,我们更改下URL参数的获取方式,把应用配置文件中的url_param_type参数的值修改如下:

define(‘APP_DEBUG’,TRUE);//开启调试模式

// 按照参数顺序获取
'url_param_type' => 1,

require ‘/ThinkPHP框架所在目录/ThinkPHP.php’;

现在,URL的参数传值方式就变成了严格按照操作方法的变量定义顺序来传值了,也就是说我们必须使用下面的URL地址访问才能正确传入name和city参数到hello方法:

?>

页面输出结果为:

关闭调试模式:

Hello,thinkphp! You come from shanghai.

define(‘APP_DEBUG’,false);

如果改变参数顺序为

 

页面输出结果为:

五、配置文件:

Hello,shanghai! You come from thinkphp.

配置文件位于每个项目目录的Conf/config.php,采用定义格式为php返回数组的方式。

显然不是我们预期的结果。

//项目配置文件

同样,我们试图通过

return array{

访问也不会得到正确的结果

‘配置参数’ => ‘配置值’,

[注意]按顺序绑定参数的话,操作方法的参数只能使用URL pathinfo变量,而不能使用get或者post变量

//更多配置参数

隐藏入口

//...

可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则。

};

以Apache为例,需要在入口文件的同级添加.htaccess文件(官方默认自带了该文件),内容如下

注意:

<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

配置值可以支持包括字符串、数字、布尔值和数组在内的数据,通常我们建议配置参数均使用大写定义。如果有需要,我们还可以为项目定义其他的配置文件。

如果用的phpstudy,规则如下:

六、使用控制器:

<IfModule mod_rewrite.c> 
Options +FollowSymlinks -Multiviews 
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] 
</IfModule>

控制器类的命名规范:模块名+Action.class.php(模块名采用驼峰法并且首字母大写)系统的默认模块是Index,对应的控制器就是项目目录下面的Lib/Action/IndexAction.class.php,类名和文件名一致。默认操作是index的一个public方法。

接下来就可以使用下面的URL地址访问了

澳门新濠3559,初次生成项目目录结构的时候,系统已经默认生成了一个默认控制器。


示例代码:

如果使用的apache版本使用上面的方式无法正常隐藏index.php,可以尝试使用下面的方式配置.htaccess文件:

class IndexAction extends Action {

<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>

Public function index(){

如果是Nginx环境的话,可以在Nginx.conf中添加:

Echo ‘hello,world’;

location / { // …..省略部分代码
  if (!-e $request_filename) {
    rewrite ^(.*)$ /index.php?s=/$1 last;
    break;
  }
}

}

定义路由

}

URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问。

注意:

我们在路由定义文件(application/route.php)里面添加一些路由规则,如下:

控制器必须继承Action类,一个模块可以包括多个操作方法。如果你的操作方法是protected或者private类型的话,是无法直接通过URL访问到该操作的。

return [
  // 添加路由规则 路由到 index控制器的hello操作方法
  'hello/:name' => 'index/index/hello',
];

 

该路由规则表示所有hello开头的并且带参数的访问都会路由到index控制器的hello操作方法。

七、URL请求

路由之前的URL访问地址为:

入口文件是项目的单一入口,对项目的所有请求都定向到项目的入口文件,系统会从URL参数中解析当前请求的模块和操作,我们之前访问的URL地址是没有任何参数,因此系统会访问默认模块(Index)的默认操作(index),因此下面的访问和之前是等效的:

定义路由后就只能访问下面的URL地址

http://localhost/app/index.php/Index/index

[注意]定义路由规则后,原来的URL地址将会失效,变成非法请求。

这种URL模式就是系统默认的PATHINFO模式,不同的URL模式获取模块和操作的方法不同。

但这里有一个小问题,如果我们只是访问

 

将发生错误

普通模式:也就是传统的GET传参方式来指定当前访问的模块和操作,例如:http://localhost/app/?m=module&a=action&var=value

事实上这是由于路由没有正确匹配到,我们修改路由规则如下:

M参数表示模块

return [
  // 路由参数name为可选
  'hello/[:name]' => 'index/hello',
];

A操作表示操作(模块和操作的URL参数名称是可以配置的),后面的表示其他GET参数。

使用[]把路由规则中的变量包起来,就表示该变量为可选,接下来就可以正常访问了

PATHINFO模式:

当name参数没有传入值的时候,hello方法的name参数有默认值World,所以输出的内容为 Hello,World!

是系统的默认URL模式,提供了最好的SEO支持,

除了路由配置文件中定义之外,还可以采用动态定义路由规则的方式定义,例如在路由配置文件(application/route.php)的开头直接添加下面的方法:

系统内部已经做了环境的兼容处理,所以能够支持大多数的主机环境。

use thinkRoute;
Route::rule('hello/:name', 'index/hello');

对应上面的URL模式,PATHINFO模式下面的URL访问地址是:

完成的效果和使用配置方式定义是一样的。

http://localhost/app/index.php/module/action/var/value/

无论是配置方式还是通过Route类的方法定义路由,都统一放到路由配置文件application/route.php文件中

Module(第一参数)表示模块,

[注意]路由配置不支持在模块配置文件中设置

Action(第二参数)表示操作,

【完整匹配】

 

前面定义的路由是只要以hello开头就能进行匹配,如果需要完整匹配,可以使用下面的定义:

可定制方式:例如通过下面的配置:

return [
  // 路由参数name为可选
  'hello/[:name]$' => 'index/hello',
];

'URL_PATHINFO_DEPR'=>'-', // 更改PATHINFO参数分隔符

当路由规则以$结尾的时候就表示当前路由规则需要完整匹配。

还可支持

当我们访问下面的URL地址的时候:

http://localhost/app/index.php/module-action-var-value/

// 正确匹配
// 正确匹配
// 不会匹配

的URL访问。

【闭包定义】

 

还支持通过定义闭包为某些特殊的场景定义路由规则,例如:

REWRITE模式:

return [
  // 定义闭包
  'hello/[:name]' => function ($name) {
    return 'Hello,' . $name . '!';
  },
];

是在PATHINFO模式的基础上添加了重写规则的支持,可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则。

或者

如果是Apache则需要在入口文件的同级添加.htaccess文件,内容如下:

use thinkRoute;
Route::rule('hello/:name', function ($name) {
  return 'Hello,' . $name . '!';
});

<IfModule mod_rewrite.c>

[注意]闭包函数的参数就是路由规则中定义的变量

RewriteEngine on

因此,当访问下面的URL地址:

RewriteCond %{REQUEST_FILENAME} !-d

会输出

REwriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

Hello,thinkphp!

</IfModule>

【设置URL分隔符】

下面的URL地址访问了:

如果需要改变URL地址中的pathinfo参数分隔符,只需要在应用配置文件(application/config.php)中设置:

http://localhost/app/module/action/var/value/

// 设置pathinfo分隔符
'pathinfo_depr'     => '-',

 

路由规则定义无需做任何改变,我们就可以访问下面的地址:

兼容模式:

【路由参数】

是用于不支持PATHINFO的特殊环境,URL地址是:

还可以约束路由规则的请求类型或者URL后缀之类的条件,例如:

http://localhost/app/?s=/module/action/var/value/

return [
  // 定义路由的请求类型和后缀
  'hello/[:name]' => ['index/hello', ['method' => 'get', 'ext' => 'html']],
];

兼容模式配合Web服务器重写规则的定义,可以达到和REWRITE模式一样的URL效果。

上面定义的路由规则限制了必须是get请求,而且后缀必须是html的,所以下面的访问地址:

 

// 无效
// 有效
// 无效
// 有效

八、视图

【变量规则】

ThinkPHP内置了一个编译型模板引擎,也支持原生的PHP模板,并且还提供了包括Smarty在内的模板引擎驱动。

接下来,尝试一些复杂的路由规则定义满足不同的路由变量。在此之前,首先增加一个控制器类如下:

和Smarty不同,ThinkPHP在渲染模板的时候如果不指定模板,则会采用系统默认的定位规则,其定义规范是TPL/模块名/操作名.html,所以,Index模块的index操作的默认模板文件位于项目目录下面的Tpl/Index/index.html。

<?php
namespace appindexcontroller;
class Blog
{
  public function get($id)
  {
    return '查看id=' . $id . '的内容';
  }
  public function read($name)
  {
    return '查看name=' . $name . '的内容';
  }
  public function archive($year, $month)
  {
    return '查看' . $year . '/' . $month . '的归档内容';
  }
}

例如:

添加如下路由规则:

<html>

return [
  'blog/:year/:month' => ['blog/archive', ['method' => 'get'], ['year' => 'd{4}', 'month' => 'd{2}']],
  'blog/:id'     => ['blog/get', ['method' => 'get'], ['id' => 'd+']],
  'blog/:name'    => ['blog/read', ['method' => 'get'], ['name' => 'w+']],
];

<head>

在上面的路由规则中,我们对变量进行的规则约束,变量规则使用正则表达式进行定义。

<title>hello {$name}</title>

我们看下几种URL访问的情况

</head>

// 访问id为5的内容

// 访问name为thinkphp的内容

// 访问2015年5月的归档内容

<body>

 【路由分组】

Hello,{$name}!

上面的三个路由规则由于都是blog打头,所以我们可以做如下的简化:

</body>

return [
  '[blog]' => [
    ':year/:month' => ['blog/archive', ['method' => 'get'], ['year' => 'd{4}', 'month' => 'd{2}']],  
    ':id'     => ['blog/get', ['method' => 'get'], ['id' => 'd+']],
    ':name'    => ['blog/read', ['method' => 'get'], ['name' => 'w+']],
  ],
];

</html>

对于这种定义方式,我们称之为路由分组,路由分组一定程度上可以提高路由检测的效率

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

【复杂路由】

Class IndexAction extends Action {

有时候,还需要对URL做一些特殊的定制,例如如果要同时支持下面的访问地址

public function index(){


$this->name = ‘thinkphp’;//进行模板变量赋值

我们只要稍微改变路由定义规则即可:

$this->display();

return [
  'blog/:id'      => ['blog/get', ['method' => 'get'], ['id' => 'd+']],
  'blog/:name'     => ['blog/read', ['method' => 'get'], ['name' => 'w+']],
  'blog-<year>-<month>' => ['blog/archive', ['method' => 'get'], ['year' => 'd{4}', 'month' => 'd{2}']],
];

}

对 blog-<year>-<month> 这样的非正常规范,我们需要使用<变量名>这样的变量定义方式,而不是 :变量名方式。

}

简单起见,我们还可以把变量规则统一定义,例如:

display方法中我们没有指定任何模板,所以按照系统默认的规则输出Index/index,html模板文件。

return [
  // 全局变量规则定义
  '__pattern__'     => [
    'name' => 'w+',
    'id'  => 'd+',
    'year' => 'd{4}',
    'month' => 'd{2}',
  ],
  // 路由规则定义
  'blog/:id'      => 'blog/get',
  'blog/:name'     => 'blog/read',
  'blog-<year>-<month>' => 'blog/archive',
];

接下来,我们在浏览器中输入:http://localhost/app/

在__pattern__中定义的变量规则我们称之为全局变量规则,在路由规则里面定义的变量规则我们称之为局部变量规则,如果一个变量同时定义了全局规则和局部规则的话,当前的局部规则会覆盖全局规则的,例如:

浏览器中会输出: hello,thinkPHP!

return [
  // 全局变量规则
  '__pattern__'     => [
    'name' => 'w+',
    'id'  => 'd+',
    'year' => 'd{4}',
    'month' => 'd{2}',
  ],

  'blog/:id'      => 'blog/get',
  // 定义了局部变量规则
  'blog/:name'     => ['blog/read', ['method' => 'get'], ['name' => 'w{5,}']],
  'blog-<year>-<month>' => 'blog/archive',
];

九、读取数据

URL生成

在开始之前,首先需在数据库thinkphp中创建一个think_data数据表(以mysql数据库为例):

定义路由规则之后,可以通过Url类来方便的生成实际的URL地址(路由地址),针对上面的路由规则,我们可以用下面的方式生成URL地址。

建表:

// 输出 blog/thinkphp
Url::build('blog/read', 'name=thinkphp');
Url::build('blog/read', ['name' => 'thinkphp']);
// 输出 blog/5
Url::build('blog/get', 'id=5');
Url::build('blog/get', ['id' => 5]);
// 输出 blog/2015/05
Url::build('blog/archive', 'year=2015&month=05');
Url::build('blog/archive', ['year' => '2015', 'month' => '05']);

CREATE TABLE IF NOT EXISTS ‘think_data’(

[注意]build方法的第一个参数使用路由定义中的完整路由地址

‘id’ int(8) unsigned NOT NULL AUTO_INCREMENT,

还可以使用系统提供的助手函数url来简化

‘data’ varchar(255) NOT NULL,

url('blog/read', 'name=thinkphp');
// 等效于
Url::build('blog/read', 'name=thinkphp');

PRIMARY KEY (‘id’) //主键

通常在模板文件中输出的话,可以使用助手函数,例如:

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

{:url('blog/read', 'name=thinkphp')}

 

如果我们的路由规则发生调整,生成的URL地址会自动变化

插入记录:

如果你配置了url_html_suffix参数的话,生成的URL地址会带上后缀,例如:

INSERT INTO ‘think_data’(‘id’,’data’) VALUES

'url_html_suffix'  => 'html',

(1,’thinkphp’),

那么生成的URL地址 类似

(2,’php’),

blog/thinkphp.html 
blog/2015/05.html

(3,’framework’);

如果你的URL地址全部采用路由方式定义,也可以直接使用路由规则来定义URL生成,例如:

 

url('/blog/thinkphp');
Url::build('/blog/8');
Url::build('/blog/archive/2015/05');

配置连接数据库相关信息:

生成方法的第一个参数一定要和路由定义的路由地址保持一致,如果你的路由地址比较特殊,例如使用闭包定义的话,则需要手动给路由指定标识,例如: 

 

// 添加hello路由标识
Route::rule(['hello','hello/:name'], function($name){
  return 'Hello,'.$name;
});
// 根据路由标识快速生成URL
Url::build('hello', 'name=thinkphp');
// 或者使用
Url::build('hello', ['name' => 'thinkphp']);

//添加数据库配置信息

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

‘DB_TYPE’     => ‘mysql’,        //数据库类型

您可能感兴趣的文章:

  • ThinkPHP的Widget扩展实例
  • ThinkPHP3.1的Widget新用法
  • thinkPHP下的widget扩展用法实例分析
  • ThinkPHP中Widget扩展的两种写法及调用方法详解
  • thinkPHP5 ACL用户权限模块用法详解
  • thinkPHP5.0框架安装教程
  • thinkPHP5.0框架URL访问方法详解
  • Thinkphp5.0自动生成模块及目录的方法详解
  • thinkPHP5框架中widget的功能与用法详解

‘DB_HOST’     => ‘localhost’,   //服务器地址

‘DB_NAME’     => ‘thinkphp’,   //数据名

‘DB_USER’     => ‘root’,   //用户名

‘DB_PWD’      => ‘’,   //密码

‘DB_PORT’     => 3306,   //端口

‘DB_PREFIX’ => ‘think_’,   //数据表前缀

 

或采用如下配置:

 

‘DB_DSN’ => ‘mysql://root@localhost:3306/thinkphp’

 

注意:

使用DB_DSN方式定义可以简化配置参数,DSN参数格式为:

数据库类型://用户名:密码@数据库地址:数据库端口/数据库名

 

如果两种配置参数同时存在的话,DB_DSN配置参数优先。

 

修改控制器方法进行添加读取数据:

Class IndexAction extends Action {

public function index(){

 

$Data = M(‘Data’); //实例化Data数据模型

$this -> data = $data -> select();

$this -> display();

}

}

这里用到了M函数,是ThinkPHP内置的实例化模型的方法,

使用M方法实例化模型不需要创建对应的模型类。

可理解为:

M();是直接操作底层的Model类,而Model类具备基本的CURD操作方法。

M(‘Data’)实例化后,就可以对think_data数据表(think_是我们在项目配置文件中定义的数据表前缀)进行操作(包括CURD)了。

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

<html>

<head>

<title>Select Data</title>

</head>

<body>

<volist name=”data” id=”vo”>

{$vo.id}--{$vo.data}<br/>

</volist>

</body>

</html>

Volist标签是内置模板引擎用于输出数据集的标签。

{$vo.id}和{$vo.data}的用法和Smarty类似,就是用于输出数据的字段,这里就表示输出think_data表的id和data字段的值。

访问路径:

显示输出:

    Thinkphp

  php

  Framework

注意:

如果发生错误,请检查你是否开启了调试模式或者清空Runtime目录下面的缓存文件。

总结:

在本篇我们学习了ThinkPHP的目录结构、URL模式,如何创建项目的入口文件和开启调试模式,以及控制器、模板和模型的基础认识。

编辑:服务器运维 本文来源:对应用的所有请求都定向到应用的入口文件,T

关键词: