上一章我阐述了如何修改sspanel的视图,这一章为大家带来页面定向控制以及controller代码的修改


我们知道ssapnelV3是基于mvc架构,页面的访问并不是直接访问到页面文件,而是由controller处理后再返回的html源码。我也提及到,网页的根目录是public,不过关于页面定向的实际处理文件是的app文件夹下的routes.php(不同魔改版本位置略有差异,例如glzjin的魔改版本位置是config文件夹下)具体位置可以在public的index.php中找到


[php] view plain copy

  1. <?php  

  2.   

  3.   

  4. //  PUBLIC_PATH  

  5. define('PUBLIC_PATH', __DIR__);  

  6.   

  7.   

  8. // Bootstrap  

  9. require PUBLIC_PATH . '/../bootstrap/app.php';  

  10.   

  11.   

  12. // Build Slim App  

  13. $app = require BASE_PATH . '/app/routes.php';  

  14.   

  15.   

  16. // Run ButterFly!  

  17. $app->run();  


这里的routes.php是在app目录下,打开这个文件


[php] view plain copy

  1. <?php  

  2.   

  3. use App\Controllers;  

  4. use App\Middleware\Admin;  

  5. use App\Middleware\Api;  

  6. use App\Middleware\Auth;  

  7. use App\Middleware\Guest;  

  8. use App\Middleware\Mu;  

  9. use Slim\App;  

  10. use Zeuxisoo\Whoops\Provider\Slim\WhoopsMiddleware;  

  11.   

  12. /*** 

  13.  * The slim documents: http://www.slimframework.com/docs/objects/router.html 

  14.  */  

  15.   

  16. // config  

  17. $debug = false;  

  18. if (defined("DEBUG")) {  

  19.     $debug = true;  

  20. }  

  21.   

  22. // Make a Slim App  

  23. // $app = new App($c)  

  24. $app = new App([  

  25.     'settings' => [  

  26.         'debug' => $debug,  

  27.         'whoops.editor' => 'sublime'  

  28.     ]  

  29. ]);  

  30. $app->add(new WhoopsMiddleware);  

  31.   

  32.   

  33. // Home  

  34. $app->get('/''App\Controllers\HomeController:index');  

  35. $app->get('/code''App\Controllers\HomeController:code');  

  36. $app->get('/tos''App\Controllers\HomeController:tos');  

  37. $app->get('/debug''App\Controllers\HomeController:debug');  

  38. $app->post('/debug''App\Controllers\HomeController:postDebug');  

  39. //$app->get('/about', 'App\Controllers\HomeController:about');  

  40.   

  41. $app->get('/client''App\Controllers\HomeController:client');  

  42. $app->get('/nodeList''App\Controllers\UserController:nodeList');  

  43.   

  44. // User Center  

  45. $app->group('/user'function () {  

  46.     $this->get('''App\Controllers\UserController:index');  

  47.     $this->get('/''App\Controllers\UserController:index');  

  48.     $this->post('/checkin''App\Controllers\UserController:doCheckin');  

  49.     $this->get('/node''App\Controllers\UserController:node');  

  50.     $this->get('/node/{id}''App\Controllers\UserController:nodeInfo');  

  51.     $this->get('/profile''App\Controllers\UserController:profile');  

  52.     $this->get('/invite''App\Controllers\UserController:invite');  

  53.     $this->post('/invite''App\Controllers\UserController:doInvite');  

  54.     $this->get('/edit''App\Controllers\UserController:edit');  

  55.     $this->post('/password''App\Controllers\UserController:updatePassword');  

  56.     $this->post('/sspwd''App\Controllers\UserController:updateSsPwd');  

  57.     $this->post('/method''App\Controllers\UserController:updateMethod');  

  58.     $this->get('/sys''App\Controllers\UserController:sys');  

  59.     $this->get('/trafficlog''App\Controllers\UserController:trafficLog');  

  60.     $this->get('/kill''App\Controllers\UserController:kill');  

  61.     $this->post('/kill''App\Controllers\UserController:handleKill');  

  62.     $this->get('/logout''App\Controllers\UserController:logout');  

  63. })->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下的源码文件


[php] view plain copy

  1. /** 

  2.  *  HomeController 

  3.  */  

  4. class HomeController extends BaseController  

  5. {  

  6.   

  7.     public function index()  

  8.     {  

  9.         $homeIndexMsg = DbConfig::get('home-index');  

  10.         return $this->view()->assign('homeIndexMsg'$homeIndexMsg)->display('index.tpl');  

  11.     }  

  12.   

  13.     public function code()  

  14.     {  

  15.         $msg = DbConfig::get('home-code');  

  16.         $codes = InviteCode::where('user_id''=''0')->take(10)->get();  

  17.         return $this->view()->assign('codes'$codes)->assign('msg'$msg)->display('code.tpl');  

  18.     }  

  19.   

  20.     public function debug($request$response$args)  

  21.     {  

  22.         $server = [  

  23.             "headers" => $request->getHeaders(),  

  24.             "content_type" => $request->getContentType()  

  25.         ];  

  26.         $res = [  

  27.             "server_info" => $server,  

  28.             "ip" => Http::getClientIP(),  

  29.             "version" => Config::get('version'),  

  30.             "reg_count" => Check::getIpRegCount(Http::getClientIP()),  

  31.         ];  

  32.         Logger::debug(json_encode($res));  

  33.         return $this->echoJson($response$res);  

  34.     }  

  35.   

  36.     public function tos()  

  37.     {  

  38.         return $this->view()->display('tos.tpl');  

  39.     }  

  40.   

  41.     public function client()  

  42.     {  

  43.         return $this->view()->display('client.tpl');  

  44.     }  


最后一行可以找到我加入代码引用的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方法,不返回页面,代码雷同


[php] view plain copy

  1. public function debug($request$response$args)  

  2. {  

  3.     $server = [  

  4.         "headers" => $request->getHeaders(),  

  5.         "content_type" => $request->getContentType()  

  6.     ];  

  7.     $res = [  

  8.         "server_info" => $server,  

  9.         "ip" => Http::getClientIP(),  

  10.         "version" => Config::get('version'),  

  11.         "reg_count" => Check::getIpRegCount(Http::getClientIP()),  

  12.     ];  

  13.     Logger::debug(json_encode($res));  

  14.     return $this->echoJson($response$res);  

  15. }  

可以获取请求的参数,处理后通过response返回json或其他格式数据。

上面我们新增了一个静态页面,如果要加一个动态页面那该如何?上段代码中,有个主页的index方法


[php] view plain copy

  1. public function index()  

  2. {  

  3.     $homeIndexMsg = DbConfig::get('home-index');  

  4.     return $this->view()->assign('homeIndexMsg'$homeIndexMsg)->display('index.tpl');  

  5. }  

->assign('homeIndexMsg', $homeIndexMsg)这个方法就是向view传递数据对象,类似于map键值对,键是homeIndexMsg,值是$homeIndexMsg对象,在对应的index.tpl中就可以通过键引用到对象的值


[php] view plain copy

  1. <div class="section no-pad-bot" id="index-banner">  

  2.     <div class="container">  

  3.         

      

  4.         <h1 class="header center orange-text">{$config["appName"]}  

  5.         <div class="row center">  

  6.             <h5 class="header col s12 light">轻松科学上网   保护个人隐私  

  7.             {<span style="color:#ff0000;">$homeIndexMsg}  

  8.           

  9.         {if $user->isLogin}  

  10.             <div class="row center">  

  11.                 <a href="/user" id="download-button" class="btn-large waves-effect waves-light orange">进入用户中心  

  12.               

  13.         {else}  

  14.         <div class="row center">  

  15.             <a href="/auth/register" id="download-button" class="btn-large waves-effect waves-light orange">立即注册  

  16.           

  17.         {/if}  

  18.         

      

  19.       

  20.   


想必有人会疑惑,我们看到了传入的对象被引用,还有另外两个对象config、user,并没有看见传入,这两个对象是在view中被默认传入的,在所有页面中都可以直接调用,打开app\Services\View.php就可以看到对应的代码,在//add config注释下面几行,将这些配置信息以及个人信息传入


[php] view plain copy

  1. <?php  

  2.   

  3. namespace App\Services;  

  4.   

  5. use Smarty;  

  6.   

  7. class View  

  8. {  

  9.     public static function getSmarty(){  

  10.         $smarty=new smarty(); //实例化smarty  

  11.         $smarty->settemplatedir(BASE_PATH.'/resources/views/'.Config::get('theme').'/'); //设置模板文件存放目录  

  12.         $smarty->setcompiledir(BASE_PATH.'/storage/framework/smarty/compile/'); //设置生成文件存放目录  

  13.         $smarty->setcachedir(BASE_PATH.'/storage/framework/smarty/cache/'); //设置缓存文件存放目录  

  14.         // add config  

  15.         $smarty->assign('config',Config::getPublicConfig());  

  16.         $smarty->assign('user',Auth::getUser());  

  17.         $smarty->assign('analyticsCode',DbConfig::get('analytics-code'));  

  18.         return $smarty;  

  19.     }  

  20.   

  21. }  


本章讲到这里,下一章会阐述模型的修改以及数据库相关。诸位快行动起来,拆了重建,搞搞大新闻,想必是极好的。