1. 请求周期:
index.php
文件加载 Composer 生成的自动加载设置,然后从 bootstrap/app.php
脚本中检索 Laravel 应用程序的实例。 Laravel 本身采取的第一个动作是创建一个应用程序 / 服务容器。
接下来, 根据进入应用程序的请求类型来将传入的请求发送到 HTTP 内核或控制台内核。而这两个内核是用来作为所有请求都要通过的中心位置。 现在,我们先看看位于 app/Http/Kernel.php
中的 HTTP 内核。
index.php->bootstrap/app.php->
app/Http/Kernel.php->
config/app.php->providers(服务提供:注册服务容器绑定,事件监听器,中间件,甚至是路由。服务提供器是配置应用程序的中心)
2. 绑定接口:
服务容器有一个很强大的功能,就是支持绑定接口到给定的实现。例如,如果我们有个 EventPusher
接口 和一个 RedisEventPusher
实现。一旦我们写完了 EventPusher
接口的 RedisEventPusher
实现,我们就可以在服务容器中注册它,像这样:
$this->app->bind(
'App\Contracts\EventPusher',
'App\Services\RedisEventPusher'
);
这么做相当于告诉容器:当一个类需要实现 EventPusher
(接口类)时,应该注入 RedisEventPusher(接口的实现类)
。现在我们就可以在构造函数或者任何其他通过服务容器注入依赖项的地方使用类型提示注入 EventPusher
接口:
use App\Contracts\EventPusher;
/** * 创建新的类实例 * *
@param EventPusher $pusher * @return void */
public function __construct(EventPusher $pusher) { $this->pusher = $pusher; }
3. 中间件:
,首先应该在 app/Http/Kernel.php
文件内为该中间件分配一个键。默认情况下,该类中的 $routeMiddleware
属性下包含了 Laravel 内置的中间件。若要加入自定义的中间件,只需把它附加到列表后并为其分配一个自定义键即可。例如:
// 在 App\Http\Kernel 类中...
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
一旦在 HTTP 内核中定义好了中间件,就可以通过 middleware
方法将为路由分配中间件:
Route::get('admin/profile', function () {
//
})->middleware('auth');
你也可以为路由分配多个中间件:
Route::get('/', function () {
//
})->middleware('first', 'second');
分配中间件时,你还可以传递完整的类名:
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
//
})->middleware(CheckAge::class);
3. 控制器并 不是强制要求 继承基础类。但是,如果控制器没有继承基础类,你将无法使用一些便捷的功能,比如 middleware
, validate
和 dispatch
方法。
4. 请求