从 laravel 中文文档查看 5.5 相对 5.1 中的变动 (2)

这篇主要对比 laravel 5.5相对5.1 的各模块功能的不同,从 5.5 的目录来看是从安全相关官方扩展包的内容。

上一篇在这里从 laravel 中文文档查看 5.5 相对 5.1 中的变动 (1)

相同的部分我就不多赘述了,大部分只点出目前看到的不同的地方。当前本文的修改时间是 2017-10-03 15:28:41。

查阅的 laravel 手册为:

Artisan 命令行工具

Laravel REPL

所有 Laravel 应用都包含了 Tinker。 Tinker 让你可以在命令行中与你整个的 Laravel 应用进行交互,包括 Eloquent ORM、任务、事件等等。运行 Artisan 命令 tinker 进入 Tinker 环境:

php artisan tinker

事件

除了广播变化非常大之外,其它没有什么变化。5.5文档把广播从事件里单独拎出来了。

广播

相对于5.1变化的蛮大的,主要因为是增加了 laravel echo,广播的实现变得非常简单 。等到我需要实践的时候再去看好了。

直达链接: 广播系统

缓存

感觉没什么变化 Orz

集合

增加了很多方法。 直达链接: Collection

文件系统

保存文件这一块多了文件流式传输的方法:

use Illuminate\Http\File;

// 自动为文件名生成唯一的 ID...
Storage::putFile('photos', new File('/path/to/photo'));

// 手动指定文件名...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');

putFile 方法将生成唯一的 ID 作为文件名。

在文件上传部分贴心了很多。5.1时候自定义了不少这方面的处理,5.5 直接帮我们完善了:

Request 可以直接用 store 方法保存文件。store 也生成唯一的 ID 来作为文件名。

    public function update(Request $request)
    {
        $path = $request->file('avatar')->store('avatars');

        return $path;
    }

或者Request 的 storeAs,也可以用 Storage 的 putFileAs,效果一样

$path = $request->file('avatar')->storeAs(
    'avatars', $request->user()->id
);

$path = Storage::putFileAs(
    'avatars', $request->file('avatar'), $request->user()->id
);

文件可以被声明为 publicprivate。不过具体的业务处理,就得自己去完善了。

辅助函数

多了不少

数组

  • array_last
  • array_prepend
  • array_wrap 函数将给定的值包装成一个数组。如果给定的值已经是一个数组,则不会被改变

路径

  • mix
  • resource_path 函数返回 resources 目录的完整路径。

字符串

  • kebab_case 函数将给定的字符串转换为 短横线隔开式
  • e(并不是新增的) 函数使用 PHP 函数 htmlspecialchars 并且 double_encode 选项设置为 false
  • str_after
  • str_before
  • title_case 函数将给定的字符串转换为 每个单词首字母大写

url

  • secure_url 函数为给定的路径生成一个完整的 HTTPS URL 路径

其他

  • abort 函数将会抛出一个 HTTP 异常并且由异常处理程序处理
  • abort_if
  • abort_unless
  • dispatch 函数将一个新的任务推送到 Laravel 任务列队
  • logger 函数可以将一个 debug 级别的消息写入到日志中
  • report 函数将使用异常处理程序的 report 方法抛出异常
  • retry 函数尝试执行给定的回调,直到到达给定的最大尝试次数。

邮件

在 Laravel 5.5 中,每种类型的邮件都代表一个「Mailable」对象。这些对象存储在 app/Mail 目录中。

php artisan make:mail OrderShipped

并且支持 markdown 格式。

php artisan make:mail OrderShipped --markdown=emails.orders.shipped

并且支持预览:

Route::get('/mailable', function () {
    $invoice = App\Invoice::find(1);

    return new App\Mail\InvoicePaid($invoice);
});

通知

laravel 5.5 强化了它的通知功能。以前只有邮件功能,现在还增加了短信和 Slack 功能,可喜可贺。(我在5.1的时候是借用了 slaask 实现的通知)

php artisan make:notification InvoicePaid

更加详细的可以直接参考文档,直达链接

扩展插件开发

这一块不熟悉,应该变化不大。

扩展包是添加功能到 Laravel 的主要方式。扩展包可以包含许多好用的功能,像 Carbon 可用于处理时间,或像 Behat 这种完整的 BDD 测试框架。

