继续学习lumen5.5php
-----------------------分割线-----------------------laravel
看看是怎么输出'Lumen (5.5.2) (Laravel Components 5.5.*)'这个数据web
public目录下的index.php加载了bootstrap下的app.phpbootstrap
require_once __DIR__.'/../vendor/autoload.php';
//composer的自动加载(new Dotenv\Dotenv(__DIR__.'/../'))->load();
//加载.env的配置api
$app = new Laravel\Lumen\Application( realpath(__DIR__.'/../') );//初始化应用 //初始化的内容 public function __construct($basePath = null) { if (! empty(env('APP_TIMEZONE'))) { date_default_timezone_set(env('APP_TIMEZONE', 'UTC')); } //指定项目基础目录 $this->basePath = $basePath; //注册服务容器 $this->bootstrapContainer(); //注册异常处理 $this->registerErrorHandling(); //实例化Route路由类 $this->bootstrapRouter(); }
而后是注册核心组件进服务容器中(laravel的服务容器后面再学习)闭包
主要看app
$app->router->group([ 'namespace' => 'App\Http\Controllers', ], function ($router) { require __DIR__.'/../routes/web.php'; });
加载路由文件以便它们能够所有被添加到应用,这将提供全部请求接口的响应
第一个参数是指定处理接口属性设置,namespance属性是指定处理请求的控制器所在目录
第二个参数是一个闭包函数,传一个匿名函数到group方法里composer
找到web.php函数
$router->get('/', function () use ($router) { return $router->app->version(); });
把web.php定义的路由都放在这个这个匿名函数中,至关于下面这样学习
$app->router->group([ 'namespace' => 'App\Http\Controllers', ], function ($router) { $router->get('/', function () use ($router) { return $router->app->version(); }); });
而后看Router类里面的group方法,有一个
call_user_func($callback, $this);
这段代码执行传进来的匿名函数,就是web.php定义的全部路由
$router->get('/', function () use ($router) { return $router->app->version(); });
找到Router类里面的get方法看到调用了addRoute方法,看到名字就大概知道是添加路由的意思
/** * Add a route to the collection. * * @param array|string $method * @param string $uri * @param mixed $action * @return void */ public function addRoute($method, $uri, $action) { $action = $this->parseAction($action); $attributes = null; if ($this->hasGroupStack()) { $attributes = $this->mergeWithLastGroup([]); } if (isset($attributes) && is_array($attributes)) { if (isset($attributes['prefix'])) { $uri = trim($attributes['prefix'], '/').'/'.trim($uri, '/'); } if (isset($attributes['suffix'])) { $uri = trim($uri, '/').rtrim($attributes['suffix'], '/'); } $action = $this->mergeGroupAttributes($action, $attributes); } $uri = '/'.trim($uri, '/'); if (isset($action['as'])) { $this->namedRoutes[$action['as']] = $uri; } if (is_array($method)) { foreach ($method as $verb) { $this->routes[$verb.$uri] = ['method' => $verb, 'uri' => $uri, 'action' => $action]; } } else { $this->routes[$method.$uri] = ['method' => $method, 'uri' => $uri, 'action' => $action]; } }
里面作的就是把在web.php定义的路由翻译成你想要处理的方式,最后都放在$routes这个属性当中,这里能够参考文档中[HTTP 路由][1]部分(这是旧版中文文档,新版要看官网的英文版,不一样之处在于$app换成$route,旧的路由定义文件是routes.php,新的是web.php)
能够把上面那个请求路由的代码翻译成,当请求路由为'api.com/index.php/'时候,调用匿名函数
function () use ($router) { return $router->app->version(); }
进行响应;能够看出当执行匿名函数时调用的是application类里面的version方法
public function version() { return 'Lumen (5.5.2jjj) (Laravel Components 5.5.*)'; }
PS:这里只是return,还不是echo输出,继续往下看,$app->run();下次再补充....