Laravel 5.8 杂记

Laravel 5.8

Laravel 5.8Laravel 5.7 的基础上继续进行优化,
包括引入新的 Eloquent 关联关系(has-one-through)、优化邮箱验证、基于约定的授权策略类自动注册、 DynamoDB 缓存及 Session 驱动、优化任务调度器的时区配置、支持分配多个认证 guard 到广播频道、PSR-16 缓存驱动规范、优化 artisan serve 命令、支持 PHPUnit 8.0、支持 Carbon 2.0 、支持 Pheanstalk 4.0 ,以及多个 bug 修复和可用性的提升。

5.8 发行说明

Laravel 必知

Laravel的请求周期 ?

  • Laravel应用的所有请求入口public/index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

define('LARAVEL_START', microtime(true));

// Register The Auto Loader
// 加载 Composer 生成的自动加载设置
require __DIR__.'/../vendor/autoload.php';

// Turn On The Lights
// 然后从 bootstrap/app.php 脚本中检索 Laravel 应用程序的实例
$app = require_once __DIR__.'/../bootstrap/app.php';

// Run The Application
// 根据进入应用程序的请求类型来将传入的请求发送到 HTTP 内核或控制台内核
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);

$response->send();

// Perform any final actions for the request lifecycle
// TTP 内核的 handle 方法签名相当简单:获取一个 Request ,返回一个 Response
$kernel->terminate($request, $response);
  • HTTP / Console 内核 app/Http/Kernel.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
// The Artisan commands provided by your application.
// Artisan CMD
protected $commands = [
//
];

// Define the application's command schedule.
// 定义应用程序的定时任务
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')
// ->hourly();
}

// Register the commands for the application.
// 注册应用程序的命令
protected function commands()
{
$this->load(__DIR__.'/Commands');

require base_path('routes/console.php');
}
}
  • 服务提供者 config/app.php

内核启动操作中最重要的便是你应用的 服务提供者 了。
所有应用下的服务提供者均配置到了 config/app.php 配置文件中的 providers 数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
'providers' => [

/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,

/*
* Package Service Providers...
*/

/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,

],

第一步,所有服务提供者的 register 方法会被调用,然后一旦所有服务提供者均注册后, boot 方法才被调用。

  • 请求调度 routes/***.php

一旦启动且所有服务提供者被注册,Request 会被递送给路由。路由将会调度请求,交给绑定的路由或控制器,也当然包括路由绑定的中间件。

1
2
3
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
  • 聚焦服务提供者

服务提供者是 Laravel 真正意义的生命周期中的关键。应用实例一旦创建,服务提供者就被注册,然后请求被启动的应用接管。
默认的服务提供会存放在 app/Providers 下面。

什么是服务容器 ?

Laravel 服务容器是一个用于来管理类的依赖和执行依赖注入的强大工具

  • 服务绑定

    • 简单绑定: $this->app->bind();
    • 绑定一个单例: $this->app->singleton();
    • 绑定实例: $this->app->instance();
    • 绑定基本值: $this->app->when()->needs()->give();
    • 绑定接口到实现: $this->app->bind('App\Contracts\EventPusher');
    • 扩展绑定: $this->app->extend();
  • 解析实例

    • make方法: $this->app->make();
    • makeWith: $this->app->makeWith();
  • 自动注入

1
2
3
4
public function __construct(UserRepository $users)
{
$this->users = $users;
}
  • 容器事件

服务容器每次解析对象会触发一个事件,你可以使用 resolving 方法监听这个事件 :

1
2
3
$this->app->resolving(function ($object, $app) {
// Called when container resolves object of any type...
});

什么是依赖注入 ?

依赖注入这个花哨的名词实质上是指: 类的依赖通过构造函数,或者某些情况下通过”setter”方法

1
2
3
4
5
6
proteced $user;

public function __construct(User $user)
{
$this->user = $user;
}

什么是服务提供者 ?

服务提供者是所有 Laravel 应用程序的引导中心。你的应用程序,以及 通过服务器引导的 Laravel 核心服务都是通过服务提供器引导。

但是,「引导」是什么意思呢? 通常,我们的可以理解为注册,比如注册服务容器绑定,事件监听器,中间件,甚至是路由。服务提供者是配置应用程序的中心.

  • 编写服务提供者
1
php artisan make:provider TestServiceProvider
  • 注册服务提供者
1
2
3
4
5
6
// config/app.php
'providers' => [
// 其他服务提供者

App\Providers\ComposerServiceProvider::class,
],

什么是 Facades ?

Facades 为应用的 服务容器 提供了一个「静态」 接口。
Laravel Facades 实际是服务容器中底层类的 「静态代理」 ,相对于传统静态方法,在使用时能够提供更加灵活、更加易于测试、更加优雅的语法。

  • Facades 相较于依赖注入

依赖注入的主要好处之一是能交换注入类的实现。在测试的时候非常有用,因为你可以注入一个

`stub`,并断言 `stub` 上的各种方法。
1
2
3
4
5
6
7
8
9
10
11
12
13

- Facades 相较于辅助函数

> `Facade` 和辅助函数之间没有实际的区别。当你使用辅助函数时,你可以像测试相应的 `Facade` 那样进行测试。

- Facades 工作原理

> 在 `Laravel` 应用中,`Facade` 就是一个可以从容器访问对象的类。其中核心的部件就是 `Facade` 类。
> `Facade` 基类使用了 `__callStatic()` 魔术方法,直到对象从容器中被解析出来后,才会进行调用。

- `__callStatic()`

```php

什么是 Contracts ?

Contracts 契约
Laravel 的契约是一组由框架提供,定义了核心服务的 interface 集合。

什么是控制反转 ?

IoC (控制反转),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

  • 实现控制反转的方式
    • 依赖注入(Dependency Injection(DI))
    • 依赖查找 (Dependency Lookup)

什么是 Eloquent ORM ?

LaravelEloquent ORM 提供了一个漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2022 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :