コード例 #1
0
 /**
  * Sync permissions với actions được 'định nghĩa' trong các resources model
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function sync()
 {
     // actions định nghĩa trong các model
     $resource_actions = app('access-control')->getResourceActions();
     $model_actions = [];
     foreach ($resource_actions as $resource => $actions) {
         $model_actions = array_merge($model_actions, array_map(function ($action) use($resource) {
             return "{$resource}.{$action}";
         }, array_keys($actions)));
     }
     // actions đã lưu trên DB (permissions table)
     $db_actions = array_map(function ($permission) {
         return "{$permission['resource']}.{$permission['action']}";
     }, Permission::all()->toArray());
     // có trong DB, nhưng không có trong model ===> remove
     $remove = array_diff($db_actions, $model_actions);
     foreach ($remove as $action) {
         list($resource, $action_name) = explode('.', $action);
         if ($permission = Permission::whereResource($resource)->whereAction($action_name)->first()) {
             // Permission model sẽ tự động xóa liên kết với roles
             $permission->delete();
         }
     }
     // có định nghĩa trong model, nhưng chưa lưu trong DB ===> insert
     $insert = array_diff($model_actions, $db_actions);
     if ($insert) {
         $permissions = array_map(function ($action) {
             list($resource, $action_name) = explode('.', $action);
             return ['resource' => $resource, 'action' => $action_name];
         }, $insert);
         Permission::insert($permissions);
     }
     return response()->json(['type' => 'success', 'content' => trans('access-control::permission.sync_success')]);
 }