• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 用PHP特性trait实现简易Laravel Facade

用PHP特性trait实现简易Laravel Facade

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了PHP特性,trait实现Laravel Facade等相关知识,希望对您有所帮助

下面给大家介绍如何利用PHP trait实现简易Facade,希望对大家有所帮助!

简述

Facade 可以有效帮我实现方法的静态化。Laravel 大部分的扩展包都使用了 Facade。

下面的简易 Facade 主要是利用 PHP 的特性 trait,魔术方法 __callStatic,反射类 ReflectionClass。


使用场景

后台系统大部分都会有类似这样的操作:

<?php$user = User::find($id);if (!$user) {    throw new \Expection("资源不存在");}

这样似乎没有什么问题,但是还会存在下面这样的:

$article = Article::find($id);if (!$article) {    throw new \Expection("资源不存在");}$article->delete();

这样写法十分不优雅。


上代码

1、首先我们应该要有一个 Service

<?phpnamespace App\Services;use App\Traits\ModeServiceTrait; class ModelService extends BaseService{    use ModeServiceTrait;}

2、新建一个 Trait

trait 为了多继承而存在的,可以去 PHP官网 看文档。

<?phpnamespace App\Traits;use \ReflectionClass;use \Exception;use \ReflectionException;use Illuminate\Database\Eloquent\Model;use App\Exceptions\ResourceException;/** * @method static Model find(string $className, int $id, callable $callback = null) * * @see Model * @package App\Services */trait ModeServiceTrait{    /**     * 回调方法     *     * @param Model|null $model     * @param string $method     * @return Model     * @throws ResourceException     */    public static function callback(Model|null $model, string $method): Model    {        switch ($method)        {            case 'first':            case 'find':                if (!$model) {                    throw new ResourceException("资源不存在");                }                break;             default:                 break;        }         return $model;    }     /**     * 调用不存在的方法时触发     *     * @param $method     * @param $args     * @return false|mixed     * @throws ReflectionException     * @throws ResourceException     * @throws Exception     */    public static function __callStatic($method, $args)    {        $className = $args[0];        $arg = $args[1];         // 判断模型类是否存在        if (!class_exists($className)) {            throw new Exception("The class {$className} could not be found. from:" . __CLASS__);        }         // 利用反射实例化其类        $reflection = new ReflectionClass($className);        $instance = $reflection->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

写入下面的内容

<?phpnamespace App\Console\Commands;use Illuminate\Console\Command;use App\Services\ModelService;use App\Models\Article\Article;class TestCommand extends Command{    /**     * The name and signature of the console command.     *     * @var string     */    protected $signature = 'test:test';     /**     * The console command description.     *     * @var string     */    protected $description = 'a test';     /**     * Create a new command instance.     *     * @return void     */    public function __construct()    {        parent::__construct();    }     /**     * Execute the console command.     */    public function handle()    {      &
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 用PHP特性trait实现简易Laravel Facade

相关文章

  • 好看短视频解析下载Python脚本
  • PHP会话控制:cookie和session区别与用法深入理解
  • 浅析Vue中的Vue.set和this.$set,看看使用场景!
  • 织梦CMS整站源码通用安装教程(加固版和普通版都一样)
  • Flex中对表格中某列的值进行数字格式化保留两位小数
  • 织梦DedeCMS系统列表页调用TAG标签并带上链接的实
  • MySQL数据库的root密码忘记该怎么办
  • ThinkPhp5.1制作微信支付以及支付后的几种状态说明
  • DEDECMS注册成功页面加入马上激活链接转向注册邮
  • ThinkPHP6怎么用表单令牌验证数据来源有效性

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 宝塔面板如何屏蔽禁止某个IP(IP段)访问
    • HTML5中video标签如何使用
    • 织梦熊掌号api自动提交代码
    • 网站快照停滞不前的N种影响因素
    • MySQL忘记密码的解决方法:无密码登录并重置root密码
    • Thinkphp5中验证器的使用方法
    • Photoshop设计冬季促销广告设计教程
    • PHP网站常见安全漏洞,及相应防范措施总结
    • 利用滤镜及图层样式制作简单的积雪字
    • nestjs返回给前端数据格式的封装实现

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有