队列

没有变化。

任务调度

也没有变化。

数据库

死锁

transaction 方法接受一个可选的第二个参数,该参数定义在发生死锁时,应该重新尝试事务的次数。一旦这些尝试都用尽了,就会抛出一个异常:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
}, 5);

构造器、分页没有什么变化,paginate一波流。

数据库迁移部分,没有变化,但解释的更详细一些,尤其是终于给出了哪些字段类型不能修改了。以前修改老是失败,导致我再也不用官方提供的 change 方法,只用原生的SQL 语句。

seeder 也没变化。

API

laravel 5.5 增加了资源类这样一个说法,具体到业务上,就是可以快速将模型和模型集合转换成 json。

在使用 laravel5.1时,后台经常需要从数据库中取出数据,toArray,最后在返回给前端。有了这个资源类,就不需要那么麻烦了。

这是一个全新的东西,打开文档好好看把。直达链接

php artisan make:resource User
php artisan make:resource Users --collection

redis

了解不多,主要是作为 NoSQL,加速网站的,有自定义需要的最好还是看一下。直达链接

测试相关

这一块文档主要是讲了 phpunit 一波流作为单元测试的方法,数据库测试的辅助函数以及一些模拟测试的工具,另外增加了 laravel Dusk 作为 BDD 测试框架。

我已经习惯了 Selenium 框架,这一部分就过了一眼。

官方扩展包

在5.1时代,社区就呈现出来好多有用的扩展,官方把他们好多直接升格为官方推荐了^_^,都过一遍。

  • 收费系统 Cashier 对国内用户可能不太适用,还是 pass 吧。

  • 部署工具 Laravel Envoy 在远程服务器上运行通用任务。可以很方便的启动任务来进行项目部署、Artisan 命令运行等操作。

  • 队列监控面板 - Horizon 一个可以通过代码进行配置、并且非常漂亮的仪表盘,并且能够轻松监控队列的任务吞吐量、执行时间以及任务失败情况等关键指标。

  • API 认证系统 Passport

    太棒了这个东西。使用 Passport 可以轻而易举地实现 API 授权认证,Passport 可以在几分钟之内为你的应用程序提供完整的 OAuth2 服务端实现。

  • 全文搜索系统 Scout

    Laravel Scout 为 Eloquent 模型 的全文搜索提供了一个简单的、基于驱动程序的解决方案。使用模型观察员,Scout 会自动同步你的搜索索引和 Eloquent 记录。

    目前,Scout 自带了一个 Algolia 驱动;而编写自定义驱动程序很简单,你可以自由地使用自己的搜索实现来扩展 Scout。

  • 社会化登录

    又一个超级棒的东西,可惜好像只支持国外的 SNS。

    Laravel 社会化登录通过 Facebook , Twitter ,Google ,LinkedIn ,GitHub 和 Bitbucket 提供了一个富有表现力的,流畅的 OAuth 身份验证界面。它几乎能处理所有你害怕处理的各种样板社会认证代码。

安全相关

用户认证

没变化

API 认证

见上面插件部分的描述

用户授权

这个是 laravel5.5 的新特性。有 gates 和策略 2 种主要方式来实现用户授权。

Gates类似于路由,策略类似于控制器。Gates 提供了一个简单的、基于闭包的方式来授权认证。策略则在特定的模型或者资源中通过分组来实现授权认证的逻辑。

Gates 大部分应用在模型和资源无关的地方,比如查看管理员的面板。与之相反,策略应该用在特定的模型或者资源中。

加密解密机制

Laravel 使用 OpenSSL 提供 AES-256 和 AES-128 的加密。

比起 5.1 没有变化,开箱即用不需要修改。

结论

两天时间看完文档,大致弄懂了Laravel5.5的功能。进步真的蛮大的。我准备写一两个小网站,希望大家也来用 Laravel,为社区贡献一些力量^_^。

参考资料


从 laravel 中文文档查看 5.5 相对 5.1 中的变动 (1)

laravel 5.5也发布了一段时间了。 这是 laravel 第二个 LTS 版本,自然不能错过。实际上我也很少关注中间几个版本,并不了解它们增加了哪些东西。

