简体   繁体   中英

Laravel 5 Calling a class within a controller

Pre-info: Laravel 5 is my first framework I've used besides our custom framework that we've created over the years. I'm still wrapping my head around the concepts but its mostly all there. I have page calls, authorization checks, form submission and db queries all working.

The issue: In the past I would create a new class "Access" and I'd call the function desired wherever I'd need to:

$access = Access::getAccessByAccount($accountID);

My hope is to do the same in laravel somehow and be able to call this public function from within a controller.. I just don't know how to call it and where to actually store the function.

Here is a sample of the function I'd like to call:

 public function getAccessByAccount($accountID){
     //Grab all access rights set to given account ID
     $accessList = DB::table('element_access')
                ->join('element', 'element.id', '=', 'element_access.element_id')
                ->select('element.name as element', 'element_access.permission as permission')
                ->where('element_access.account_id', $accountID)
                ->get();



    //Return $access[element] = permission list or false if no access rights are assigned to account ID
    if(is_array($accessList)){
        $access = array();
        foreach($accessList as $item){
            $access[$item->element] = $item->permission;
        }
        return $access;
    }else{
        return false;
    }
}

Here is how I'd like to somehow be able to call it in a controller:

<?php namespace App\Http\Controllers\Portal\Admin;

use App\Http\Controllers\Controller;

class AdminController extends Controller {
    public function showAdminDashboard(){
        $access = Access::getAccessByAccount(Auth::id());
        if($access['admin-dashboard'] == 'r'){
            return view('portal.admin.dashboard');
        }
    }
}

EDITS:

Here is the solution I came up with with the help of the checked solution.

Created new file: app\\Library\\Access.php

<?php namespace App\Library;

use DB;
class Access{
    public function getElementAccessByAccount($accountID){
        //Grab all access rights set to given account ID
        return DB::table('element_access')
                ->join('element', 'element.id', '=', 'element_access.element_id')
                ->select('element.name as element', 'element_access.permission as permission')
                ->where('element_access.account_id', $accountID)
                ->get();

    }
}

To call the function:

$access = new \App\Library\Access;
$accessList = $access->getElementAccessByAccount(Auth::id());

If I was in your shoes, I would store all classes of custom functionalities to the app/services directory.

Access class

<?php namespace App\Services;

class Access
{
    public static function getAccessByAccount($accountID) {
        //Grab all access rights set to given account ID
        $accessList = \DB::table('element_access')
            ->join('element', 'element.id', '=', 'element_access.element_id')
            ->select('element.name as element', 'element_access.permission as permission')
            ->where('element_access.account_id', $accountID)
            ->get();

        //Return $access[element] = permission list or false if no access rights are assigned to account ID
        if (is_array($accessList)) {
            $access = array();
            foreach($accessList as $item){
                $access[$item['element']] = $item['permission'];
            }
            return $access;
        } else{
            return false;
        }
    }
}

Controller

<?php namespace App\Http\Controllers\Portal\Admin;

use App\Http\Controllers\Controller;

class AdminController extends Controller
{
    public function showAdminDashboard() {
        $access = \App\Services\Access::getAccessByAccount(\Auth::id());
        if($access['admin-dashboard'] == 'r') {
            return view('portal.admin.dashboard');
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM