Thinkphp5.0跨模块调用模型和验证器的方法

在 ThinkPHP5.0 中,使用助手函数跨模块调用模型类和验证类,可能会存在一些问题。

1. 使用背景

在实际的Web项目开发过程中,项目分为前台(application / Index模块)、后台(application / Admin模块),甚至更多模块。而这些模块控制器中,往往会重复使用数据库中的某些表,以及使用thinkphp5的验证器对用户输入进行合法性验证,如果分别在这些模块中编写模型类(model)和验证器类(validate)的代码,就会造成代码重复,并不符合OOP的初衷。处理这一问题的最直接方法就是将这些重复代码提取出来,创建一个公共类,在使用ThinkPHP5跨模块调用公共类的过程中,会产生一些问题。

假设:在前台和后台中分别存在着两个 Department.php 控制器类,用来操作数据库中的`部门表`,建立模型类 Dept.php 对应`部门表`,建立验证器类 Dept.php 过滤用户从表单提交的非法数据。建立Dao模块,用于存储模型和验证器。

优化后项目的目录结构是这样的:

Application

  |--Admin

    |--controller

        Department.php(Controller类)

  |--Index

    |--controller

        Department.php(Controller类)

  |--Dao

    |--model

        Dept.php(Model类)

    |--validate

        Dept.php(Validate类)

... ...

2. 问题描述

通过将重复的代码提取到 Dao 模块中,可以实现模型操作和验证的方法公用,但在跨模块使用的过程中存着如下问题:

在使用模型时,引入命名空间 use app\dao\model\Dept 后,在方法中通过关键字 $model = new Dept() 是可以得到 Dept 模型类实例化对象的,打印输出可以看到这个 $model 是对 app\dao\model\Dept 实例化的结果。但是如果使用 ThinkPHP5.0 自带的助手函数 model() ,是否也可以实例化这个模型对象呢?

很遗憾,结果是不行的。在同样引入命名空间后,在方法中通过助手函数 $model = model("Dept") 进行实例化对象时,系统会报错,找不到类:app\common\model\Dept 。通过撸框架的源码,显然,助手函数 model() 首先会在当前模块下寻找这个 Dept 模型类,如果找不到再到公共模块 common 下找这个 Dept 模型类。如果都没有找到,则直接报错。并没有因为引入了 dao 模块的命名空间,而在 dao 模块下去寻找 Dept 模型类。

此外,在模型引用验证器时,系统会再次报错,找不到类:app\common\validate\Dept 。显然这里助手函数又依次从本模块、common 模块下找 Dept 验证器类,没有找到后直接报错。

报错的代码如下:

uses use app\dao\model\Dept;		
...

public function add(){

    // $model = model("Dept");  // 助手函数提示找不到类Dept
    $model = new Dept;

    $rst = $model
        ->validate(true)    // 助手函数再次提示找不到类Dept
        ->isUpdate(false)
        ->allowField($model->insert_fields)
        ->save( input('post.') );

    if(false===$rst){
	    dump($model->getError());					
    }	
}		

3. 解决方案

如果不想把公共部分放在 common 模块下,使用助手函数就不能正确调用了吗?答案是否定的。助手函数里可以采用以下格式传递模块名,model("dao/Dept") 。注意,不能写成 model("dao/model/Dept")。同样的,validate(true) 改写成 validate("dao/Dept"),就能完成模型验证。同样注意,不能写成 validate("dao/validate/Dept")。

更改后的代码如下:

uses use app\dao\model\Dept;		
...

public function add(){

    $model = model("dao/Dept");

    $rst = $model
        ->validate("dao/Dept")
        ->isUpdate(false)
        ->allowField($model->insert_fields)
        ->save( input('post.') );

    if(false===$rst){
	    dump($model->getError());					
    }
}	

如上述代码所示,在助手函数中添加模块名,即可实现使用助手函数,跨模块调用非common模块中的模型类、验证器类的方法。

助手函数 ( “模块名 / 方法名” )

5. 一句话总结

在 ThinkPHP5.0 中,跨模块调用非 common 模块下的模型、验证器类时,在助手函数中添加模块名即可。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值