ServiceAppAop.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. namespace App\Traits;
  3. use Illuminate\Contracts\Foundation\Application;
  4. use Illuminate\Support\Collection;
  5. use Illuminate\Support\Facades\Cache;
  6. trait ServiceAppAop
  7. {
  8. /**
  9. * 实例化一个service的入口,为了测试方便做出来的,这样测试时可以代入假的柱件替换service的实现
  10. * 应当在一般性用app的地方换成本方法才可以做到使用柱件
  11. * @param $targetService
  12. * @param $abstract
  13. * @return Application|mixed|string
  14. */
  15. public function instant(&$targetService, $abstract){
  16. if(!is_string($targetService)){
  17. if(empty($targetService))
  18. $targetService=app($abstract);
  19. return $targetService;
  20. }
  21. if(!is_string($abstract)){
  22. $this->$targetService=$abstract;
  23. }else{
  24. $this->$targetService=app($abstract);
  25. }
  26. return $targetService;
  27. }
  28. /**
  29. * 缓存过了
  30. * @param array $kvPairs
  31. * @return Collection|null
  32. */
  33. function get(array $kvPairs):?Collection{
  34. return Cache::remember($this->cachingKey($kvPairs), config('cache.expirations.serviceAutoCache'), function ()use($kvPairs) {
  35. $query = ($this->modelClass)::query();
  36. foreach ($kvPairs as $column => $value){
  37. if (is_array($value))$query->whereIn($column,$value);
  38. else $query->where($column,$value);
  39. }
  40. return $query->get();
  41. });
  42. }
  43. protected function cachingKey(array $kvPairs): string
  44. {
  45. ksort($kvPairs);
  46. return $this->modelClass.md5(json_encode($kvPairs));
  47. }
  48. protected function clearCache(array $kvPairs){
  49. Cache::forget($this->cachingKey($kvPairs));
  50. }
  51. function create(array $kvPairs){
  52. $materialBox=$this->get($kvPairs);
  53. if($materialBox->isNotEmpty())
  54. return $materialBox->first();
  55. $this->clearCache($kvPairs);
  56. return ($this->modelClass)::query()->create($kvPairs);
  57. }
  58. function firstOrCreate(array $kvPairs){
  59. $materialBox=$this->get($kvPairs);
  60. if($materialBox->isNotEmpty())
  61. return $materialBox->first();
  62. $this->clearCache($kvPairs);
  63. return $this->create($kvPairs);
  64. }
  65. }