自定义

说明

综述所言,只要继承framework\App基类,实现约定的dispatch call error response接口方法功能,就可以创建一个自定义应用模式,这里就来演示下如何实现一个简单自定义应用模式。

访问URLhttp://localhost/?c=Home&a=index,会调用指定的控制器类和方法(其中c指定控制器类a指定控制器方法),并输出页面,如控制器类或方法不存在输出404页面。

实现应用类

下面我们根据需求,继承framework\App基类实现dispatch call error response接口方法。

// APP_DIR/library/MyApp.php
namespace app\library;
use framework\App;
use framework\core\View;
use framework\core\Loader;
use framework\core\http\Request;
use framework\core\http\Response;
class MyApp extends App
{
protected $config = [
// 控制器namespace
'controller_ns' => 'controller',
];
protected function dispatch()
{
// 从Url Query中获取请求控制器类与方法名
$action = Request::get('a', 'index');
$controller = Request::get('c', 'Home');
$class = 'app\\'.$this->config['controller_ns'].'\\'.$controller;
// 检查控制器类与方法是否合法
if (substr($action, 0, 1) !== '_' && Loader::importPrefixClass($class)) {
$controller_instance = new $class;
// 检查控制器方法是否可用
if (is_callable([$controller_instance, $action])) {
return compact('action', 'controller', 'controller_instance');
}
}
return false;
}
protected function call()
{
// 执行控制器方法
return $this->dispatch['controller_instance']->{$this->dispatch['action']}();
}
protected function error($code = 500, $message = null)
{
// 输出视图error页面
Response::send(View::error($code, $message), 'text/html; charset=UTF-8', false);
}
protected function response($return)
{
// 输出视图页面
Response::view('/'.$this->dispatch['controller'].'/'.$this->dispatch['action'], $return);
}
}

编写应用代码

自定义应用模式下App::start方法的第1个参数是自定义应用类名

// APP_DIR/public/index.php
include '../../../framework/app.php';
// 参数使用自定应用类的类名
framework\App::start('app\library\MyApp')->run();
// APP_DIR/controller/Home.php
namespace app\controller;
class Home
{
public function index()
{
return [
'title' => '应用',
'content' => '这是一个自定义应用'
];
}
}

APP_DIR/view/Home/index.php

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?=$title?></title>
</head>
<body>
<p><?=$content?></p>
</body>
</html>

访问页面

实现了自定义应用类并编写了应用代码后,将代码部署到服务器,使用浏览器访问URLhttp://localhost/?c=home&a=index(如果设定了虚拟主机请替换域名部分)。

输出页面如图

查看页面代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用</title>
</head>
<body>
<p>这是一个自定义应用</p>
</body>
</html>