本篇文章给大家带来了关于thinkphp的相关知识,其中主要总结了一些笔记知识点,包括了模型、系统服务、laket-admin项目等内容,下面一起来看一下,希望对大家有帮助。
|
本篇文章给大家带来了关于PHP的相关知识,其中主要总结了一些笔记知识点,包括了模型、系统服务、laket-admin项目等内容,下面一起来看一下,希望对大家有帮助。
推荐学习:《PHP视频教程》 安装
另外安装composer的时候 不要要从小皮面板安装 坑货······ 大坑==phpstudy 网站那 要关了open_dir 防止跨站攻击的 不然设置public目录为 网站根目录后 就访问不到外面的 然后 要开启php的 默认是不开启的== 另外 如果是拷贝的文件 权限可能也要设置下 为755 env也要开启debug 然后runtime目录设置为777 基础错误显示除了上面的大坑外,一般是设置env 配置[DATABASE]USERNAME = rootPASSWORD = 123456 use think\facade\Envfunction(){// 获取环境变量 如果不存在则使用默认值rootEnv::get('database.username', 'root');}
应用目录
输出
控制器两个特殊的控制器一. 基础控制器
模型游标的意义
验证器使用例如, 在 TP3 的时候, 可能是这样判断的: $name = I('name', '');if (empty($name)) {
// 抛出异常}如果参数比较多的时候, 需要判断的变量越多代码量也随着增加. 如果使用验证器就会好很多. 验证器的官方文档: https://www.kancloud.cn/manual/thinkphp6_0/1037624 直接上代码: <?php
namespace app\api\controller;
use think\facade\Validate;use think\Request;
class Auth{
public function index(Request $request)
{
$input = $request->post();
$validate = Validate::rule([
'name|名称' => 'require|max:25',
'email|邮箱' => 'require|email'
]);
if (!$validate->check($input)) {
return $validate->getError();
}
}}
验证的好处 主要是 重复使用 而且直接输出错误信息 避免重复写代码 系统服务使用系统服务有大大的好处和避免了直接修改类的坏处。从以上分析来看,个人觉得,使用系统服务,可以对一个类进行非入侵式的「配置」,如果哪天一个类的某些设定需要修改,我们不用直接修改这个类,只需要修改服务提供类就好了。对于扩展包来说,系统服务使其可以在扩展中灵活配置程序,达到开箱即用的效果。不过,有个缺点是系统服务类都要在程序初始化是进行实例化,如果一个系统的服务类很多,势必影响程序的性能。 使用 thinkphp 开发网站,在没有 thinkphp6 版本出来以前,常规的开发模式都是使用它自带的多应用开发方式来进行项目开发。 多应用开发的一个好处就是开发方便和快速,只需要在thinkphp规定的app目录建立一个目录,比如 admin 目录,然后在其内建立一个 controller 目录就可以开始一个项目的基本开发了。 然而这样开发只适合基于它本身的目录进行开发,如果想要把项目做成一个包来开发和发布,这样的方式明显不行。 而这次,thinkphp6 引入了 Service 的概念,增加了项目转移到包开发的可能性。 Service 的使用需要继承 \think\Service ,同时 Service 默认的 register 和 boot 这两个方法是非必须的,就是说可以不用添加也是可以的。 但是,我们使用 Service 就是为了在项目启动前添加自己的配置和注册一些自己的东西,所以这两个方法对项目开发来说,都利用起来是最好的方法。 register的使用 Service 的引入会根据 thinkphp6 生成的 Services.php 缓存顺序进行加载,所以在使用过程中需要注意当前的 Service 在缓存中属于哪个位置,防止在注册配置时候出现配置加载时出现不可知的问题。 boot 的使用 thinkphp6 由于在 boot 前已做了系统配置的初始化操作,所以在这里处理一些数据库操作也是没有问题的。 Service 的其他方法 registerRoutes :功能于 loadRoutesFrom 一样 commands :导入脚本命令,传入数据为数组或者单个脚本 使用 Service 的场景 如果只是单纯的想做一个 app 项目,Service 估计不太适合你。 最后,Service 的具体实践有没有什么好的项目推荐啊,那当然有的,这里隆重推荐一个完全使用 Service 开发的项目: laket-admin: https://github.com/deatil/laket-admin laket-admin 使用 thinkphp6 的 Service 模式加单应用开发而成,避开了 thinkphp6 多应用下 url 出现的一些问题,对用户端的 url 更加友好。 laket-admin项目的截图为什么halt
依赖注入与容器依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。 如何注入首先是构造器注入api/manager/TestMgr.php namespace app\api\manager;class TestMgr{
public string $name1 = 'a';}api/controller/Test.php class Test{
public function __construct(TestMgr $testMgr){
$this->testMgr=$testMgr;
}
public function index()
{
return $this->testMgr->name1; //输出a
//same as $a=new TestMgr();return $a->name;
}构造器方法注入的解析如果换成我们手动调用的方式,那么正常的流程应该是 $testMgr = new TestMgr();//多出来了这一步 要先实例化TestMgr$test = new Test($testMgr);$test->index($testMgr); 然而 浏览器直接调用的方式是 ,因为 正常情况下 不可能我们接口调用 还去 先new一堆东西吧 $test = new Test();$test->index($testMgr); 但这样肯定会报错 因为 构造器有参数 但是你没传。所以我们不能直接这么写,要写成上面那种自动注入的参数的形式。而事实上 我们也可以通过invoke函数来完成递归实例化这一操作。 所以,相当于容器自动帮我们完成了这个操作。我们要做的 只是在方法的参数中写需要的那个类的即可 不需要去手动去new底层的一堆对象 方法调用的方式api/manager/TestMgr.php namespace app\api\manager;class TestMgr{
public string $name1 = 'a';}api/controller/Test.php namespace app\api\controller;use app\api\manager\TestMgr;class Test{
public function index(TestMgr $testMgr)
{
return $testMgr->name1;//1
}}invoke//使用容器来实例化的话,可以自动进行依赖注入。invoke(类名)//某个方法依赖注入invoke(['类名','方法名']) $bar = new Bar(); $foo = new Foo($bar);等价于$foo = invoke('Foo');也支持对某个函数或者闭包使用依赖注入 $result = invoke(function(Bar $bar) {
// ...});上面的实现-------容器什么是容器
简而言之,容器内部是通过反射类或闭包等来实现类的实例化(单例)。 app助手函数
$arrayItem = app(‘org\utils\ArrayItem’);
app和invoke这两个助手函数的区别app 快速获取容器中的实例 支持依赖注入 bind依赖注入的类统一由容器进行管理,大多数情况下是在自动绑定并且实例化的。不过你可以随时进行手动绑定类到容器中(通常是在服务类的register方法中进行绑定),支持多种绑定方式。 // 绑定类库标识bind('user','\app\index\model\User');// 快速调用(自动实例化)echo app('user')->name;更多bind的用法看手册
provider.php一般来说,bind只能在定义的那个地方用,其他地方就用不了了。所以,为了其他地方也能用,我们将bind函数写在provider.php文件中 容器的好处容器:【“拿来即用”,不需要通过实例化,松耦,节约资源】 容器自动依赖注入容器主要用于依赖注入,依赖注入会首先检查容器中是否注册过该对象实例,如果没有就会自动实例化,然后自动注入 自定义实例化
其他
场景支持使用依赖注入的场景包括(但不限于): 控制器架构方法; 门面 face就大量使用了依赖注入 Facade 门面模式看设计模式那个文档。 简单来说 就是request实际上是用依赖注入的方式写的,所以需要实例化一大堆。所以要么使用门面模式 要么使用自动依赖注入的方式调用!
推荐学习:《PHP视频教程》 以上就是thinkphp6教程笔记(总结分享)的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
