Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

mdev11's avatar

Different types of admissions

I'm building a project for a centre of courses. There are multiple branches of the centre + roles and permissions. So each admission belongs to a branch and each user within a branch can only see related admissions if he has the permissions or sees all the admissions if he is a super admin or has the permission to.

There are 4 different admissions with a common table admissions. Each admission has its own other tables and the same functions like view, edit, delete, pdf ..etc.

admissions:

id | name | type_id | branch_id

type_one_related_1:

id | column1 | column2

type_one_related_2:

id | column1 | column2

..etc.

I have different options to achieve that: 1- Create one controller for all:

class Admission extends Controller
{
    public function index(Request $request, $admissionType){
        switch($admissionType){
            case 1:
			    if($request->user()->cannot('viewTypeOne', Admission::class)){
					return redirect()->route('home');
    			}

                $admission = Admission::where('type_id', $admissionType)->with('type_one');

                break;
            case 2:
                ..
        }
    }

	public function edit(AdmissionEditRequest $request, Admission $admission){
		switch($admission->type_id){
			case 1:
				if($request->user()->cannot('editTypeOne',  $admission){
					return redirect()->route('home');
				}

				$admission->load('type_one');
			}
	}

	public function pdf(Request $request, Admission $admission){
		switch($admission->type_id){
			case 1:
				if($request->user()->cannot('viewTypeOne',  $admission){
					return redirect()->route('home');
				}

				$admission->load('type_one');
			}
	}
}

2- Separate each time with its own controller: TypeOneController:

class TypeOneController extends Controller
{
	public function index(Request $request, TypeOne $typeOne){
		 if($request->user()->cannot('viewTypeOne', $typeOne)){
			return redirect()->route('home');
    	}
	}

	..
}

TypeTwoController:

class TypeTwoController extends Controller
{
	public function index(Request $request, TypeTwo $typeTwo){
		 if($request->user()->cannot('viewTypeTwo', $typeTwo)){
			return redirect()->route('home');
    	}
	}

	..
}

3- Create a base controller for admissions + separate controllers:

class BaseAdmission extends Controller
{
	public $view;
	public $model;
	public $table;
	public $join;

	public function index(Request $request){
		 if($request->user()->cannot($this->view, $this->model)){
			return redirect()->route('home');
    	}

		$modelData = DB::table($this->table )
		->join($this->join)
		->get();
	}
}

class TypeOneController extends BaseAdmission
{
	public function __construct(){
		$this->view = 'viewTypeOne';
		$this->model = TypeOne::class;
        $this->table = 'admissions';
		$this->join = 'type_one_related_data';
	}
}

Which case would be better?

Is there a better method?

0 likes
4 replies
mdev11's avatar

@Randy_Johnson

I use policies. My question is about the structure of controllers/views/models in this case

mdev11's avatar

@Randy_Johnson

I'm not talking about the files/directories. I mean the code structure for a such model with multiple types, 4 in my case

Please or to participate in this conversation.