框架目录
在此列出一些比较核心的目录
- app --应用核心目录,放置控制器、业务处理、中间件、服务提供者代码的目录
- Http --处理路由过来的http请求
- Controllers
- Middleware --中间件
- providers --服务提供者
- Http --处理路由过来的http请求
- bootstrap --应用启动文件
- public --应用框架入口文件
- resources --前端资源文件
- routers --路由配置
- vendor --框架依赖安装目录
基本概念
- 依赖注入
类的依赖通过构造器或在某些情况下通过「setter」方法「注入」。说简单点,就是一个类的实例化依赖与另一个类的实例化。 - 服务容器
可以理解为一个放置多种类工厂的盒子 - 服务提供者
提供具体类实例 - 中间件
中间件为被挂载在路由解析到具体controller或者回调之前的一段逻辑。我们可以利用中间件做用户验证、访问控制等一些整体框架流程之外的动作。 - 路由
提供灵活的访问路径解析方式,并提供一系列的路由配置项,用以解析http请求到具体的业务入口
整体结构
走通流程
- 路由配置
我们创建了一个UserController,里面有一个返回姓名的方法getName
<?php
namespace App\Http\Controllers;
class UserController extends Controller
{
public function getName()
{
return 'sence';
}
}
我们如何得到这个方法的返回值呢?这里就需要配置路由,让框架根据配置好的路由将http请求解析到UserController的getName方法.如果阅读过框架的启动文件app.php,相信你会注意到一段代码
$app->router->group([
'namespace' => 'App\Http\Controllers',
], function ($router) {
require __DIR__.'/../routes/web.php';
});
在router对象的group方法的第二个参数回调中可以看到,方法加载了routes目录下的web.php文件,所以我们的路由配置可以写在这个文件中
/* 定义路由到控制器 */
$router->get('user/name', ['uses' => 'UserController@getName']);
get方法中的第一个参数用于指定http url的path部分,第二个参数,设置路由将匹配到的请求转交到UserController的getName方法处理。配置好以后,我们可以通过http://domain/user/name这样的url发起http get请求,即可获取到UserController中getName方法的返回值了。
router对象支持以常见的几种HTTP Method名称指定http请求的访问动作, 例如这里的get,指代get请求,你还可以使用post、put、delete等。方法的第一个参数匹配http url的path部分,支持参数匹配。第二个参数接收一个配置数组,可以在其中指定该条路由的一些特性
- 制定中间件
假如我们只允许通过get的方法获取到用户的姓名,当监测到非get请求时,我们需要做自己的逻辑,而不是抛出错误,这个时候,我们可以做一个限制请求方法的中间件,将其挂载user/name
的路由上,在解析路由之前做自己的逻辑处理.
首先我们制作好自己的中间件逻辑。可能你对Closure类的作用不是很了解,这里我们先按下不表,只需知道它可以将http请求继续流转到框架的下一个加载流程中就好
<?php
namespace App\Http\Middleware;
use Closure;
/**
* 访问限制中间件
**/
class UserAuthMiddleware
{
public function handle($request, Closure $next)
{
if (!$request->isMethod('get')) {
// TODO
}
return $next($request); //延续框架路由解析流程
}
}
然后通过middleware
配置项将中间件挂载到user/name
这条路由上,当请求的http method不是get的时候,就会走到``TODO```的逻辑块
$router->get('user/score', [
'middleware' => App\Http\Middleware\UserAuthMiddleware::class
]);
laravel还允许为中间件定义别名,并允许在启动文件中批量定义,绑定中间件到路由的方法和原先一样,只是middleware
的值变成类中间件的别名,如果要更改中间件时,只需要在定义处修改即可
// 在app.php启动文件中配置路由中间件
/*路由中间件*/
$app->routeMiddleware([
'http_method_limit' => App\Http\Middleware\UserAuthMiddleware::class
]);
//在路由配置文件web.php中挂载路由中间件
$router->get('user/score', ['middleware' => 'http_method_limit']);
laravel支持全局定义中间件,全局中间件仍然会在路由解析之前被调用,与路由中间件不同的是,它是针对所有http请求,它的定义方法如下
// 在app.php中定义全局中间件
$app->middleware([
App\Http\Middleware\UserAuthMiddleware::class
]);
- 服务提供者 & 服务容器
// TODO