什么是ThinkSNS ?

ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+(简称TS+)、ThinkSNS V4、ThinkSNS【简】。

产生需求

在使用 Laravel 开发 ThinkSNS Plus 的时候,因为很多功能块都没有写在一个库里面,利用拓展包的形式添加实际功能,里面很多地方也用到了“多态多对多”的关系。问题来了,开发一个问答程序,想要给用户模型增加发布的问题或者回答的关系,起初是继承一份 User 模型,添加了关系,之后就发现问题了,因为用户的 tag 是使用多态多对多的关系,我通过继承的用户模型是无法拿到这种关系数据的因为 ***able_type 是 user 数据模型类名称或者别名。而我继承之后类也就发生改变了。

完成需求

随之想到,在 Laravel 中有一个 Trait 叫做 Macroable 然后发现 Builder 都有这种能力,而 Model 没有,随之也将这个 Trait 添加到要使用的model上,后来发现,如果其他模型也要用是不是也要再添加一次?随之写了一份 Trait :

trait Macroable
{
   use \Illuminate\Support\Traits\Macroable {
       __call as macroCall;
   }    /**
    * Get a relationship value from a method.
    *
    * @param string $key
    * @return mixed
    * @author Seven Du <shiweidu@outlook.com>
    */
   public function getRelationValue($key)
   {
       $relation = parent::getRelationValue($key);
       if (! $relation && static::hasMacro($key)) {
           return $this->getRelationshipFromMethod($key);
       }        return $relation;
   }    /**
    * Handle dynamic method calls into the model.
    *
    * @param string $method
    * @param array $parameters
    * @return mixed
    * @author Seven Du <shiweidu@outlook.com>
    */
   public function __call($method, $parameters)
   {
       if (static::hasMacro($method)) {
           return $this->macroCall($method, $parameters);
       }        return parent::__call($method, $parameters);
   }    /**
    * Handle dynamic static method calls into the method.
    *
    * @param  string  $method
    * @param  array  $parameters
    * @return mixed
    */
   public static function __callStatic($method, $parameters)
   {
       return parent::__callStatic($method, $parameters);
   }
}

只要在要使用的 model 中 use 即可。

使用

有了这个 Trait 那么我们添加到 User 模型中,就可以使用宏能力为其动态添加函数了:

User::macro('questions', function () {
   return $this->hasMany(Question::class, 'user_id', 'id');
});

这样,我们可以直接 :

$questions = $user->questions;

拿到用户发布的所有问题了。

以上代码都来自于ThinkSNS Plus,看完整的开发代码可以看仓库

GitHub: https://github.com/slimkit/thinksns-plus(开源不易,求 Star )

 

上一篇研发日记:如何在 Laravel 中 “规范” 的开发验证码发送功能

Laravel Model 利用 Macroable 为数据模型添加宏能力的更多相关文章

  1. ASP.NET MVC 5 - 给数据模型添加校验器

    在本节中将会给Movie模型添加验证逻辑.并且确保这些验证规则在用户创建或编辑电影时被执行. 拒绝重复 DRY ASP.NET MVC 的核心设计信条之一是DRY: "不要重复自己(DRY ...

  2. [转]ASP.NET MVC 5 - 给数据模型添加校验器

    在本节中将会给Movie模型添加验证逻辑.并且确保这些验证规则在用户创建或编辑电影时被执行. 拒绝重复 DRY ASP.NET MVC 的核心设计信条之一是DRY: "不要重复自己(DRY  ...

  3. 利用VC助手(VA)添加注释

    利用VC助手(VA)添加注释 今天想给自己写的代码加上版权信息,同时整理一下代码的注释.但是为了保持同样的格式,总是copy,显得有些繁琐.然后试图找解决方案.我用的是VS 2010, 刚开始是尝试了 ...

  4. Linux学习笔记——举例说,makefile 添加宏定义

    0.前言     从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile.假设自己动手写一个makefile总认为非常吃力. 所以特意 ...

  5. 利用OpenCV给图像添加中文标注

    利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html  和https://blog.csdn.net/ ...

  6. Android.bp 添加宏开关【转】

    本文转载自:https://github.com/zzb2760715357/document/blob/master/android_doc/Android.bp%E6%B7%BB%E5%8A%A0 ...

  7. laravel项目利用twemproxy部署redis集群的完整步骤

    Twemproxy是一个代理服务器,可以通过它减少Memcached或Redis服务器所打开的连接数.下面这篇文章主要给大家介绍了关于laravel项目利用twemproxy部署redis集群的相关资 ...

  8. 利用 Excel 写 C51 的宏定义

    利用 Excel 写 C51 的宏定义 填好占空比,自动生成宏. #define LIGHT_LEVEL_00 0xFF #define LIGHT_LEVEL_10 0xE5 #define LIG ...

  9. 利用iTunes给MP3添加专辑插图

    利用iTunes给MP3添加专辑插图 打开iTunes 准备好没有专辑插图的mp3文件和插图 将准备好的mp3文件拖入iTunes 右键菜单选择专辑信息选项 在专辑信息里面选择插图 点击左下角的添加插 ...

随机推荐

  1. .gitignore文件配置:keil工程文件类型【转】

    本文转载自:https://blog.csdn.net/u010160335/article/details/80043965 .gitignore源文件下载链接:git管理keil工程.gitign ...

  2. poj The Settlers of Catan( 求图中的最长路 小数据量 暴力dfs搜索(递归回溯))

    The Settlers of Catan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1123   Accepted: ...

  3. LightOJ - 1265 Island of Survival —— 概率

    题目链接:https://vjudge.net/problem/LightOJ-1265 1265 - Island of Survival    PDF (English) Statistics F ...

  4. Buffer的数据存取

    缓冲区 存放要读取的数据 缓冲区 和 通道 配合使用 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与N ...

  5. 常见排序算法-php

    1.归并排序 $a = [1, 4, 6, 8, 10, 14, 16]; $b = [2, 3, 5, 8, 9, 11]; function merge_sort($a, $b) { $a_i = ...

  6. LNMP安装(一)

    前传: 环境介绍: Centos7.2-minimal 下载地址:http://mirrors.163.com/centos/7.2.1511/isos/x86_64/ (网易镜像站) 所需安装包:链 ...

  7. COM组件宏观认识

    一直搞不清楚COM到底是个什么东西,记录一些个人感想,可能很多错误的,慢慢消化. 一.宏观认识: 1.COM(组件对象模型)是一种标准,规则,要求,即即于建筑设计指标要求. 2.语言无关性,因为是建立 ...

  8. codeforces 566D D. Restructuring Company(并查集)

    题目链接: D. Restructuring Company time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  9. PS 滤镜— — 镜头光晕

    clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...

  10. 结合Mysql和kettle邮件发送日常报表_20161001

    十一假期 参加婚礼 稍晚点发博 整体流程步骤是: 写SQL-导出到excel设定excel模板调整格式-设置kettle转换--设置kettle邮件作业--完成 第一.写SQL 保持最近12个周的数据 ...