趁着这个国庆把5.5的文档粗略看了一遍,以前对 laravel 多以应用为主,需要的时候才会去查,研究不算深,所以应该会有很多疏漏,或是错误,我也会不断修改过来,欢迎指正。

这篇主要对比一些基础性的不同,从 5.5 的目录来看是从前言前端开发的内容。

下一篇在这里从 laravel 中文文档查看 5.5 相对 5.1 中的变动 (2)

当前本文的修改时间是2017-10-03 15:27:29

相同的部分我就不多赘述了,大部分只点出目前看到的不同的地方。

查阅的 laravel 手册为:

目录

刚开始看目录的时候,乍看之下觉得怎么多了这么多东西。实际上5.5的文档将很多原本属于5.1文档中属于系统服务的东西抽出来组成新的主题,所以显得比较多。

另外文档主题的顺序更合理一些,比如文件夹结构的内容就放到了入门指南里,易于新手入门,快速掌握。

安装部署

这一部分没太大的变化,主要是环境依赖有变化:

  • php 必须7.0.0以上
  • 多了『PHP XML 扩展』的依赖。

对于 Mac 的开发环境,多提供了一个 「Valet」环境。

5.5的文件目录新增了几个(有些也可能以前有,我没使用 Orz):

  • 路由,从 http 目录下的单个文件 routes.php 变成与 app 目录平级的 \routes 目录
  • 邮件的逻辑,app\Mail 目录
  • 应用授权策略,app\Policies 目录
  • 自定义验证规则对象,app\Rules 目录
  • 「事务性」通知,app\Notifications 目录

文档还给了一个更加详细的 Nginx 的配置案例,可以看一下。

核心架构

了解5.1的基本不用看了。毕竟核心架构也不可能有多大变化。

* 请求周期
* Container
* Provider
* Facades
* Contracts

基本功能

* 路由			
* 中间件		
* CSRF 保护 	
* 控制器				
* 请求				
* 响应
* 视图
* URL
* Session
* 表单验证
* 错误与日志

路由

路由方法

路由参照 RESTful API,实现了里边常用的请求类型(除了 head,用的少就没所谓了),5.1只实现了 get 和 post:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

csrf 跟以前一样

检查当前路由named

public function handle($request, Closure $next)
{
    if ($request->route()->named('profile')) {
        //
    }

    return $next($request);
}

路由命名空间namespace

Route::namespace('Admin')->group(function () {
    // 在 "App\Http\Controllers\Admin" 命名空间下的控制器
});

路由模型绑定

增加了隐式绑定,还可以自定义键名,比较复杂,可以点击这里直接查看手册 https://d.laravel-china.org/docs/5.5/routing#route-model-binding

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

访问当前路由

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

控制器

__invoke()

单个行为控制器

