上一章我阐述了如何修改sspanel的视图,这一章为大家带来页面定向控制以及controller代码的修改
我们知道ssapnelV3是基于mvc架构,页面的访问并不是直接访问到页面文件,而是由controller处理后再返回的html源码。我也提及到,网页的根目录是public,不过关于页面定向的实际处理文件是的app文件夹下的routes.php(不同魔改版本位置略有差异,例如glzjin的魔改版本位置是config文件夹下)具体位置可以在public的index.php中找到
————————————————
<?php
// PUBLIC_PATH
define('PUBLIC_PATH', __DIR__);
// Bootstrap
require PUBLIC_PATH . '/../bootstrap/app.php';
// Build Slim App
$app = require BASE_PATH . '/app/routes.php';
// Run ButterFly!
$app->run();
这里的routes.php是在app目录下,打开这个文件
<?php
use App\Controllers;
use App\Middleware\Admin;
use App\Middleware\Api;
use App\Middleware\Auth;
use App\Middleware\Guest;
use App\Middleware\Mu;
use Slim\App;
use Zeuxisoo\Whoops\Provider\Slim\WhoopsMiddleware;
/***
* The slim documents: http://www.slimframework.com/docs/objects/router.html
*/
// config
$debug = false;
if (defined("DEBUG")) {
$debug = true;
}
// Make a Slim App
// $app = new App($c)
$app = new App([
'settings' => [
'debug' => $debug,
'whoops.editor' => 'sublime'
]
]);
$app->add(new WhoopsMiddleware);
// Home
$app->get('/', 'App\Controllers\HomeController:index');
$app->get('/code', 'App\Controllers\HomeController:code');
$app->get('/tos', 'App\Controllers\HomeController:tos');
$app->get('/debug', 'App\Controllers\HomeController:debug');
$app->post('/debug', 'App\Controllers\HomeController:postDebug');
//$app->get('/about', 'App\Controllers\HomeController:about');
$app->get('/client', 'App\Controllers\HomeController:client');
$app->get('/nodeList', 'App\Controllers\UserController:nodeList');
// User Center
$app->group('/user', function () {
$this->get('', 'App\Controllers\UserController:index');
$this->get('/', 'App\Controllers\UserController:index');
$this->post('/checkin', 'App\Controllers\UserController:doCheckin');
$this->get('/node', 'App\Controllers\UserController:node');
$this->get('/node/{id}', 'App\Controllers\UserController:nodeInfo');
$this->get('/profile', 'App\Controllers\UserController:profile');
$this->get('/invite', 'App\Controllers\UserController:invite');
$this->post('/invite', 'App\Controllers\UserController:doInvite');
$this->get('/edit', 'App\Controllers\UserController:edit');
$this->post('/password', 'App\Controllers\UserController:updatePassword');
$this->post('/sspwd', 'App\Controllers\UserController:updateSsPwd');
$this->post('/method', 'App\Controllers\UserController:updateMethod');
$this->get('/sys', 'App\Controllers\UserController:sys');
$this->get('/trafficlog', 'App\Controllers\UserController:trafficLog');
$this->get('/kill', 'App\Controllers\UserController:kill');
$this->post('/kill', 'App\Controllers\UserController:handleKill');
$this->get('/logout', 'App\Controllers\UserController:logout');
})->add(new Auth());
最上层引用了controller的目录,如果自己有新增的目录,也要引用进来,我们可以看到注释 //home、//user Center,其下分别是主页这一块的页面、用户中心这一块的页面,$app->group(‘/user’, function () {起到了一个分组的作用,在这个组里是以/user为根路径,例如www.baidu.com,指向的是home,www.baidu.com/user,指向的就是user下的处理。
这个是我修改后的代码,所以能够看到新增的两行
$app->get(‘/client’, ‘App\Controllers\HomeController:client’);
$app->get(‘/nodeList’, ‘App\Controllers\UserController:nodeList’);
如果在浏览器中访问www.baidu.com/client,那么这个路径就会由App\Controllers\HomeController:client这个方法去处理,HomeController就是页面的控制器,按图索骥找到app\controller下的源码文件
/**
* HomeController
*/
class HomeController extends BaseController
{
public function index()
{
$homeIndexMsg = DbConfig::get('home-index');
return $this->view()->assign('homeIndexMsg', $homeIndexMsg)->display('index.tpl');
}
public function code()
{
$msg = DbConfig::get('home-code');
$codes = InviteCode::where('user_id', '=', '0')->take(10)->get();
return $this->view()->assign('codes', $codes)->assign('msg', $msg)->display('code.tpl');
}
public function debug($request, $response, $args)
{
$server = [
"headers" => $request->getHeaders(),
"content_type" => $request->getContentType()
];
$res = [
"server_info" => $server,
"ip" => Http::getClientIP(),
"version" => Config::get('version'),
"reg_count" => Check::getIpRegCount(Http::getClientIP()),
];
Logger::debug(json_encode($res));
return $this->echoJson($response, $res);
}
public function tos()
{
return $this->view()->display('tos.tpl');
}
public function client()
{
return $this->view()->display('client.tpl');
}
最后一行可以找到我加入代码引用的client方法,返回了client.tpl这个页面,这里并没有代码的处理,只是简单的返回了一个静态页面,如果按照我的写法,那么我们就新增了一个client页面,通过www.baidu.com/client.tpl可以访问到这个页面(别忘了把百度换成你自己的域名)。可能有人会疑惑,$this->view()->display(‘client.tpl’);我的client.tpl界面在哪里,这里的view对象是在HomeController继承的BaseController中所定义的,上一章我说了view资源文件的位置,具体的view引用和app\Services\View.php有关,作者在其中有相应注释,有兴趣的道友可以去看一下,这里不再讲解。这里也可以新增一个api方法,不返回页面,代码雷同
public function debug($request, $response, $args)
{
$server = [
"headers" => $request->getHeaders(),
"content_type" => $request->getContentType()
];
$res = [
"server_info" => $server,
"ip" => Http::getClientIP(),
"version" => Config::get('version'),
"reg_count" => Check::getIpRegCount(Http::getClientIP()),
];
Logger::debug(json_encode($res));
return $this->echoJson($response, $res);
}
可以获取请求的参数,处理后通过response返回json或其他格式数据。
上面我们新增了一个静态页面,如果要加一个动态页面那该如何?上段代码中,有个主页的index方法
public function index()
{
$homeIndexMsg = DbConfig::get('home-index');
return $this->view()->assign('homeIndexMsg', $homeIndexMsg)->display('index.tpl');
}
->assign(‘homeIndexMsg’, $homeIndexMsg)这个方法就是向view传递数据对象,类似于map键值对,键是homeIndexMsg,值是$homeIndexMsg对象,在对应的index.tpl中就可以通过键引用到对象的值
<div class="section no-pad-bot" id="index-banner">
<div class="container">
<br><br>
<h1 class="header center orange-text">{$config["appName"]}</h1>
<div class="row center">
<h5 class="header col s12 light">轻松科学上网 保护个人隐私</h5>
{$homeIndexMsg}
</div>
{if $user->isLogin}
<div class="row center">
<a href="/user" id="download-button" class="btn-large waves-effect waves-light orange">进入用户中心</a>
</div>
{else}
<div class="row center">
<a href="/auth/register" id="download-button" class="btn-large waves-effect waves-light orange">立即注册</a>
</div>
{/if}
<br><br>
</div>
</div>
想必有人会疑惑,我们看到了传入的对象被引用,还有另外两个对象config、user,并没有看见传入,这两个对象是在view中被默认传入的,在所有页面中都可以直接调用,打开app\Services\View.php就可以看到对应的代码,在//add config注释下面几行,将这些配置信息以及个人信息传入
————————————————
<?php
namespace App\Services;
use Smarty;
class View
{
public static function getSmarty(){
$smarty=new smarty(); //实例化smarty
$smarty->settemplatedir(BASE_PATH.'/resources/views/'.Config::get('theme').'/'); //设置模板文件存放目录
$smarty->setcompiledir(BASE_PATH.'/storage/framework/smarty/compile/'); //设置生成文件存放目录
$smarty->setcachedir(BASE_PATH.'/storage/framework/smarty/cache/'); //设置缓存文件存放目录
// add config
$smarty->assign('config',Config::getPublicConfig());
$smarty->assign('user',Auth::getUser());
$smarty->assign('analyticsCode',DbConfig::get('analytics-code'));
return $smarty;
}
}