Cai*_*ius 0 php apache .htaccess apache2
我想使用MVC模式将我的逻辑从演示文稿和数据中划分出来。
好吧,我一直在寻找我。但事实是,我什至不知道要搜索什么。
我正在尝试在php中设置MVC框架。我正在关注youtube上的教程,并且停留在路由点。
我已经阅读了很多指南,每个指南都以不同的方式讲课,只会造成更多的混乱。
关键是这样的:
我有一个.htaccess文件,其中包含一些指令(但是问题是我不知道所有这些指令的含义。我从未理解过htaccess逻辑)
Options -MultiViews
RewriteEngine On
#I think this sets the base url of the site?
RewriteBase /~caiuscitiriga/mvc/public
#What does this mean??
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#AND THIS?!
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)
然后我有这些php脚本:
<?php
require_once '../app/init.php';
$app = new App();
Run Code Online (Sandbox Code Playgroud)
<?php
require_once 'core/App.php';
require_once 'core/Controller.php';
Run Code Online (Sandbox Code Playgroud)
不要问我为什么使用filter_var和rtrim。因为这正是我要弄清楚的。如我之前所说,此代码不是我的。我敢肯定,把戏完全在.htacess和App.php中,但我不明白其逻辑
class App{
protected $controller = 'home';
protected $method = 'index';
protected $params = [];
public function __construct()
{
print_r($this->parseUrl());
}
public function parseUrl()
{
if(isset($_GET['url']))
{
return $url = explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL));
}
}
}
Run Code Online (Sandbox Code Playgroud)
<?php
class Controller{
}
Run Code Online (Sandbox Code Playgroud)
<?php
class Home extends Controller{
public function index()
{
echo 'home/index';
}
}
Run Code Online (Sandbox Code Playgroud)
如果我通过以下网址:localhost /〜caiuscitiriga / mvc / public / home / index / maxine
我得到了:数组([0] => home [1] =>索引[2] => maxine)
为什么?!!?我的意思是,这是正确的。但为什么??
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)
我将上面的内容理解为:如果请求不是目录,也不是文件,则采用路径并将其内部传递给index.php,并将url属性作为路径。
所以现在
//example.com/big/bad/mamma
Run Code Online (Sandbox Code Playgroud)
映射到
//example.com/index.php?url=big/bad/mamma
Run Code Online (Sandbox Code Playgroud)
您可以根据需要调用上述脚本。
然后,您的解析网址将采用url的值(“大/坏/妈妈”),如果有,则删除尾部斜杠。然后在遇到正斜杠的任何地方分割字符串。因此,您将分为三个部分。数组中有哪个。
从手册:
FILTER_SANITIZE_URL过滤器将除去字母,数字和$ -_。+!*'(),{} | \ ^〜[]`<>#%“; /?:@&=以外的所有字符。
但是,如果您想了解这些内容,请对其进行分解:
$url = $_GET['url'];
var_dump($url);
$url = rtrim($url, '/');
var_dump($url);
$url = filter_var($url, FILTER_SANITIZE_URL);
var_dump($url);
$url = explode('/', $url);
var_dump($url);
Run Code Online (Sandbox Code Playgroud)