class ShowProfile extends Controller
{
    /**
     * 展示给定用户的信息。
     */
    public function __invoke($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

资源控制器

5.1就存在了,不过一直没怎么用。比较复杂,包括资源路由、本地化 uri 等等,可以直接看文档: https://d.laravel-china.org/docs/5.5/controllers#resource-controllers

请求

有很多5.1就存在的实用的方法,列一下:

$uri = $request->path();

if ($request->is('admin/*')) {
    //
}

// Without Query String...
$url = $request->url();

// With Query String...
$url = $request->fullUrl();

关于旧输入也列一下:

$username = $request->old('username');

# 前端中使用:

old('username')

文件

终于有了文件扩展名的判断了,感谢!

$path = $request->photo->path();

$extension = $request->photo->extension();

存储文件的方法也有了改变:

$path = $request->photo->store('images');

$path = $request->photo->store('images', 's3');

$path = $request->photo->storeAs('images', 'filename.jpg');

$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

配置 TLS/SSL

这一块没有在5.1用过。

在 Laravel 应用程序中包含 App\Http\Middleware\TrustProxies 中间件,快速自定义应用程序信任的负载均衡器或代理,还可以配置代理发送包含原始请求信息的请求头:

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * 这个应用程序的可信代理列表
     *
     * @var array
     */
    protected $proxies = [
        '192.168.1.1',
        '192.168.1.2',
    ];

    /**
     * 当前代理响应头映射关系
     *
     * @var array
     */
    protected $headers = [
        Request::HEADER_FORWARDED => 'FORWARDED',
        Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
        Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
        Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
        Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    ];
}

验证

bail 规则

使得在某个属性第一次验证失败后停止运行验证规则:

$this->validate($request, [
    'title' => 'bail|required|unique:posts|max:255',
    'body' => 'required',
]);

错误日志

最大的变化就是——终于可以根据log_level的配置,只打印对应级别的日志了。

'log_level' => env('APP_LOG_LEVEL', 'error'),

模板

新增好几个命令。

// unless 不是新增的

@unless (Auth::check())
    你尚未登录
@endunless

@isset

@isset($records)
    // $records 被定义并且不为空...
@endisset

@empty($records)
    // $records 是「空」的...
@endempty

@auth@guest

@auth
    // 用户已经通过身份认证...
@endauth

@guest
    // 用户没有通过身份认证...
@endguest

loop 循环变量

$loop 变量也包含了其它各种有用的属性:

属性 描述
$loop->index 当前循环迭代的索引(从0开始)。
$loop->iteration 当前循环迭代 (从1开始)。
$loop->remaining 循环中剩余迭代数量。
$loop->count 迭代中的数组项目总数。
$loop->first 当前迭代是否是循环中的首次迭代。
$loop->last 当前迭代是否是循环中的最后一次迭代。
$loop->depth 当前循环的嵌套级别。
$loop->parent 在嵌套循环中,父循环的变量。
@foreach ($users as $user)
    @foreach ($user->posts as $post)
        @if ($loop->parent->first)
            This is first iteration of the parent loop.
        @endif
    @endforeach
@endforeach

@includeIf @includeWhen

@includeIf('view.name', ['some' => 'data'])
@includeWhen($boolean, 'view.name', ['some' => 'data'])

前端相关

laravel 5.5 通过 Laravel Mix,很方便的使用前端框架,例如 Bootstrap vue 和 React。这一部分几乎是全新的,可以在文档中直接查看。 https://d.laravel-china.org/docs/5.5/frontend

参考资料


CentOS 源与 Docker 源加速的设置

最近接触了一些 CentOS 和 Docker,对基本的操作还不太了解。记录一下。

CentOS 源

yum 的配置文件分为两部分: main 和repository

  • main 部分定义了全局配置选项,整个yum 配置文件应该只有一个main。常位于/etc/yum.conf 中。
  • repository 部分定义了每个源/服务器的具体配置,可以有一到多个。常位于/etc/yum.repo.d 目录下的各文件中。

yum.conf 文件一般位于/etc目录下,一般其中只包含main部分的配置选项。

/etc/yum.repos.d/下有若干个文件,也可以新建文件添加自定义的源。

  • CentOS-Base.repo 是yum 网络源的配置文件
  • CentOS-Media.repo 是yum 本地源的配置文件

Docker 源

通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像。

修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。

{  
	"registry-mirrors": ["https://registry.docker-cn.com"]
}

也可以使用阿里云的源:

https://7bezldxe.mirror.aliyuncs.com

修改保存后重启 Docker 生效。

参考资料


VPS主机测试脚本

持续更新。

目前参考自使用脚本测试VPS

硬盘IO及全球下载速度测试

使用秋水逸冰的一键Bench脚本

wget -qO- bench.sh | bash

或者下载到本地运行:

wget https://cdn.kelu.org/blog/2017/09/bench.sh
chmod +x bench.sh
./bench.sh

我经常运行到一半就卡了,不知道为什么,一般就看个I/O速度。

全国网络测试

来自于91yun,包括了全国PING值的测试和各地路由的走法,偏向于网络测试。

wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/91yuntest/master/test_91yun.sh && bash test_91yun.sh s

服务器性能测试

简单的对CPU进行运算测试,需要跑的时间很长,请耐心等好最后测试出来的跑分。如下:

wget --no-check-certificate https://github.com/teddysun/across/raw/master/unixbench.sh
chmod +x unixbench.sh
./unixbench.sh

线路测试

wget —no-check-certificate https://raw.githubusercontent.com/wn789/Superspeed/master/superspeed.sh
chmod +x superspeed.sh
./superspeed.sh

参考资料