1+ <?php
2+
3+ namespace Farhoudi \Rbac ;
4+
5+ use Illuminate \Database \Eloquent \Collection ;
6+ use Farhoudi \Rbac \Models \Role ;
7+
8+ /**
9+ * Trait Rbac
10+ */
11+ trait Rbac {
12+
13+ private $ rbacIsLoaded = false ;
14+
15+ private $ roles ;
16+
17+ private $ permissions ;
18+
19+ /**
20+ * @param string|array $role
21+ * @return bool
22+ */
23+ public function hasRole ($ role ) {
24+ if (!$ this ->rbacIsLoaded ) {
25+ $ this ->loadPermissions ();
26+ $ this ->rbacIsLoaded = true ;
27+ }
28+
29+ if (is_array ($ role )) {
30+ foreach ($ role as $ r ) {
31+ if (!$ this ->hasRole ($ r )) {
32+ return false ;
33+ }
34+ }
35+ return true ;
36+ }
37+
38+ $ roles = explode ('| ' , $ role );
39+ foreach ($ roles as $ role ) {
40+ if (!empty ($ this ->roles ->where ('alias ' , $ role )->first ())) {
41+ return true ;
42+ }
43+ }
44+ return false ;
45+ }
46+
47+ /**
48+ * @param string|array $permission
49+ * @return bool
50+ */
51+ public function hasPermission ($ permission ) {
52+ if (!$ this ->rbacIsLoaded ) {
53+ $ this ->loadPermissions ();
54+ $ this ->rbacIsLoaded = true ;
55+ }
56+
57+ if (is_array ($ permission )) {
58+ foreach ($ permission as $ p ) {
59+ if (!$ this ->hasPermission ($ p )) {
60+ return false ;
61+ }
62+ }
63+ return true ;
64+ }
65+
66+ $ permissions = explode ('| ' , $ permission );
67+ foreach ($ permissions as $ permission ) {
68+ if (!empty ($ this ->permissions ->where ('alias ' , $ permission )->first ())) {
69+ return true ;
70+ }
71+ }
72+ return false ;
73+ }
74+
75+ /**
76+ * Assign Role to User
77+ *
78+ * @param string|Role $role
79+ */
80+ public function assignRole ($ role ) {
81+ if (is_array ($ role )) {
82+ foreach ($ role as $ item ) {
83+ $ this ->assignRole ($ item );
84+ }
85+ }
86+
87+ if ($ role instanceof Role) {
88+ if (!$ this ->hasRole ($ role ->alias )) {
89+ $ this ->roles ()->save ($ role );
90+ }
91+ } else if (is_string ($ role )) {
92+ $ role = Role::where ('alias ' , $ role )->first ();
93+ if (!empty ($ role )) {
94+ if (!$ this ->hasRole ($ role ->alias )) {
95+ $ this ->roles ()->save ($ role );
96+ }
97+ }
98+ }
99+
100+ if ($ this ->rbacIsLoaded ) {
101+ $ this ->loadPermissions ();
102+ }
103+ }
104+
105+ public function loadPermissions () {
106+ $ this ->roles = $ this ->roles ()->with (['permissions ' ])->get ();
107+ $ this ->permissions = new Collection ();
108+ foreach ($ this ->roles as $ key => $ role ) {
109+ foreach ($ role ->permissions as $ permission ) {
110+ if (empty ($ this ->permissions ->where ('name ' , $ permission ->name )->first ()) && empty ($ this ->permissions ->where ('alias ' , $ permission ->alias )->first ())) {
111+ $ this ->permissions ->add ($ permission );
112+ }
113+ unset($ role ->permissions );
114+ }
115+ }
116+ return $ this ->permissions ;
117+ }
118+
119+ public function roles () {
120+ return $ this ->belongsToMany (Role::class, 'rbac_role_user ' , 'user_id ' , 'role_id ' );
121+ }
122+
123+ }
0 commit comments