决定写这个 微信小程序 + thinkphp5 商城

为期末的php做准备

这里使用的是最新版本的thinphp 6.0

基础

这里为学习使用thinkphp6

调试修改

thinkphp5  一_composer

目录结构

  •  
www  WEB部署目录(或者子目录)├─app           应用目录│  ├─controller      控制器目录│  ├─model           模型目录│  ├─view            视图目录│  ├─ ...            更多类库目录│  ││  ├─command.php        命令行定义文件│  ├─common.php         公共函数文件│  └─event.php          事件定义文件│├─config                配置目录│  ├─app.php            应用配置│  ├─cache.php          缓存配置│  ├─cookie.php         Cookie配置│  ├─database.php       数据库配置│  ├─log.php            日志配置│  ├─route.php          路由和URL配置│  ├─session.php        Session配置│  ├─template.php       模板引擎配置│  └─trace.php          Trace配置│├─route                 路由定义目录│  ├─route.php          路由定义文件│  └─ ...   │├─public                WEB目录(对外访问目录)│  ├─index.php          入口文件│  ├─router.php         快速测试文件│  └─.htaccess          用于apache的重写│├─extend                扩展类库目录├─runtime               应用的运行时目录(可写,可定制)├─vendor                第三方类库目录(Composer依赖库)├─build.php             自动生成定义文件(参考)├─composer.json         composer 定义文件├─LICENSE.txt           授权说明文件├─README.md             README 文件├─think                 命令行入口文件复制多应用模式如果你需要一个多应用的项目架构,目录结构可以参考下面的结构进行调整(关于配置文件的详细结构参考后面章节)。
www WEB部署目录(或者子目录)├─app 应用目录│ ├─app_name 应用目录│ │ ├─common.php 函数文件│ │ ├─controller 控制器目录│ │ ├─model 模型目录│ │ ├─view 视图目录│ │ └─ ... 更多类库目录│ ││ ├─command.php 命令行定义文件│ ├─common.php 公共函数文件│ └─event.php 事件定义文件│├─config 应用配置目录│ ├─app_name 应用配置目录│ │ ├─database.php 数据库配置│ │ ├─cache 缓存配置│ │ └─ ... │ ││ ├─app.php 应用配置│ ├─cache.php 缓存配置│ ├─cookie.php Cookie配置│ ├─database.php 数据库配置│ ├─log.php 日志配置│ ├─route.php 路由和URL配置│ ├─session.php Session配置│ ├─template.php 模板引擎配置│ └─trace.php Trace配置│├─route 路由定义目录│ ├─app_name 应用路由目录│ │ ├─route.php 路由定义文件│ │ └─ ... │├─public WEB目录(对外访问目录)│ ├─index.php 入口文件│ ├─router.php 快速测试文件│ └─.htaccess 用于apache的重写│├─extend 扩展类库目录├─runtime 应用的运行时目录(可写,可定制)├─vendor 第三方类库目录(Composer依赖库)├─build.php 自动生成定义文件(参考)├─composer.json composer 定义文件├─LICENSE.txt 授权说明文件├─README.md README 文件├─think 命令行入口文件

入口文件

默认的入口文件在

  •  
public/index.php

使用自动的多应用部署

修改入口文件为下

  •  
<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------
// [ 应用入口文件 ]namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 执行HTTP应用并响应$http = (new App())->http;
$response = $http->name("index")->run();
$response->send();
$http->end($response);

此时目录结构如下

thinkphp5  一_php_02

编写控制器

  •  
<?phpnamespace app\index\controller;

class Index{ public function Index(){ return "ming"; }
}

此时访问 http://localhost:8082/index.php/

可以看到访问到应用为index的应用

URL规则

http://serverName/index.php/应用/控制器/操作/参数/值...

容器和依赖注入

通过对类的依赖进行自动注入

对象依赖通过依赖注入生成

使用助手函数绑定

  •  
<?phpnamespace app\index\controller;
use app\index\model\User;class Index{ private $user;
public function _construct(User $user){ $this->user = $user; }
public function Index(){ $app = app(); isset($app->User); $app->user = User::class;
$user = $app -> user; return "ming" . var_dump($cache); }
}

这里使用app函数对对象实例进行注册。。

系统服务

执行框架依赖的组件需要的基础服务

服务会继承thinkphp的think\Service命名空间下的类 使用命令生成 php think make:service FileSystemService 生成一个系统服务

该系统服务会继承系统的think\Service类

生成两个空方法 register 和 boot

register 方法,服务绑定到容器

使用命令生成系统服务

php think make:service FileSystemService

thinkphp5  一_composer_03

  •  
<?php
namespace app\service;
use think\Service;
class FileSystemService extends Service{
public function register() {
}
public function boot() {
}}

可以发现注册到app\service命名空间 使用think\Service

Facade

这里是门面

门面为容器中的动态的类,提供静态调用接口。用来进行可测试和扩展。。

  •  
<?phpnamespace app\common;

class Test{ public function hello($name){ return 'hello' . $name; }}

此时会产生一个hello类

调用hello类的方法

正常的调用

  •  
<?phpnamespace app\index\controller;
use app\index\model\User;class Index{ private $user;
public function _construct(User $user){ $this->user = $user; }
public function Index(){ $test = new \app\common\Test(); echo $test ->hello('thinkphp');
return "ming"; }
}

此时使用代理类

  •  
<?phpnamespace app\index\controller;
use app\index\model\User;class Index{ private $user;
public function _construct(User $user){ $this->user = $user; }
public function Index(){ echo \app\common\facade\Test::hello("ming");
return "ming"; }
}

即无需实例化,直接使用工厂模式,进行生成实例化对象

无需实例化就可以调用

中间件

  •  
➜  untitled11 php think make:middleware CheckMiddleware:app\middleware\Check created successfully.➜  untitled11 

使用命令行生成中间件

此时的目录结构

thinkphp5  一_命令行_04

可以看到生成了Check中间件

  •  
<?phpnamespace app\middleware;
class Check{
/** * 中间件入口 * @param $request * @param \Closure $next * @return mixed|\think\response\Redirect */ public function handle($request, \Closure $next) { if($request->param('name') == 'think'){ // 请求转发到index页面的think return redirect('index/think'); }
// 继续转发下一个中间件 return $next($request); }}

注册中间件 对路由中间件进行注册

  •  
Route::rule('hello/:name','hello')    ->middleware(\app\middleware\Auth::class);

可以进行注册

事件

支持订阅者和发布者模式

事件的存在的意义是对修改关闭,对增加开发 减少对代码的入侵

所有的事件通过 think\facade\Event 类进行调用

即观察者模式

使用助手函数 或者使用Event::trigger注册事件

  •  
<?phpnamespace app\index\controller;
use app\index\model\User;class Index{
public function Index(){ // 触发UserLogin事件 使用助手函数 event('UserLogin'); return "ming"; }
}

使用事件类 输入命令 生成事件类

  •  
 php think make:event UserLogin