thinkphp笔记-多应用模式
多应用模式
单应用模式文件目录如下
www WEB部署目录(或者子目录)
├─app 应用目录
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─ ... 更多类库目录
│ │
│ ├─common.php 公共函数文件
│ └─event.php 事件定义文件
│
├─config 配置目录
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─console.php 控制台配置
│ ├─cookie.php Cookie配置
│ ├─database.php 数据库配置
│ ├─filesystem.php 文件磁盘配置
│ ├─lang.php 多语言配置
│ ├─log.php 日志配置
│ ├─middleware.php 中间件配置
│ ├─route.php URL和路由配置
│ ├─session.php Session配置
│ ├─trace.php Trace配置
│ └─view.php 视图配置
│
├─view 视图目录
├─route 路由定义目录
│ ├─route.php 路由定义文件
│ └─ ...
│
├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor Composer类库目录
├─.example.env 环境变量示例文件
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think
————————————————
由于多应用模式属于扩展,不是系统自带的,我们需要额外安装;
composer require topthink/think-multi-app
安装好后,会在vendor/topthink下,多了一个think-multi-app文件夹。其次就是在config/app.php中,多了如下内容
// 应用映射(自动多应用模式有效)
'app_map' => [],
// 域名绑定(自动多应用模式有效)
'domain_bind' => [],
// 禁止URL访问的应用列表(自动多应用模式有效)
'deny_app_list' => [],
对之前的目录进行修改:
1、在app目录下新建index(网站前台首页),admin(网站后台首页)
2、将原本的app下的controller与model文件夹移动到index目录中
删除或移动原来app目录下面的controller文件夹,TP是根据是否有这个文件夹来判断单应用模式还是多应用模式的,所以这个必须删除或者移动到其他目录。tips:没个应用目录下都应该有各自的controller和model文件夹。
3、在admin下新建controller目录,并新建index.php文件,并输入下面内容
<?php
namespace app\admin\controller;
class Index
{
public function index()
{
return '后台首页';
}
}
4、修改app/index目录中的控制器,修改里面的namespace:
比如app/index/controller里面有3个控制器文件:Index.php,Address.php,Show.php
比如原本Index.php中是这样
namespace app\controller;
现在要改为
namespace app\index\controller;
同理,其他的控制器中都要在app与controller之间加上文件夹名,这里是Index。
然后访问的时候:http://127.0.0.1:8000/index/address/read/id/10,http://127.0.0.1:8000/index/,同理,进入后台:http://127.0.0.1:8000/admin
5、涉及到加载模板的,单应用模式里面,模板都存放在根目录下的view文件夹中,默认规则是view/控制器名称/模板文件,
比如,view/show/index.html,其对应的config/view.php中的设置
// 模板目录名
'view_dir_name' => 'view',
以app/index/controller/Show.php中的index方法为例,加载一个模板
public function index()
{
View::assign([
'name' => 'wubin',
'email' => 'ww@163.com'
]);
return View::fetch('index', [
'name' => 'wubin',
'email' => 'ww@163.com'
]);
}
而到了多应用模式,其目录规则是view/应用名/控制器名/模板文件,并且对应的设置也要改改,否则会提示找不到模板文件
// 模板目录名
'view_dir_name' => 'app\view',
目录规则
|-view
|-index 应用1
|-code
|-public
|-page
|-...
|-admin 应用2
|-...
6、最终的目录如下所示
tp6----------
|- app
|-admin
|-controller
|-index.php
|-index
|-controller
|-model
|-route
|-app.php
|-common
...
|-view
|-index
|-code
|-public
|-page
|-...
|-admin
|-...
默认的应用为index,在config/app.php 修改即可;
// 默认应用
'default_app' => 'admin',
如果改为admin,那么访问http://127.0.0.1:8000/的时候,会显示http://127.0.0.1:8000/admin/index的页面,默认为Index,指的是默认访问app/index/controller/Index.php的index方法。
我们可以做应用映射,比如将admin 目录映射为think,admin 废弃;
// 应用映射(自动多应用模式有效)
'app_map' => [
'think' => 'admin'
],
那么可以通过http://127.0.0.1:8000/think/index去访问原来的admin。
我们也可以做域名绑定,比如,后台用域名绑定,直接访问;比如我做了一个二级域名,专门用于访问后台,而顶级域名访问的是前台,
// 域名绑定(自动多应用模式有效)
'domain_bind' => [
'news.abc.com' => 'admin',
'*' => 'index'
],
'*'=>'index' 指泛指,除了指定的,那么访问其他的都是直接访问到前台的Index
路由修改:需要在应用目录单独建立路由,内部编码不需要更改;
比如在单应用下,是统一在route/app.php中注册路由
Route::rule('ar/:id', 'Address/read');
比如上面一条路由,在多应用模式下,会提示:控制器不存在:app\controller\Address
这时候需要在应用目录下新建一个route/app.php
|-index
|-controller
|-model
|-route
|-app.php
在app.php中
use think\facade\Route;
Route::rule('ar/:id', 'Address/read');
// \think\facade\Route::rule('ar/:id', 'Address/read');
访问路由:http://localhost:8000/index/ar/5
注意,路由前要带有应用的目录名,否则会报错!