PHP DIY系列之自定义配置和路由

我们已经开发完成,但我们还需要更多。比如自定义配置和路由。

app文件夹下新建Config.php

  1. <?php/**
  2. *自定义配置
  3. */return [
  4. 'debug' => false,
  5. 'route' => [
  6. '' => 'demo/welcome',
  7. 'test' => 'demo/test',
  8. ],];

新建DemoController(app/Https/Controllers目录下)

  1. <?php/**
  2. * Demo控制器
  3. */namespace App\Https\Controllers;use Library\Https\Controller;class DemoController extends Controller{
  4. public function welcome($params)
  5. {
  6. return $this->response->json(['hello' => 'welcome']);
  7. }
  8. public function test($params)
  9. {
  10. return $this->response->json($params);
  11. }}

修改入口文件index.php,加入加载配置代码:

... 省略代码

  1. // 加载配置
  2. $config = require SF_LIBRARY_PATH.'Config.php';
  3. $appConfig = file_exists($appConfigPath = SF_APP_PATH.'Config.php') ? require $appConfigPath : [];
  4. $config = array_merge($config, $appConfig);
  5. $config['debug'] = ($config['debug']?? SF_DEBUG);

...省略代码

解析路由部分也加入自定义路由处理:

  1. // Application...省略代码
  2. public function handleRequest(Request $request){
  3. $route = $request->resolve($this->_config['route']??[]);
  4. $response = $request->runAction($route);
  5. /**
  6. * 执行结果赋值给$response->data,并返回给response对象
  7. */
  8. if ($response instanceof Response) {
  9. return $response;
  10. }
  11. throw new SaiException('Content format error');}
  12. ...省略代码
  13. public function resolve($route=[]) {
  14. $this->route = $route; // 自定义路由
  15. return $this->getPathUrl(); }
  16. // Request
  17. ...省略代码public function runAction($route){
  18. if (array_key_exists($route, $this->_route)) {
  19. $route = $this->_route[$route];
  20. }
  21. $match = explode('/', $route);
  22. $match = array_filter($match);

...省略代码

保存后打开浏览器看看效果:

PHP DIY系列之自定义配置和路由

PHP DIY系列之自定义配置和路由

这里虽然有自定义路由,但是我们有时候需要禁止默认路由,所以我们不妨增加配置参数defaultRoute,用来控制是否开启默认路由。

我们修改一下路由解析的代码:

  1. //Application...省略代码
  2. public function handleRequest(Request $request){
  3. $route = $request->resolve($this->_config['route']??[]);
  4. $response = $request->runAction($route, $this->_config['defaultRoute']??true);
  5. /**
  6. * 执行结果赋值给$response->data,并返回给response对象
  7. */
  8. if ($response instanceof Response) {
  9. return $response;
  10. }
  11. throw new SaiException('Content format error');}

...省略代码

  1. ...省略代码
  2. public function runAction($route, $defaultRoute){
  3. if (array_key_exists($route, $this->_route)) {
  4. $route = $this->_route[$route];
  5. } elseif (!$defaultRoute) {
  6. throw new NotFoundException("route not found:".$route);
  7. }
  8. ...省略代码

我们在app下面的Config,加入:

  1. return [
  2. 'debug' => false,
  3. 'route' => [
  4. '' => 'demo/welcome',
  5. 'test' => 'demo/test',
  6. ],
  7. 'defaultRoute' => false,];

我们打开浏览器输入saif.com/login

报错如下:

  1. Array
  2. (
  3. [line] => 137
  4. [msg] => route not found:login
  5. [code] => 404
  6. [file] => library/Https/Request.php
  7. )