下面由laravel教程栏目给大家介绍如何利用php trait实现简易facade,希望对大家有所帮助!
简述
Facade 可以有效帮我实现方法的静态化。Laravel 大部分的扩展包都使用了 Facade。【推荐:laravel视频教程】
下面的简易 Facade 主要是利用 PHP 的特性 trait,魔术方法 __callStatic,反射类 ReflectionClass。
使用场景
后台系统大部分都会有类似这样的操作:
立即学习“PHP免费学习笔记(深入)”;
<?php$user = User::find($id);if (!$user) { throw new Expection("资源不存在");}
这样似乎没有什么问题,但是还会存在下面这样的:
$article = Article::find($id);if (!$article) { throw new Expection("资源不存在");}$article->delete();
这样写法十分不优雅。
上代码
1、首先我们应该要有一个 Service
<?phpnamespace AppServices;use AppTraitsModeServiceTrait;class ModelService extends BaseService{ use ModeServiceTrait;}
2、新建一个 Trait
trait 为了多继承而存在的,可以去 PHP官网 看文档。
英特尔AI工具
英特尔AI与机器学习解决方案
70 查看详情
newInstanceArgs(); // 调用该不存在的方法 $model = call_user_func_array([$instance, $method], [$arg]); // 如果存在复杂操作交给 callback return isset($args[2]) ? $args[2]($model) : self::callback($model, $method); }}
首先我们关注 __callStatic 这个魔术方法。 当调用不存在的静态方法时会触发该方法。和他相似的魔术方法是 __call。这是使用 __callStatic 是为了达到 Facade 的效果。
__callStatic 有两个回调参数 $method 是 被调用的且不存在的方法,$args 是 $method 方法中所传递的参数(数组形式)。
这样一个简易的 trait 就完成了。
使用
我们新建一个 command
$ php artisan make:command TestCommand
写入下面的内容
load('author'); }); }}
其中的 Article 模型需要自己去创建。
接下来就可以看看效果了:
$ php artisan test:test
结语
这样我们就抛弃了使用 abstract 抽象类,来达到了跟 Facade 一样的效果。同时也做到了代码复用。
这样使用程序会多走很多步,但是跟优雅比起来,性能什么的都无所谓了。
表达不是很清楚,需要自己深入体会了。
以上就是用PHP特性trait实现简易Laravel Facade的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/227826.html
微信扫一扫
支付宝扫一扫