嗨,我目前正在玩PHP MVC编程,并想知道是否有人做了某种"路由"与数据库?
我有一个"page"表,看起来像这样:https://i.stack.imgur.com/KKeFO.png
目前所有的路由都是硬编码的,我认为这一定是可能的与数据库…
但是我不仅想要获得页面并显示它,我还需要能够发送参数。
的例子:如我的页表所示,我有一个"测试"url。如果我输入http://demo.com/test/,我将得到"重新路由"以使用"home"控制器和"Index"方法。但我还需要能够键入http://demo.com/test/id/40和id/40将作为参数发送到控制器/方法。
如果这不是一件好事,或者如果有人有更好的解决方案,请告诉我!:)
问候,弗雷德里克
这当然取决于您使用的服务器,但由于您是PHP MVC新手,我将在本示例中引用apache,并希望它是为了示例的缘故。
首先,你需要你的web服务器配置知道它必须通过你的基本页面(通常是index.php)发送所有流量。现在这个页面会做一些其他的事情(调用bootstrap等),但为了方便讨论,我们说它现在做的就是查看来自页面的请求,将其与DB进行比较,如果可以的话完成请求。
在这种情况下,将来自服务器的请求信息传递到index.php页面将会很有帮助。要做到这一点,您需要使用类似于
的.htaccess文件配置apache:DirectoryIndex index.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ public/?path=$1 [L,QSA]
这告诉它对所有不是特定文件或目录的请求使用index.php,并将完整的url路径作为$_GET var传递给index.php。
接下来,在index.php中,您将需要根据DB的路径检查传递给您的路径。下面是一个非常简单的例子:
<?php
// Obviously use your database and some string parsing here to match correctly
// I generally explode the path on '/' to break it into controller, action, etc.
if ($_GET['path'] == "user/account") {
// Then you call the controller that matches the first part of the route
// The action that matches the second part of your route
// And pass the request along so you can access anything else
call UserController::accountAction($_REQUEST);
} else if ($_GET['path'] == "user/resetpassword") {
call UserController::resetPasswordAction($_REQUEST);
}
从那里,你应该在正确的地方,你需要的一切。控制器/动作URL格式是一种相当常见的格式,因为它很容易让我们做到这一点。
希望答案有帮助!