UseScopeBaseModel.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. <?php
  2. namespace App\Model;
  3. use App\Service\RangeService;
  4. use Illuminate\Database\Eloquent\Model;
  5. class UseScopeBaseModel extends Model
  6. {
  7. //可见范围
  8. const range_function = '';
  9. const is_check_function = '';
  10. public function __construct(array $attributes = [])
  11. {
  12. parent::__construct($attributes);
  13. }
  14. //顶级部门过滤
  15. public function scopeTopClear($query, $user, $search)
  16. {
  17. //是否所有部门
  18. $is_all_depart = $user['is_all_depart'] ?? 0;
  19. //权限范围内的部门
  20. $depart_range = $user['depart_range'] ?? [];
  21. //顶级部门
  22. $search_depart_id = $search['top_depart_id'] ?? 0;
  23. if(empty($search_depart_id)){
  24. //默认进来 自身顶级公司
  25. $top_depart_id = $user['depart_top'][0] ?? [];
  26. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  27. }else{
  28. //查询 顶级公司
  29. $top_depart_id = $search_depart_id;
  30. }
  31. if($is_all_depart){
  32. //所有部门
  33. if(empty($search_depart_id)){
  34. //全部
  35. $query->whereIn('top_depart_id', $depart_range);
  36. }else{
  37. //查看某个分社
  38. $query->where('top_depart_id', $top_depart_id);
  39. }
  40. }else{
  41. //某个分社全部
  42. $query->where('top_depart_id', $top_depart_id);
  43. }
  44. //获取当前门店下
  45. if(! empty($search['get_my_top_depart_data'])){
  46. $depart = ! empty($user['depart_top'][0]) ? $user['depart_top'][0]: [];
  47. $depart_id = $depart['depart_id'] ?? 0;
  48. $query->where('top_depart_id', $depart_id);
  49. }
  50. return $query;
  51. }
  52. //部门和顶级部门(公司)过滤
  53. public function scopeClear($query, $user, $search)
  54. {
  55. //是否所有部门
  56. $is_all_depart = $user['is_all_depart'] ?? 0;
  57. //权限范围内的部门
  58. $depart_range = $user['depart_range'] ?? [];
  59. //我可见的
  60. $is_see = ! empty($search['is_see']);
  61. //全部 待审 待我审核
  62. $is_check = ! empty($search['is_check']);
  63. //个人 部门 所有
  64. $auth_type = $this->getQx($search,$user);
  65. // 获取模型的实例
  66. $model = $query->getModel();
  67. // 获取模型类名
  68. $className = get_class($model);
  69. //可见范围方法
  70. $range_function = "";
  71. if (defined($className . '::range_function')) $range_function = $className::range_function;
  72. $function_range_bool = $this->hasMethod(new RangeService(),$range_function);
  73. //全部 待审 已审
  74. $is_check_function = "";
  75. if (defined($className . '::is_check_function')) $is_check_function = $className::is_check_function;
  76. $is_check_function_bool = $this->hasMethod(new RangeService(),$is_check_function);
  77. //外部传入的
  78. $search_depart_id = $search['top_depart_id'] ?? 0;
  79. //自身的
  80. $my_top_depart_id = $user['depart_top'][0] ?? [];
  81. $my_top_depart_id = $my_top_depart_id['depart_id'] ?? 0;
  82. if(empty($search_depart_id)){
  83. $top_depart_id = $my_top_depart_id;
  84. }else{
  85. if($is_all_depart){
  86. //顶级公司
  87. $top_depart_id = $search_depart_id;
  88. }else{
  89. $top_depart_id = $my_top_depart_id;
  90. }
  91. }
  92. $id = [];
  93. //可见范围 以及单据里面填写人员 (状态类 是全部时检索)
  94. if($function_range_bool) $id = RangeService::$range_function($user,$search);
  95. //全部0 待审1 已审2 (状态类 是全部时检索)
  96. $check_search = "";
  97. if($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user,$search);
  98. if($is_see){
  99. //我可见的
  100. $query->whereIn('id', $id);
  101. }elseif($is_all_depart){
  102. //所有权限
  103. $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $id, $check_search);
  104. }else{
  105. //非所有权限
  106. $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $id, $check_search);
  107. }
  108. if(! empty($search['get_my_top_depart_data'])) $query->where('top_depart_id', $my_top_depart_id);
  109. }
  110. //最高权限
  111. private function allDepart(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $id, $check_search){
  112. if(empty($search_depart_id)){
  113. if ($is_check){
  114. if(! $auth_type){
  115. //全部
  116. $query->when(! empty($check_search), function ($query) use ($check_search) {
  117. return $query->whereRaw($check_search);
  118. });
  119. }elseif($auth_type == 1){
  120. //我创建的 且加上可见
  121. $query->where('crt_id',$user['id'])
  122. ->when(! empty($check_search), function ($query) use ($check_search) {
  123. return $query->whereRaw($check_search);
  124. })
  125. ->when(! empty($id), function ($query) use ($id) {
  126. return $query->orWhereIn('id', $id);
  127. });
  128. }elseif ($auth_type == 2 || $auth_type == 3){
  129. //自己权限范围内的部门 或 所有
  130. $query->whereIn('depart_id', $depart_range)
  131. ->when(! empty($check_search), function ($query) use ($check_search) {
  132. return $query->whereRaw($check_search);
  133. });
  134. }
  135. }else{
  136. if($auth_type == 1) { //我创建的 且加上可见
  137. $query->where('crt_id',$user['id'])
  138. ->when(! empty($id), function ($query) use ($id) {
  139. return $query->orWhereIn('id', $id);
  140. });
  141. }elseif ($auth_type == 2 || $auth_type == 3){
  142. //自己权限范围内的部门 或 所有
  143. $query->whereIn('depart_id', $depart_range);
  144. }
  145. }
  146. }else{
  147. if ($is_check){
  148. if(! $auth_type){
  149. //查看指定公司
  150. $query->where('top_depart_id', $top_depart_id)
  151. ->when(! empty($check_search), function ($query) use ($check_search) {
  152. return $query->whereRaw($check_search);
  153. });
  154. }elseif($auth_type == 1) { //指定公司下 且 我创建的 且加上可见
  155. $query->where('top_depart_id', $top_depart_id)
  156. ->where('crt_id',$user['id'])
  157. ->when(! empty($check_search), function ($query) use ($check_search) {
  158. return $query->whereRaw($check_search);
  159. })
  160. ->when(! empty($id), function ($query) use ($id) {
  161. return $query->orWhereIn('id', $id);
  162. });
  163. }elseif ($auth_type == 2 || $auth_type == 3){
  164. // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
  165. $query->where('top_depart_id', $top_depart_id)
  166. ->whereIn('depart_id', $depart_range)
  167. ->when(! empty($check_search), function ($query) use ($check_search) {
  168. return $query->whereRaw($check_search);
  169. })
  170. ->when(! empty($id), function ($query) use ($id) {
  171. return $query->orWhereIn('id', $id);
  172. });
  173. }
  174. }else{
  175. if(! $auth_type){
  176. //查看指定公司
  177. $query->where('top_depart_id', $top_depart_id);
  178. }elseif($auth_type == 1) { //指定公司下 且 我创建的 且加上可见
  179. $query->where('top_depart_id', $top_depart_id)
  180. ->where('crt_id',$user['id'])
  181. ->when(! empty($id), function ($query) use ($id) {
  182. return $query->orWhereIn('id', $id);
  183. });
  184. }elseif ($auth_type == 2 || $auth_type == 3){
  185. // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
  186. $query->where('top_depart_id', $top_depart_id)
  187. ->whereIn('depart_id', $depart_range)
  188. ->when(! empty($id), function ($query) use ($id) {
  189. return $query->orWhereIn('id', $id);
  190. });
  191. }
  192. }
  193. }
  194. }
  195. //非所有权限
  196. private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $id, $check_search){
  197. if ($is_check){
  198. if(! $auth_type || $auth_type == 3){
  199. //指定公司下全部 且加上可见
  200. $query->where('top_depart_id', $top_depart_id)
  201. ->when(! empty($check_search), function ($query) use ($check_search) {
  202. return $query->whereRaw($check_search);
  203. })
  204. ->when(! empty($id), function ($query) use ($id) {
  205. return $query->orWhereIn('id', $id);
  206. });
  207. }else if($auth_type == 1) {
  208. //指定公司下 且 我创建的 且加上可见
  209. $query->where('top_depart_id', $top_depart_id)
  210. ->where('crt_id',$user['id'])
  211. ->when(! empty($check_search), function ($query) use ($check_search) {
  212. return $query->whereRaw($check_search);
  213. })
  214. ->when(! empty($id), function ($query) use ($id) {
  215. return $query->orWhereIn('id', $id);
  216. });
  217. }elseif ($auth_type == 2) {
  218. //指定公司下 且 自己权限范围内的部门 且加上可见
  219. $query->where('top_depart_id', $top_depart_id)
  220. ->whereIn('depart_id', $depart_range)
  221. ->when(! empty($check_search), function ($query) use ($check_search) {
  222. return $query->whereRaw($check_search);
  223. })
  224. ->when(! empty($id), function ($query) use ($id) {
  225. return $query->orWhereIn('id', $id);
  226. });
  227. }
  228. }else{
  229. if(! $auth_type || $auth_type == 3){
  230. //指定公司下全部|所有 且加上可见
  231. $query->where('top_depart_id', $top_depart_id)
  232. ->when(! empty($id), function ($query) use ($id) {
  233. return $query->orWhereIn('id', $id);
  234. });
  235. }elseif($auth_type == 1) {
  236. //指定公司下 且 我创建的 且加上可见
  237. $query->where('top_depart_id', $top_depart_id)
  238. ->where('crt_id',$user['id'])
  239. ->when(! empty($id), function ($query) use ($id) {
  240. return $query->orWhereIn('id', $id);
  241. });
  242. }elseif ($auth_type == 2) {
  243. //指定公司下 且 自己权限范围内的部门 且加上可见
  244. $query->where('top_depart_id', $top_depart_id)
  245. ->whereIn('depart_id', $depart_range)
  246. ->when(! empty($id), function ($query) use ($id) {
  247. return $query->orWhereIn('id', $id);
  248. });
  249. }
  250. }
  251. }
  252. //部门和顶级部门(公司)过滤 取别名a
  253. public function scopeAClear($query, $user, $search)
  254. {
  255. //是否所有部门
  256. $is_all_depart = $user['is_all_depart'] ?? 0;
  257. //权限范围内的部门
  258. $depart_range = $user['depart_range'] ?? [];
  259. //我可见的
  260. $is_see = $search['is_see'] ?? 0;
  261. //可见范围方法
  262. $model = $query->getModel(); // 获取模型的实例
  263. $range_function = $model::range_function ?? ""; // 访问静态属性
  264. $is_function_range = $this->hasMethod(new RangeService(),$range_function);
  265. //顶级部门
  266. $search_depart_id = $search['top_depart_id'] ?? 0; //顶级公司
  267. if(empty($search_depart_id)){
  268. //默认进来 自身顶级公司
  269. $top_depart_id = $user['depart_top'][0] ?? [];
  270. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  271. }else{
  272. //查询 顶级公司
  273. $top_depart_id = $search_depart_id;
  274. }
  275. $id = [];
  276. //可见范围 以及单据里面填写人员
  277. if($is_function_range) $id = RangeService::$range_function($user,$search);
  278. //个人部门所有
  279. $auth_type = $this->getQx($search,$user);
  280. if($is_all_depart){
  281. //所有权限
  282. if(empty($search_depart_id)){
  283. if(! $is_see){
  284. if(! $auth_type){
  285. //全部
  286. $query->whereIn('a.depart_id', $depart_range);
  287. }else{
  288. if($auth_type == 1) { //我创建的 且加上可见
  289. $query->where('a.crt_id',$user['id'])
  290. ->orWhereIn('a.id', $id);
  291. }elseif ($auth_type == 2 || $auth_type == 3){
  292. //自己权限范围内的部门 或 所有
  293. $query->whereIn('a.depart_id', $depart_range);
  294. }
  295. }
  296. }else{
  297. //可见
  298. $query->whereIn('a.id', $id);
  299. }
  300. }else{
  301. if(! $is_see){
  302. if(! $auth_type){
  303. //查看指定公司
  304. $query->where('a.top_depart_id', $top_depart_id);
  305. }else{
  306. if($auth_type == 1) { //指定公司下 且 我创建的 且加上可见
  307. $query->where('a.top_depart_id', $top_depart_id)
  308. ->where('a.crt_id',$user['id'])
  309. ->orWhereIn('a.id', $id);
  310. }elseif ($auth_type == 2 || $auth_type == 3){
  311. // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
  312. $query->where('a.top_depart_id', $top_depart_id)
  313. ->whereIn('a.depart_id', $depart_range)
  314. ->orWhereIn('a.id', $id);
  315. }
  316. }
  317. }else{
  318. //查看指定公司 且 我可见
  319. $query->whereIn('a.id', $id);
  320. }
  321. }
  322. }else{
  323. //非所有权限
  324. if(! $is_see){
  325. if(! $auth_type){
  326. //指定公司下全部 且加上可见
  327. $query->where('a.top_depart_id', $top_depart_id)
  328. ->whereIn('a.depart_id', $depart_range)
  329. ->orWhereIn('a.id', $id);
  330. }else{
  331. if($auth_type == 1) {
  332. //指定公司下 且 我创建的 且加上可见
  333. $query->where('a.top_depart_id', $top_depart_id)
  334. ->where('a.crt_id',$user['id'])
  335. ->orWhereIn('a.id', $id);
  336. }elseif ($auth_type == 2) {
  337. //指定公司下 且 自己权限范围内的部门 且加上可见
  338. $query->where('a.top_depart_id', $top_depart_id)
  339. ->whereIn('a.depart_id', $depart_range)
  340. ->orWhereIn('a.id', $id);
  341. }elseif ($auth_type == 3) {
  342. // 指定公司下所有 且加上可见
  343. $query->where('a.top_depart_id', $top_depart_id)
  344. ->orWhereIn('a.id', $id);
  345. }
  346. }
  347. }else{
  348. //某个分社可见
  349. $query->whereIn('a.id', $id);
  350. }
  351. }
  352. }
  353. //顶级部门过滤 取别名a
  354. public function scopeATopClear($query, $user, $search)
  355. {
  356. //是否所有部门
  357. $is_all_depart = $user['is_all_depart'] ?? 0;
  358. //权限范围内的部门
  359. $depart_range = $user['depart_range'] ?? [];
  360. //顶级部门
  361. $search_depart_id = $search['top_depart_id'] ?? 0;
  362. if(empty($search_depart_id)){
  363. //默认进来 自身顶级公司
  364. $top_depart_id = $user['depart_top'][0] ?? [];
  365. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  366. }else{
  367. //查询 顶级公司
  368. $top_depart_id = $search_depart_id;
  369. }
  370. if($is_all_depart){
  371. //所有部门
  372. if(empty($search_depart_id)){
  373. //全部
  374. $query->whereIn('a.top_depart_id', $depart_range);
  375. }else{
  376. //查看某个分社
  377. $query->where('a.top_depart_id', $top_depart_id);
  378. }
  379. }else{
  380. //某个分社全部
  381. $query->where('a.top_depart_id', $top_depart_id);
  382. }
  383. return $query;
  384. }
  385. //产品不可见 部门和顶级部门(公司)过滤
  386. public function scopeProductClear($query, $user, $search)
  387. {
  388. //是否所有部门
  389. $is_all_depart = $user['is_all_depart'] ?? 0;
  390. //权限范围内的部门
  391. $depart_range = $user['depart_range'] ?? [];
  392. //总社id
  393. $top_depart_id = $user['head'] ?? [];
  394. $top_depart = $top_depart_id['id'] ?? 0;
  395. //可见范围方法
  396. $model = $query->getModel(); // 获取模型的实例
  397. $range_function = $model::range_function ?? ""; // 访问静态属性
  398. $is_function_range = $this->hasMethod(new RangeService(),$range_function);
  399. //顶级部门
  400. $search_depart_id = $search['top_depart_id'] ?? 0; //顶级公司
  401. if(empty($search_depart_id)){
  402. //默认进来 自身顶级公司
  403. $top_depart_id = $user['depart_top'][0] ?? [];
  404. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  405. }else{
  406. //查询 顶级公司
  407. $top_depart_id = $search_depart_id;
  408. }
  409. $id = [];
  410. //产品 不可见范围
  411. if($is_function_range) $id = RangeService::$range_function($user,$search);
  412. if($is_all_depart){
  413. //所有部门
  414. if(empty($search_depart_id)){
  415. //全部
  416. $query->whereIn('depart_id', $depart_range);
  417. }else{
  418. //查看某个分社
  419. $query->where('top_depart_id', $top_depart_id);
  420. }
  421. }else{
  422. //某个分社全部 去掉不可见数
  423. $query->where('top_depart_id', $top_depart_id)
  424. ->whereIn('depart_id', $depart_range)
  425. ->orWhere('top_depart_id',$top_depart)
  426. ->whereNotIn('id', $id);
  427. }
  428. }
  429. //产品不可见 部门和顶级部门(公司)过滤
  430. public function scopeProductClear2($query, $user, $search)
  431. {
  432. //是否所有部门
  433. $is_all_depart = $user['is_all_depart'] ?? 0;
  434. //权限范围内的部门
  435. $depart_range = $user['depart_range'] ?? [];
  436. //总社id
  437. $top_depart_id = $user['head'] ?? [];
  438. $top_depart = $top_depart_id['id'] ?? 0;
  439. //可见范围方法
  440. $model = $query->getModel(); // 获取模型的实例
  441. $range_function = $model::range_function ?? ""; // 访问静态属性
  442. $is_function_range = $this->hasMethod(new RangeService(),$range_function);
  443. //顶级部门
  444. $search_depart_id = $search['top_depart_id'] ?? 0; //顶级公司
  445. if(empty($search_depart_id)){
  446. //默认进来 自身顶级公司
  447. $top_depart_id = $user['depart_top'][0] ?? [];
  448. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  449. }else{
  450. //查询 顶级公司
  451. $top_depart_id = $search_depart_id;
  452. }
  453. $id = [];
  454. //产品 不可见范围
  455. if($is_function_range) $id = RangeService::$range_function($user,$search);
  456. if($is_all_depart){
  457. //所有部门
  458. if(empty($search_depart_id)){
  459. //全部
  460. $query->whereIn('depart_id', $depart_range);
  461. }else{
  462. //查看某个分社
  463. $query->where('top_depart_id', $top_depart_id)
  464. ->orWhere('top_depart_id',$top_depart);
  465. }
  466. }else{
  467. //某个分社全部 去掉不可见数
  468. $query->where('top_depart_id', $top_depart_id)
  469. ->whereIn('depart_id', $depart_range)
  470. ->orWhere('top_depart_id',$top_depart)
  471. ->whereNotIn('id', $id);
  472. }
  473. }
  474. //活动包 部门和顶级部门(公司)过滤
  475. public function scopeSportsBagClear($query, $user, $search)
  476. {
  477. //是否所有部门
  478. $is_all_depart = $user['is_all_depart'] ?? 0;
  479. //权限范围内的部门
  480. $depart_range = $user['depart_range'] ?? [];
  481. //总社id
  482. $top_depart_id = $user['head'] ?? [];
  483. $top_depart = $top_depart_id['id'] ?? 0;
  484. //可见范围方法
  485. $model = $query->getModel(); // 获取模型的实例
  486. $range_function = $model::range_function ?? ""; // 访问静态属性
  487. $is_function_range = $this->hasMethod(new RangeService(),$range_function);
  488. $model = $query->getModel(); // 获取模型的实例
  489. $className = get_class($model); // 获取模型类名
  490. //全部 待审 待我审核
  491. if(isset($search['is_check'])){
  492. if($search['is_check']){
  493. $is_check = $search['is_check'];
  494. }else{
  495. $is_check = 0;
  496. }
  497. }else{
  498. $is_check = 0;
  499. }
  500. //全部 待审 已审
  501. $is_check_function = "";
  502. if (defined($className . '::is_check_function')) $is_check_function = $className::is_check_function;
  503. $is_check_function_bool = $this->hasMethod(new RangeService(),$is_check_function);
  504. //全部0 待审1 已审2 (状态类 是全部时检索)
  505. $check_search = "";
  506. if($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user,$search);
  507. //顶级部门
  508. $search_depart_id = $search['top_depart_id'] ?? 0; //顶级公司
  509. if(empty($search_depart_id)){
  510. //默认进来 自身顶级公司
  511. $top_depart_id = $user['depart_top'][0] ?? [];
  512. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  513. }else{
  514. //查询 顶级公司
  515. $top_depart_id = $search_depart_id;
  516. }
  517. $id = [];
  518. //不可见范围
  519. if($is_function_range) $id = RangeService::$range_function($user,$search);
  520. if($is_all_depart){
  521. //所有部门
  522. if(empty($search_depart_id)){
  523. //全部
  524. $query->whereIn('depart_id', $depart_range)
  525. ->when(! empty($check_search), function ($query) use ($check_search) {
  526. return $query->whereRaw($check_search);
  527. });
  528. }else{
  529. //查看某个分社
  530. $query->where('top_depart_id', $top_depart_id)
  531. ->when(! empty($check_search), function ($query) use ($check_search) {
  532. return $query->whereRaw($check_search);
  533. });
  534. }
  535. }else{
  536. if($check_search){
  537. $check_search2 = "(" . $check_search . " And top_depart_id = {$top_depart})";
  538. } else{
  539. $check_search2 = "(top_depart_id = {$top_depart})";
  540. }
  541. //某个分社全部 去掉不可见数
  542. $query->where('top_depart_id', $top_depart_id)
  543. ->when(! empty($check_search), function ($query) use ($check_search) {
  544. return $query->whereRaw($check_search);
  545. })
  546. ->whereIn('depart_id', $depart_range)
  547. ->whereNotIn('id', $id)
  548. ->OrWhereRaw($check_search2);
  549. }
  550. }
  551. public function getQx($data, $user){
  552. if(empty($data['menu_id'])) return 0;
  553. if($user['id'] == Employee::SPECIAL_ADMIN) return 0;
  554. if(! empty($user['role_authority'][$data['menu_id']])) {
  555. //指定菜单 显示对应权限
  556. return $user['role_authority'][$data['menu_id']];
  557. }else{
  558. return 0;
  559. }
  560. }
  561. function hasMethod($class, $methodName)
  562. {
  563. $reflection = new \ReflectionClass($class);
  564. return $reflection->hasMethod($methodName);
  565. }
  566. }