Manuel Fernández
Manuel Fernández

Reputation: 483

What's the best way to call a controller with MVC?

I'm fairly new to the MVC architecture but I'm picking it up nicely, having my own framework almost done.

Nonetheless, I'm having a 'design issue', how to call the controller?

The controller, as in the function that checks if the user hit the submit button.

Example of controller:

$class->login($_POST['username'], $_POST['password']).

I know a lot of MVC frameworks and apps call it by the URL with $_GET params, but I think it's stupid to have one method or one class for each page that needs a function like logging in.

How do you guys do it? What's your method for this?

Any help is appreciated!

Upvotes: 2

Views: 270

Answers (2)

dqhendricks
dqhendricks

Reputation: 19251

You could have a base controller which contains a function, requireAccess($access_level). Other controllers would extend this controller. requireAccess() would redirect to the login page if the correct access level is not present.

As for redirection using GET variables for clean urls in MVC, I would not recommend this. It could cause problems down the line with wanting variables that contain slashes in them. Instead we would typically want to get the original request uri, and parse it ourselves.

Typically MVC urls follow the pattern /Controller/Action/Id/etc

Upvotes: 1

Brent Baisley
Brent Baisley

Reputation: 12721

You might want to look up the Front Controller concept (and inversion of control), which you are probably already using in some form, but may not know it. The Front Controller analyzes the URL and current state of things, and determines what controller to load.

In my framework I have "routes" that have attributes, one being "require login". The Front Controller determines what "route"/controller needs to be run and checks for pre-requisites for that route, like login requirement. If the user isn't logged in, then the login "route"/controller is loaded instead of the requested "route"/controller. If login is successful, then control is passed to the appropriate "route" controller.

It shouldn't be the job of each controller to manage logins, only one controller should do that, usually the front controller. Any controller should be able to be loaded under any URL since it's the front controller that determines what controller to load. The sub-controllers don't know "why" they are loading, only that they are loading to do their 1 job.

Upvotes: 1

Related Questions