在模型里边的钩子创建与使用方法跟在控制器里边的钩子创建及使用方法是有所区别的 在模型里边创建的钩子,你可以理解为执行一个函数,是无法调用模型里边的类的方法及属性的。 比如系统文件`\application\common\model\Order.php` 里边的这段代码如下 ~~~ protected static function success_pay($order_info=[]){ //客户扣款 add_rmb($order_info['uid'],-abs($order_info['pay_money']),0,'购物消费'); //商家入帐 add_rmb($order_info['shop_uid'],abs($order_info['pay_money']),0,'销售商品'); static::send_msg($order_info); get_hook('order_have_pay',$data=[],$order_info,$array=['dirname'=>self::$model_key],$use_common=true,self::$model_key); //钩子扩展 } ~~~ 这个方法是用户 支付订单款后执行的操作。里边埋了一个钩子。 其中`get_hook`就是钩子函数,所以他是不能使用类里边的方法与属性的。 这里有一个很特殊的地方,就是增加了第6项参数,指定了当前的频道目录名 `$dirname`目的是为了避免此模型被其它地方频道或模型调用的时候,无法真实的获取到当前所在频道目录的问题。 同时也给第4项参数 `,$array=['dirname'=>self::$model_key]` 特别传递了目录名,方便后面的调用。 上述就是预埋钩子的注意事项。 下面再给出一段代码,讲解如何使用模型钩子。 你可以创建文件 `\application\shop\ext\order_have_pay\give_jifen.php` 其中 `order_have_pay`就是钩子标志,`give_jifen.php` 功能文件名可以随意的。 其中文件是放在`\application\shop\ext\`这个目录里,代表只能是商城目录调用。如果要其它频道也可以调用的话,就需要换成 `\application\common\ext\`系统目录 文件里边的具体代码如下 ~~~ <?php $uid = $info['uid']; //$info 是订单信息 $webdb = config('webdb.M__'.$array['dirname']); //频道参数 $num = isset($webdb['give_jifen'])?$webdb['give_jifen']:2; //频道设置了赠与积分,就能频道的为标准 if ($num>0) { add_jifen($uid,2,'购买商品赠送积分'); } ~~~ 其中 `$info`及 `$array`两个变量都是通过函数传进来的。 这里要操作数据库的话,只能用引用 ~~~ use think\Db; ~~~ 直接操作数据库