【发布时间】:2018-02-20 03:15:24
【问题描述】:
当我输入这个地址时:
http://localhost/gamelvl/world-of-tanks/tankguide/
我可以进入坦克向导视图。现在这个文件夹里面是另一个名为 ussr 的文件夹,但是当我为 ussr 创建一个控制器和模型时,我无法使用这个地址输入它:
http://localhost/gamelvl/world-of-tanks/tankguide/ussr/
现在,任何人都可以告诉我这是否是正确的事情或其他解决方案?
路由应用
<?php
class App
{
public $controller = 'index';
public $method = 'index';
public $params = [];
function __construct()
{
if (isset($_GET['url'])) {
$url = $_GET['url'];
$url = $this->parseUrl($url);
$this->controller = $url[0];
unset($url[0]);
if (isset($url[1])) {
$this->method = $url[1];
unset($url[1]);
}
$this->params = array_values($url);
}
$controllerurl = 'controllers/' . $this->controller . '.php';
if (file_exists($controllerurl)) {
require($controllerurl);
$object = new $this->controller;
$object->model($this->controller);
if (method_exists($object, $this->method)) {
call_user_func_array([$object, $this->method], $this->params);
}
}
}
function parseUrl($url)
{
filter_var($url, FILTER_SANITIZE_URL);
$url = rtrim($url, '/');
$url = explode('/', $url);
return $url;
}
}
?>
导槽控制器
<?php
class Tankguide extends Controller
{
function index()
{
$this->view('tankguide/index');
}
}
?>
核心控制器
<?php
class Controller
{
function __construct()
{
}
function view($viewUrl,$data=[])
{
require('header.php');
require('views/' . $viewUrl . '.php');
require('footer.php');
}
function model($modelUrl)
{
require('models/model_' . $modelUrl . '.php');
$classname = 'model_' . $modelUrl;
$this->model = new $classname;
}
}
?>
项目结构
【问题讨论】:
-
if (method_exists($object, $this->method))将为给定的 url 返回 false,因为它正在Tankguide类上寻找一个名为ussr的方法。要么在该类上创建一个ussr方法,要么使用一个更灵活的路由器,它不会将 url 链接到文件系统。谷歌php router会发现很多 -
当我在 Tankguide 类中创建 ussr 方法时,如何显示 ussr 方法的 HTML 和 CSS 代码?
-
大概和你在其他路线上的做法一模一样:
function ussr(){$this->view('tankguide/ussr');} -
你的意思是
function ussr(){$this->view('tankguide/ussr/index');}? -
如果您创建了一个名为
ussr的子文件夹并在其中创建了一个名为index.php的“视图”文件,那么可以,尽管直接创建一个ussr.php视图会更有意义在tankguide文件夹中——这是你自己自制的mvc框架吗?
标签: php oop model-view-controller