I'm just beginning with PHP, and started with YouTube tutorial about mvc. All went well, but when I started to develop my own application I encountered a problem with routing (I think).
My base application has URL: localhost/mvc/public/.
With the tutorial I created a class which starts a default home controller and index action when those are not specified. So localhost/mvc/public/ is equivalent to localhost/mvc/public/home/index.
In my view I have:
<p>You need to <a href="profile/login">log in</a> or <a href="profile/register">register</a></p>
So when I start with url localhost/mvc/public/ and then click on a link, it goes to localhost/mvc/public/profile/login and everything works fine. But if I write url localhost/mvc/public/home/index and then click a link I go to localhost/mvc/public/home/profile/index which obviously doesn't work. So my question is - how to solve this problem?
If someone is interested, I can post my code.
profile/register
is a relative path, so it is added to the path you already had. Because /home/index
doesn't have a trailing /
, the browser assumes home
is the path and index
is a file or resource name, so home
is kept and profile/register
is added to it.
Solution: change the paths to /profile/register
(with a leading /
) in your links. The /
at the beginning tells the browser to add the path after the bare domain name, instead of choosing a path relative to the current one.
Probably better: add a 'basepath' setting to your application by which it knows what the base path is. In your code you can use this base path when generating paths, for instance:
<a href="<?=$basepath?>profile/register">
If you installed the application in the root, you can set basepath to /
. In your case, you could set it to /mvc/public/
.
Instead of a variable, you can create a function for it too to wrap the setting. If you search for "CodeIgniter base path" you will find plenty of examples of how CodeIgniter (a popular MVC framework) handles this.