Laravel 5.5 新特性预览

redladybug 发布于9月前 阅读456次
0 条评论

Laravel 5.5 需要 7.0+ 版本的 PHP。想要了解当前 PHP 版本所带来的功能,可以参考我们为你提供的 回顾

Laravel 5.5 新特性预览

Laravel 5.5 也将会是接下来的一个 LTS(长期支持)版本。 这就意味着它拥有两年修复以及三年的安全更新支持。Laravel 5.1 也是如此,不过它两年的错误修复支持将在今年结束。那么闲话少叙,让我们来看看这个新版本都提供了些什么吧。

创建一个新的 Laravel 5.5 项目

我们可以通过运行以下命令安装 dev 版本:

laravel new laravel55 --dev
cd laravel55
php artisan key:generate

如果您不想使用 Laravel 安装程序,还可以使用 Composer

composer create-project --prefer-dist --stability=dev laravel/laravel:dev-master
cd laravel
php artisan key:generate

一旦我们访问了新设置的应用程序的主页,我们应该看到一个类似于我们以前的 Laravel 版本的欢迎页面。

在浏览器中渲染出邮件内容

我觉得这会是非常有用的东西。在 Laravel 之前的版本中,我们得实际去发送邮件,或者使用像 Mailtrap 这样的邮件客户端程序来测试邮件的布局,而这可不是啥好差事。时过境迁,有了 5.5 版本的 Laravel,局面得到改观,我们可以直接在浏览器调试邮件的布局显示。

达成此目的的捷径就是:给我们当前的工程创建一个新的可实际去发送的邮件模板:

php artisan make:mail Welcome --markdown=emails.welcome

我喜欢用 markdown 的方式来创建模板,里面会附上一些现成的内容。我们打开 web.php 文件,然后创建一个测试路由来查看 email 的布局:

Route::get('/email', function () {
    return new App\Mail\Welcome();
});

routes/web.php

通过浏览  /email 这个路由,我们就可以对 email 模板进行预览:

Laravel 5.5 新特性预览

实际在幕后所发生的事情就是使用 Laravel 5.5, Mailable 类实现了拥有一个 render() 方法的 Renderable 协议。这个是 lluminate/Mail/Mailable.php 里面 render() 方法的实现:

public function render()
{
    Container::getInstance()->call([$this, 'build']);

    return Container::getInstance()->make('mailer')->render(
        $this->buildView(), $this->buildViewData()
    );
}

lluminate/Mail/Mailable.php

这个就是让获取一个视图成为可能的那个方法。我们尝试过返回一个类的示例,它并没有实现在我们的路由之中的那个 Renderable 协议,这时候会得到的是一个 UnexpectedValueException 被抛出来。

自定义邮件主体

当邮件使用 Markdown 时,Laravel 会提供默认主题。 但是,有些人可能希望在电子邮件模板中使用自定义样式进行品牌推广。

要使用特定可用的自定义主题,我们首先创建一个包含我们想要的样式的自定义 .css 文件:

touch resources/views/vendor/mail/html/themes/custom.css

然后,我们将该文件名指定为 Mailable 类中的一个属性:

class Welcome extends Mailable
{
    protected $theme = 'custom';
    [...]
}

app/Mail/Welcome.php

这样,电子邮件布局将基于我们在 custom.css 文件中定义的样式。 这种方法的好处是不同的邮件使用不同的主题。

Exception 辅助函数

Laravel 5.5 带来了两个辅助函数,他们能帮助我们编写更富表达能力的代码。这两个辅助程序就是 throw_if 和 throw_unless 方法。两者都需要三个参数,而且第三个参数都是可选的。

让我们来看一下这些异常的各种不同的实现:

$number = 2;
throw_if($number !== 3, new NotThreeException('Number is not three'));
// or
throw_if($number !== 3, NotThreeException::class, 'Number is not three');

使用 throw_if 方法,异常会在第一个参数计算出来为 true 的时候被抛出。

实现 throw_unless 方法跟我们上面所做的并没有不同, 唯一的差别就是异常只会在第一个参数计算出来为 false 的时候被抛出:

$number = 2;
throw_unless($number === 3, new NotThreeException('Number is not three'));
// or
throw_unless($number === 3, NotThreeException::class, 'Number is not three');

例子并不是最好的,但足够来体现我们的展示意图了。

介绍 migrate:fresh 命令

你可能发现自己处于需要重建数据库的境地。在以前的 Laravel 版本中,我们通过运行 php artisan migrate:refresh 命令来实现。migrate:refresh 命令基于针对每个迁移文件的 down 方法指定的内容回滚所有迁移,然后再次运行迁移:

Laravel 5.5 新特性预览

但你可能数次遇到这个命令的问题,尤其是使用外键约束或者你的某个迁移中存在定义得不太好的 down() 方法。如果发生这样的事情,我们多数时候会手工删除产生问题的表 —— (可能通过 CLI 或 GUI)。这正是 migrate:fresh 能帮助我们的地方。这个命令删除所有表,然后再次运行已经存在的迁移:

JSON 型错误堆栈跟踪

虽然不是一个很大的变化,但是在之前的 Laravel 版本中,每次我们在构建 API 出错时,我们在一个 API 客户端(如 Postman)看到的是 HTML 标记。 在 Laravel 5.5 中,如果发生错误,我们会得到一个 JSON 型堆栈跟踪,而不是 HTML 标记,这看起来更加简单易用:

Laravel 5.5 新特性预览

自动包发现

这些是我们遵循的步骤,以便在我们的 Laravel 项目中使用第三方软件包。

  • 安装包

  • 注册包服务的提供商

  • 如果有任何 facade 的话就注册

步骤看起来很简单。

通过自动软件包可以发现,我们只需要一个软件包即可开始使用包。 但是请注意,只有在软件包提供程序配置了自动发现的软件包时,才能生效。

看看 Laravel Debugbar 包,它已经更新了 autodiscovery,我们来看看 composer.json 文件的 extra 段:

"extra": {
    "laravel": {
        "providers": [
            "Foo\\Bar\\ServiceProvider"
        ],
        "aliases": {
            "Bar": "Foo\\Bar\\Facade"
        }
    }
}

包的供应者会更新有 extra 段的 composer.json 文件,然后指定供应者和包的别名。

第三方组件的自动检测功能(Automatic Package Discovery)的另一个好处是移除了某个依赖项之后不会造成破坏。一般来说,就算我们卸载了某个包,还有包服务的供应者,以及围绕在 config/app.php 文件周围的假象,这在某些情况会导致问题的发生。

有了包自动发现,如果某个包被 Composer 删除掉了,与这个包相关的东西都会被删除。

vendor 的改动:publish 命令

在之前的 Laravel 版本中,运行 vendor:publish 命令将发布包中所有的资源,并从框架本身中发布一些资源。发布的一些资源包括迁移、视图和配置。

使用 Laravel 5.5 之后,我们必须对运行此命令时要发布的内容有一些更明确的说明。如果我们运行在 php artisan vendor:publis 命令并不传递任何标志,我们将被提示选择提供商 vendor 或标签,以使其更容易仅发布我们想要的资源。见下面的截图:

Laravel 5.5 新特性预览

我们可以通过在执行 publish 命令时指定 --all 或 --provider 标志来绕过该提示:

php artisan vendor:publish --all

查看原文: Laravel 5.5 新特性预览

  • crazylion
  • redkoala
需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。