ServiceAppAop.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace App\Traits;
  3. use App\Services\LogService;
  4. use Illuminate\Contracts\Foundation\Application;
  5. use Illuminate\Support\Collection;
  6. use Illuminate\Support\Facades\Cache;
  7. trait ServiceAppAop
  8. {
  9. /**
  10. * 实例化一个service的入口,为了测试方便做出来的,这样测试时可以代入假的柱件替换service的实现
  11. * 应当在一般性用app的地方换成本方法才可以做到使用柱件
  12. * @param $targetService
  13. * @param $abstractClassName
  14. * @return Application|mixed|string
  15. */
  16. public function instant(&$targetService, $abstractClassName){
  17. if(!is_string($targetService)){
  18. if(empty($targetService))
  19. $targetService=app($abstractClassName);
  20. return $targetService;
  21. }
  22. if(!is_string($abstractClassName)){
  23. $this->$targetService=$abstractClassName;
  24. }else{
  25. $this->$targetService=app($abstractClassName);
  26. }
  27. return $targetService;
  28. }
  29. /**
  30. * 缓存过了
  31. * @param array $kvPairs
  32. * @return Collection|null
  33. */
  34. function get(array $kvPairs):?Collection{
  35. return Cache::remember($this->cachingKey($kvPairs), config('cache.expirations.serviceAutoCache'), function ()use($kvPairs) {
  36. $query = ($this->modelClass)::query();
  37. foreach ($kvPairs as $column => $value){
  38. if (is_array($value))$query->whereIn($column,$value);
  39. else $query->where($column,$value);
  40. }
  41. return $query->get();
  42. });
  43. }
  44. protected function cachingKey(array $kvPairs): string
  45. {
  46. ksort($kvPairs);
  47. return $this->modelClass.md5(json_encode($kvPairs));
  48. }
  49. protected function clearCache(array $kvPairs){
  50. Cache::forget($this->cachingKey($kvPairs));
  51. }
  52. function create(array $kvPairs){
  53. $materialBox=$this->get($kvPairs);
  54. if($materialBox->isNotEmpty())
  55. return $materialBox->first();
  56. $this->clearCache($kvPairs);
  57. return ($this->modelClass)::query()->create($kvPairs);
  58. }
  59. function firstOrCreate(array $kvPairs){
  60. $materialBox=$this->get($kvPairs);
  61. if($materialBox->isNotEmpty())
  62. return $materialBox->first();
  63. $this->clearCache($kvPairs);
  64. return $this->create($kvPairs);
  65. }
  66. /**
  67. * $returnInserted 设为true返回插入的内容,是通过插入的字段返查的,所以可能会不准(看字段是否能匹配)
  68. * @param array $targetsArrays
  69. * @param bool $returnInserted 设为true返回插入的内容
  70. * @param bool $createdAtOn
  71. * @param bool $updatedAtOn
  72. * @return Collection|null
  73. */
  74. function insert(array $targetsArrays, $returnInserted=false, $createdAtOn=true,$updatedAtOn=true): ?Collection
  75. {
  76. if($createdAtOn||$updatedAtOn)$now = now();
  77. foreach ($targetsArrays as &$target){
  78. if($createdAtOn)$target['created_at']= $now;
  79. if($updatedAtOn)$target['updated_at']= $now;
  80. }
  81. ($this->modelClass)::query()->insert($targetsArrays);
  82. LogService::log(__METHOD__, __FUNCTION__, json_encode($targetsArrays) .
  83. '||' . json_encode(array_slice(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), 0, 4)));
  84. if(!$returnInserted)return null;
  85. return ($查回插入内容,不保证准=function ()use($targetsArrays){
  86. $query=($this->modelClass)::query();
  87. foreach ($targetsArrays as &$target){
  88. $query->orWhere(function($subQuery)use($target){
  89. foreach ($target as $key=>$val){
  90. $subQuery->where($key, $val);
  91. }
  92. });
  93. }
  94. return $query->get();
  95. })();
  96. }
  97. }