精华内容
下载资源
问答
  • Laravel 7 新特性(发行说明)

    千次阅读 2020-03-24 18:11:24
    声明:Laravel 7 于 2020 年 3 月 3 日正式发布,不是 LTS 版本,所以 bug 修复支持会持续半年,到 2020 年 9 月 3 日,也就是下一个主版本 Laravel 8 发布前后,安全修复则会持续一年,到 2021 年 3 月 3 日。...

    声明:Laravel 7 于 2020 年 3 月 3 日正式发布,不是 LTS 版本,所以 bug 修复支持会持续半年,到 2020 年 9 月 3 日,也就是下一个主版本 Laravel 8 发布前后,安全修复则会持续一年,到 2021 年 3 月 3 日。

    Laravel 7 在 Laravel 6.x 版本基础上继续进行优化,主要包含了以下更新:

    • Laravel Airlock(轻量级 API 认证解决方案)
    • 路由匹配速度优化
    • 自定义 Eloquent 转化类型
    • Blade 组件标签
    • 字符串操作方法优化
    • 为开发者提供的 HTTP 客户端
    • 原生 CORS 支持
    • 路由模型绑定优化
    • 桩自定义(自定义生成类代码)
    • 数据库队列优化
    • 同时支持多个邮件驱动
    • 查询时类型转化
    • 新增 artisan test 命令
    • 其他 bug 修复和可用性优化

    下面我们来简单介绍下上述新增的特性以及代码优化

    Laravel Airlock

    作者:Taylor Otwell

    Laravel Airlock 为 SPA(单页面应用)、移动应用以及基于令牌的简单 API 系统提供了轻量级的认证解决方案,Airlock 允许为应用的每个用户账号生成多个 API 令牌(Token),然后对这些令牌进行授权并设置作用域,从而定义它们被允许执行的操作,就像 Github Access Token 那样,这样一来就可以在请求中带上这些令牌以便访问对应的 API 接口。

    后续我们会在 Airlock 文档中详细介绍 Laravel Airlock 的实现原理和使用明细。

    自定义 Eloquent 转化

    作者:Taylor Otwell

    Laravel 已经提供了大量内置的、有用的 Eloquent 转化类型,不过,有的时候,你可能还是需要自定义转化类型才能实现特定的功能。现在你可以通过定义一个实现 CastsAttributes 接口的类来完成这个自定义。

    实现该接口的类必须定义 get 和 set 方法,get 方法负责将取自数据库的原生值转换为对应的转化类型值,而与之相反,set 方法负责将转化类型值转换为可以存储到数据库的原生值。

    例如,我们可以像下面这样自定义一个转化类型来重新实现内置的 json 转化类型:

    <?php
    
    namespace App\Casts;
    
    use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
    
    class Json implements CastsAttributes
    {
        /**
         * Cast the given value.
         *
         * @param  \Illuminate\Database\Eloquent\Model  $model
         * @param  string  $key
         * @param  mixed  $value
         * @param  array  $attributes
         * @return array
         */
        public function get($model, $key, $value, $attributes)
        {
            return json_decode($value, true);
        }
    
        /**
         * Prepare the given value for storage.
         *
         * @param  \Illuminate\Database\Eloquent\Model  $model
         * @param  string  $key
         * @param  array  $value
         * @param  array  $attributes
         * @return string
         */
        public function set($model, $key, $value, $attributes)
        {
            return json_encode($value);
        }
    }

    定义好自定义转化类型后,可以通过如下方式将其应用到某个模型属性:

    <?php
    
    namespace App;
    
    use App\Casts\Json;
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
         * The attributes that should be cast to native types.
         *
         * @var array
         */
        protected $casts = [
            'options' => Json::class,
        ];
    }

    这样,当我们从从数据库获取 users 表的 options 字段值时,会自动对其进行 JSON 解码完成类型转化,而将该字段值存储到数据库时,会自动对其进行 JSON 编码。

    更加详细的使用明细可以参考 Eloquent 相关文档。

    Blade 组件标签 & 优化

    作者:SpatieMarcel PociotCaleb PorzioDries Vints 和 Taylor Otwell

    Blade 组件现在被重构为允许基于标签进行渲染、支持属性管理、组件类、内联视图组件等,因此代码调整很多,可以参考 完整的 Blade 组件 文档了解更多细节。

    综上所述,Blade 组件现在会有一个与之关联的类来指定接收的数据,定义在组件类中的所有公共属性和方法会自动在组件视图中生效,任何在该组件视图中指定的额外 HTML 属性都可以使用自动引入的 $attribute 变量(它是一个 attribute bag 实例)进行管理。

    例如,我们定义一个 App\View\Components\Alert 组件如下:

    <?php
    
    namespace App\View\Components;
    
    use Illuminate\View\Component;
    
    class Alert extends Component
    {
        /**
         * The alert type.
         *
         * @var string
         */
        public $type;
    
        /**
         * Create the component instance.
         *
         * @param  string  $type
         * @return void
         */
        public function __construct($type)
        {
            $this->type = $type;
        }
    
        /**
         * Get the class for the given alert type.
         *
         * @return string
         */
        public function classForType()
        {
            return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
        }
    
        /**
         * Get the view / contents that represent the component.
         *
         * @return \Illuminate\View\View|string
         */
        public function render()
        {
            return view('components.alert');
        }
    }

     

    该组件对应的视图模板代码如下所示:

    <!-- /resources/views/components/alert.blade.php -->
    
    <div class="alert {{ $classForType() }}" {{ $attributes }}>
        {{ $heading }}
    
        {{ $slot }}
    </div>

     然后我们就可以在另一个 Blade 模板中使用组件标签来渲染该组件:

    <x-alert type="error" class="mb-4">
        <x-slot name="heading">
            Alert content...
        </x-slot>
    
        Default slot content...
    </x-alert>

     

    这里只演示了 Blade 组件标签最基本的使用,没有涉及到匿名组件、内联视图组件等特性,你可以参考 完整的 Blade 组件文档 来了解更多使用明细。

    注:之前 Blade 组件的的 @component 语法没有也不会被移除。

    HTTP 客户端

    作者:Adam WathanJason McCreary 和 Taylor Otwell

    基于 Guzzle HTTP Client,Laravel 现在提供了一个优雅的、最小化的 HTTP 客户端 API,允许你发起 HTTP 请求与其他 Web 应用进行通信。该功能是对 Guzzle 库的封装,并且会专注于自身的使用场景,提供更好的开发者体验。

    例如,我们可以通过该功能发起一个 POST 请求,并设定数据传输格式为 JSON,示例代码如下:

    use Illuminate\Support\Facades\Http;
    
    $response = Http::withHeaders([
        'X-First' => 'foo'
        'X-Second' => 'bar'
    ])->post('http://test.com/users', [
        'name' => 'Taylor',
    ]);
    
    return $response['id'];

    此外,这个 HTTP 客户端还提供了非常棒的、符合人机工程学的测试功能:

    Http::fake([
        // Stub a JSON response for GitHub endpoints...
        'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),
    
        // Stub a string response for Google endpoints...
        'google.com/*' => Http::response('Hello World', 200, ['Headers']),
    
        // Stub a series of responses for Facebook endpoints...
        'facebook.com/*' => Http::sequence()
                                ->push('Hello World', 200)
                                ->push(['foo' => 'bar'], 200)
                                ->pushStatus(404),
    ]);

    想要了解更多关于 HTTP 客户端的特性,请参考 HTTP 客户端 文档。

    流畅的字符串操作

    作者:Taylor Otwell

    如果你之前通过 Laravel 内置的字符串函数处理过字符串的话,可能对 Laravel 中已存在的 Illuminate\Support\Str 类非常熟悉。Laravel 7 现在基于这些函数提供了一个更加面向对象的、更加流畅的字符串操作库。你可以使用 String::of 创建一个 Illuminate\Support\Stringable 对象,然后基于该对象提供的方法以链式的操作对字符串进行处理:

    return (string) Str::of('  Laravel Framework 6.x ')
                    ->trim()
                    ->replace('6.x', '7.x')
                    ->slug();

     

     

    关于流畅的字符串操作支持的更多方法信息,请参考 完整的官方文档

    路由模型绑定优化

    作者:Taylor Otwell

    自定义 slug

    有时候你可能想要使用 id 之外的其他字段来解析 Eloquent 模型,在 Laravel 7 中,你可以直接在路由参数定义中指定这个字段:

    Route::get('api/posts/{post:slug}', function (App\Post $post) {
        return $post;
    });

     

    自动化作用域

    有时候,当你在单个路由定义中隐式绑定多个 Eloquent 模型时,你可能想要将第二个 Eloquent 模型的作用域设置为第一个 Eloquent 模型的子级。

    例如,考虑这个场景 —— 通过 slug 字段为指定用户获取博客文章:

    use App\Post;
    use App\User;
    
    Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
        return $post;
    });

    当使用自定义键隐式绑定作为嵌套路由参数时,Laravel 7 会自动将查询作用域设置为获取父级模型的嵌套子模型 —— 使用默认约定规则来猜测父级模型上的关联关系名称。比如这个例子中,就是从指定 User 父级模型(通过 {user} 传入用户 ID)上通过关联关系 posts 获取指定 slug 的子级 Post 模型。

    想要了解更多关于路由模型绑定的细节,可以参考 路由文档

    多个邮件驱动

    作者:Taylor Otwell

    Laravel 7 允许在单个应用中配置多个邮件驱动,mail 配置文件中的每个邮件配置都有自己的选项甚至唯一的 transport,从而允许应用使用不同的邮件服务发送特定邮件消息。例如,你的应用可能使用 Postmark 发送交易邮件,同时使用 Amazon SES 发送群发邮件。

    默认情况下,Laravel 会使用 default 配置作为默认邮件配置,不过,你可以在发送邮件时通过 mailer 方法手动指定特定的邮件配置:

    Mail::mailer('postmark')
        ->to($request->user())
        ->send(new OrderShipped($order));

    路由缓存速度优化

    作者:Symfony 贡献者和 Dries Vints

    Laravel 7 提供了一个新的方法来匹配那些使用 route:cache 命令缓存的、已编译的缓存路由,在大型应用(例如,超过 800 个路由)的 "Hello World" 基准测试结果中,这些优化可以将每秒处理请求数提升两倍,不过,该优化对上层代码而言是透明的,无需对现有代码做任何调整。

    支持 CORS

    作者:Barry vd. Heuvel

    Laravel 7 引入了对 CORS(Cross-Origin Resource Sharing,跨域资源共享)的原生支持,这是通过集成 Laravel CORS 扩展包来实现的,你可以在开箱提供的 config/cors.php 配置文件中对其进行配置。

    关于 CORS 的更多信息,请参考 CORS 文档

    查询时类型转化

    作者:Matt Barlow

    有时候你可能需要在执行数据库查询时应用字段类型转化,例如从表中查询原生值时。我们来看下面这个例子:

    use App\Post;
    use App\User;
    
    $users = User::select([
        'users.*',
        'last_posted_at' => Post::selectRaw('MAX(created_at)')
                ->whereColumn('user_id', 'users.id')
    ])->get();

    这个查询结果中的 last_posted_at 属性会是一个原生字符串,如果能够在执行查询时应用 date 转化类型到该属性会很方便,这样我们在查询结果中直接得到的就是日期类型。要实现这个目的,可以使用 Laravel 7 新提供的 withCasts 方法:

    $users = User::select([
        'users.*',
        'last_posted_at' => Post::selectRaw('MAX(created_at)')
                ->whereColumn('user_id', 'users.id')
    ])->withCasts([
        'last_posted_at' => 'date'
    ])->get();

    MySQL 8+ 数据库队列优化

    作者:Mohamed Said

    在之前版本的 Laravel 中,由于死锁的原因,基于 database 驱动的队列在生产环境中并不足够稳健。Laravel 7 对此进行了优化,如果应用使用的是 MySQL 8+ 作为数据库队列驱动的话,底层通过使用 FOR UPDATE SKIP LOCKED 和其他 SQL 增强技术,使得 database 驱动现在可以安全地运行在生产环境。

    test Artisan 命令

    作者:Nuno Maduro

    除了 phpunit 命令之外,现在还可以使用 Artisan 命令 test 运行测试。Artisan` 测试运行器提供了美观的控制台界面,以及更多关于当前测试结果的信息。此外,运行器会在第一次测试失败时自动终止:

    php artisan test

    file

    任何传递给 phpunit 命令的参数都可以传递给 test Artisan 命令:

    php artisan test --group=feature

    Markdown 邮件模板优化

    作者:Taylor Otwell

    默认的 Markdown 邮件模板基于 Tailwind CSS 调色板进行了全新的、更加现代化的设计。当然,这个模板可以基于应用需求进行发布和自定义:

    file

    更多关于 Markdown 邮件的信息,请参考 邮件文档

    桩自定义

    作者:Taylor Otwell

    Artisan 控制台的 make 命令可用于创建多种类型的类,比如控制器、队列任务、数据库迁移、以及测试等,这些类都是通过「桩」文件生成的,所谓桩文件可以看作是模板文件,可以基于输入填充模板中指定位置的值最终生成目标 PHP 文件。不过,有时候你可能想要对 Artisan 生成的文件进行一些微调,为此,Laravel 7 提供了 stub.publish 命令将最常用的桩文件发布出来以便进行自定义:

    php artisan stub:publish

    发布后的桩文件位于项目根目录下的 stubs 目录下,对这些桩文件的任何修改最终都会反馈到通过 Artisan make 命令生成的相应 PHP 代码中。

    maxExceptions 队列配置

    作者:Mohamed Said

    有时候,你可能想要指定一个可能被多次尝试的队列任务,并且在重试次数到达期望值时失败。在 Laravel 7 中,可以在任务类中定义一个 maxExceptions 属性来实现这个功能:

    <?php
    
    namespace App\Jobs;
    
    class ProcessPodcast implements ShouldQueue
    {
        /**
         * The number of times the job may be attempted.
         *
         * @var int
         */
        public $tries = 25;
    
        /**
         * The maximum number of exceptions to allow before failing.
         *
         * @var int
         */
        public $maxExceptions = 3;
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            Redis::throttle('key')->allow(10)->every(60)->then(function () {
                // Lock obtained, process the podcast...
            }, function () {
                // Unable to obtain lock...
                return $this->release(10);
            });
        }
    }

    在这个例子中,这个任务会在应用无法获取 Redis 锁十秒后释放,然后继续重试至多 25 次,如果任务执行过程中抛出 3 次未处理异常,则会失败退出。

    版权许可

    本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

    转载无需与我联系,但须注明出处,注明文章来源 Laravel 7 新特性(发行说明)

    展开全文
  • 如果你之前通过 Laravel 内置的字符串函数处理过字符串的话,可能对 Laravel 中已存在的 ...Laravel 7 现在基于这些函数提供了一个更加面向对象的、更加流畅的字符串操作库。你可以使用 String::of 创建一个 Illum...

    如果你之前通过 Laravel 内置的字符串函数处理过字符串的话,可能对 Laravel 中已存在的 Illuminate\Support\Str 类非常熟悉。Laravel 7 现在基于这些函数提供了一个更加面向对象的、更加流畅的字符串操作库。你可以使用 String::of 创建一个 Illuminate\Support\Stringable 对象,然后基于该对象提供的方法以链式的操作对字符串进行处理:

    举例说明:

    return (string) Str::of('  Laravel Framework 6.x ')
                    ->trim()
                    ->replace('6.x', '7.x')
                    ->slug();

    上面的代码,来自官网发行说明,我们很容易看到,每个方法都是干嘛的。

    首先第一步将字符串 Laravel Framework 6.x 使用 Str::of() 方法进行包裹,之后我们就可以使用 Laravel 7 为我们提供的各种流畅的操作方法。

    比如 trim() 去除前后空格。 replace() 进行替换,slug() 将字符串变成 slug 的形式

    上面的代码实际运行结果就是:

    laravel-framework-7x

    上面的方法是不是用起来非常简单?

    接下来我们介绍几个常用的方法。

    before() 方法返回字符串中给定值之前的所有内容:

    use Illuminate\Support\Str;
    
    $slice = Str::of('This is my name')->before('my name');
    
    // 'This is '

    同理有 before(),就会有 after()

    after() 方法返回字符串中给定值之后的所有内容。如果字符串中不存在该值,则将返回整个字符串:

     use Illuminate\Support\Str;
    
    $slice = Str::of('This is my name')->after('This is');
    
    // ' my name'

    append() 方法将给定值附加到字符串:

    use Illuminate\Support\Str;
    
    $string = Str::of('Taylor')->append(' Otwell');
    
    // 'Taylor Otwell'

    lower() 方法将字符串转换为小写:

    use Illuminate\Support\Str;
    
    $result = Str::of('LARAVEL')->lower();
    
    // 'laravel'

    upper 函数将给定的字符串转换为大写:

    use Illuminate\Support\Str;
    
    $adjusted = Str::of('laravel')->upper();
    
    // LARAVEL

    title() 函数将给定的字符串转换为「首字母大写」:

    use Illuminate\Support\Str;
    
    $converted = Str::of('a nice title uses the correct case')->title();
    
    // A Nice Title Uses The Correct Case

    substr() 函数将给定的 start 和 length 参数指定的字符串部分:

    use Illuminate\Support\Str;
    
    $string = Str::of('Laravel Framework')->substr(8);
    
    // Framework
    
    $string = Str::of('Laravel Framework')->substr(8, 5);
    
    // Frame

    ucfirst() 函数将给定的字符串首字母大写:

    use Illuminate\Support\Str;
    
    $string = Str::of('foo bar')->ucfirst();
    
    // Foo bar

    words() 函数限制字符串中的单词数:

    use Illuminate\Support\Str;
    
    $string = Str::of('Perfectly balanced, as all things should be.')->words(3, ' >>>');
    
    // Perfectly balanced, as >>>

    length() 方法返回字符串的长度:

    use Illuminate\Support\Str;
    
    $length = Str::of('Laravel')->length();
    
    // 7

    ok,以上介绍了一些常用的方法,其实都是文档上的操作,我只不过那不过来操作演示一遍,更多的用法,请直接查看 文档

    下面是 所有的方法集合

    file

    直接去 官方文档 进行查看。

    关于极客返利

    极客返利 是由我个人开发的一款网课返利、返现平台。包含 极客时间返现、拉勾教育返现、掘金小册返现、GitChat返现。目前仅包含这几个平台。后续如果有需要可以考虑其他平台。 简而言之就是:你买课,我返现。让你花更少的钱,就可以买到课程。

    https://geek.laravelcode.cn

    https://geek.idaka.ink

    版权许可

    本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

    转载无需与我联系,但须注明出处,注明文章来源 Laravel 7 新特性-流畅的字符串操作

    联系我

    编程怪事
    展开全文
  • Laravel 7 很重要一个更新就是 Blade 组件标签 & 优化 其实组件 和 布局 layout 有点儿类似,我们可以抽离相同的代码块,封装成一个组件。以前我们是封装成多个 layout 来进行布局。这个功能和 Vue 极度类似,...

    Laravel 7 很重要一个更新就是 Blade 组件标签 & 优化

    其实组件 和 布局 layout 有点儿类似,我们可以抽离相同的代码块,封装成一个组件。以前我们是封装成多个 layout 来进行布局。这个功能和 Vue 极度类似,很大程度上借鉴了 Vue.js。

    ok,废话不多说,我们就来看看组件如何使用。

    使用组件

    Laravel 7 的版本,新增了一个创建组件的命令,make:component

    我们试着生成一个 Header 组件。

    php artisan make:component Header

    运行以上命令,将会生成两个文件,一个是:app/View/Components/Header.php,另一个是:resources/views/components/header.blade

    我们先编写组件,编辑 resources/views/components/header.blade

    <div>
        <ul class="nav">
            <li class="nav-item">
                <a class="nav-link active" href="#">Active</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Link</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Link</a>
            </li>
            <li class="nav-item">
                <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
            </li>
        </ul>
    </div>

    然后组件怎么引入呢?其实就像写标签,HTML 标签一样即可。Laravel 7 里组件的引入都是 以 x- 来进行引入

    为了简化方便,我将在 welcome.blade.php 模板里来引入。我将去掉无用的代码,改成精简的 HTML。 要想使用组件 只需要 <x-header></x-header> 即可

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <x-header></x-header>
    </body>
    </html>

    其实我们也可以在进行简化 采用如下的方式也是同样的道理

    <x-header />

    是不是非常方便?我们以后在进行布局的时候,时不时可以直接采用组件的方式呢。

    组件传参

    字符串传参

    熟悉 Vue 的童鞋,知道我们组件是可以进行传参的,那么在 Laravel 7 里可不可以呢?

    答案是当然可以。

    接下来我们来看下 另一个文件 app/View/Components/Header.php

    <?php
    
    namespace App\View\Components;
    
    use Illuminate\View\Component;
    
    class Header extends Component
    {
        /**
         * Create a new component instance.
         *
         * @return void
         */
        public function __construct()
        {
            //
        }
    
        /**
         * Get the view / contents that represent the component.
         *
         * @return \Illuminate\View\View|string
         */
        public function render()
        {
            return view('components.header');
        }
    }

    假如我们传入一个 title 的字段,只需要修改 __construct 构造函数即可

    
    public $title;
    
    /**
     * Create a new component instance.
     *
     * @return void
     */
    public function __construct($title)
    {
        $this->title = $title;
    }

    之后修改组件传参

    <x-header title="Laravel 7"></x-header>

    接着,我们如果在组件中显示传入的值,直接使用 双大括号即可。

    <ul class="nav">
        <li class="nav-item">
            <a class="nav-link active" href="#">{{ $title }}</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item">
            <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
        </li>
    </ul>

    以上传递是一个简单的字符串。那么如果传递一个变量呢?

    变量传参

    变量传参的方式就不可以采用上方的属性传参了。不可以采用如下的方式

    @php
        $title = 'Hello Laravel 7';
    @endphp
    <x-header title="{{ $title }}"></x-header>

    如果采用以上方式将会输出如下:并不能达到我们想要的效果

    <?php echo e($title); ?>

    那么该怎样使用呢?其实类似于 Vue 一样 采用 : 的方式,然后也不能使用 双大括号了,直接字符串包含变量即可

    <x-header :title="$title"></x-header>

    组件还有一个强大的用法,那就是可以在组件视图中执行组件类上的任何公共方法

    假如 app/View/Components/Header.php 文件有一个 返回数据的方法。

    public function menus()
    {
        return [
            'Laravel','Vue','Java'
        ];
    }

    那么直接就可以在组件中使用

    <ul class="nav">
        @foreach($menus as $menu)
            <li class="nav-item">
                <a class="nav-link active" href="#">{{ $menu }}</a>
            </li>
        @endforeach
    </ul>

    方法也可以传递参数,这里我就不演示了。可以参考文档 Blade 模板

    插槽

    同理,他和 Vue 也类似,插槽意思就是我们可以在组件内添加一些其他内容。 比如:

    @php
        $title = 'Hello Laravel 7';
    @endphp
    <x-header :title="$title">
        <div><strong>Whoops!</strong> Something went wrong!</div>
    </x-header>

    那如果要显示添加的内容,我们组件这里需要添加一个 {{ $slot }} 即可。

    组件中的代码如下:

    <ul class="nav">
        @foreach($menus as $menu)
            <li class="nav-item">
                <a class="nav-link active" href="#">{{ $menu }}</a>
            </li>
        @endforeach
    </ul>
    
    {{ $slot }}

    插槽也是可以进行传参的。

    
    <x-slot name="error">
        Server Error
    </x-slot>

    然后在组件使用 $error 即可接受传递的内容

    {{ $error }}

    ok,以上就是 关于 Laravel 7 组件的一些新特性,当然其中还有一些用法,我没有说明,你可以参考 官方文档 来进一步使用

    关于极客返利

    极客返利 是由我个人开发的一款网课返利、返现平台。包含 极客时间返现、拉勾教育返现、掘金小册返现、GitChat返现。目前仅包含这几个平台。后续如果有需要可以考虑其他平台。 简而言之就是:你买课,我返现。让你花更少的钱,就可以买到课程。

    https://geek.laravelcode.cn

    https://geek.idaka.ink

    版权许可

    本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

    转载无需与我联系,但须注明出处,注明文章来源 Laravel 7 新特性-组件以及插槽的简单用法

    联系我

    编程怪事
    展开全文
  • Laravel 7 开始新增了一些新特性,今天我们来讲解下 路由绑定的用法,自定义键名(slug)以及作用域(范围限定) 首先我们 安装最新版本的 Laravel ,并且创建两张数据表。 安装 Laravel 7 composer create-...

    Laravel 7 开始新增了一些新特性,今天我们来讲解下 路由绑定的新用法,自定义键名(slug)以及作用域(范围限定)

    首先我们 安装最新版本的 Laravel ,并且创建两张数据表。

    安装 Laravel 7

    composer create-project --prefer-dist laravel/laravel blog

    生成用户认证脚手架

    composer require laravel/ui
    
    npm install && npm run dev

    我们使用内置服务,来启动一个 web server

    php artisan serve

    生成用户填充数据

    首先修改 .env 文件。修改数据库信息

    DB_CONNECTION=mysql
    DB_HOST=mysql
    DB_PORT=3306
    DB_DATABASE=blog
    DB_USERNAME=root
    DB_PASSWORD=root

    注意:我这里使用 laradock ,所以 DB_HOSTmysql

    新建 Post 文章数据表

    php artisan make:model Post -mfcs

    创建 Post 表字段,修改 database\migrations\日期_create_posts_table.php 文件

    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class CreatePostsTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('posts', function (Blueprint $table) {
                $table->id();
                $table->bigInteger('user_id')->unsigned();
                $table->string('title');
                $table->text('body');
                $table->string('slug');
                $table->timestamps();
                $table->foreign('user_id')->references('id')->on('users');
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('posts');
        }
    }

    生成 数据表

    php artisan migrate

    添加 Post 数据工厂,修改 database\factories\PostFactory.php 文件

    <?php
    
    /** @var \Illuminate\Database\Eloquent\Factory $factory */
    
    use App\Post;
    use Faker\Generator as Faker;
    
    $factory->define(Post::class, function (Faker $faker) {
        return [
            'user_id' => \App\User::all()->random(1)->first()->id,
            'title' => $faker->title,
            'body' => $faker->text,
            'slug' => $faker->slug,
        ];
    });

    用户数据填充

    php artisan make:seed UsersTableSeeder
    <?php
    
    use Illuminate\Database\Seeder;
    
    class UsersTableSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            factory(\App\User::class,5)->create();
        }
    }

    Post 数据填充

    <?php
    
    use Illuminate\Database\Seeder;
    
    class PostSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            factory(\App\Post::class,50)->create();
        }
    }

    注册数据填充 database/seeds/DatabaseSeeder.php

    <?php
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends Seeder
    {
        /**
         * Seed the application's database.
         *
         * @return void
         */
        public function run()
        {
             $this->call(UsersTableSeeder::class);
             $this->call(PostSeeder::class);
        }
    }

    运行迁移文件,进行数据填充

    php artisan db:seed

    ok,以上准备工作做完,(其实你大可不必这样,你可以任意创建 User、Post 数据表)我们正式开始今天的话题。

    自定义键

    首先我们来说一下自定义键是个什么东西,你可能知道,我们如果要查找一个数据,比如,我们要查询 Posts 文章表里的第一条数据。我们的以前的 URL 可能是如下这样:

    http://laravel7.test/posts/posts/1

    我们是通过主键 ID 来进行查找的。这种方法 看起来没什么问题,但是我们网站有多少数据用户是可以轻而易举地猜到。

    当然我们在以前的版本可以更改这个,我们需要在 模型中重写一个方法 getRouteKeyName

    接下来我们看下 Laravel 7 以前是怎么实现的

    首先。定义一个路由

    Route::get('posts/{post}', function (\App\Post $post) {
        dd($post);
    });

    接下来,我们重写 Post 模型文件 getRouteKeyName 方法。

    public function getRouteKeyName()
    {
        return 'slug';
    }

    接下来我们就可以使用 slug 来进行查询了 比如下面的 URL

    http://laravel7.test/posts/amet-laudantium-reprehenderit-ullam-repudiandae

    Laravel 7 的版本,实现以上自定义键,就更加方便了 只需要在 路由上添加一个动态参数即可。

    Route::get('posts/{post:slug}', function (\App\Post $post) {
        dd($post);
    });

    作用域(访问限制)

    怎么理解呢?举一个应用场景,我们要限定查找用户,然后在当前用户下查找他发表的文章某一篇文章。

    我们代码演示一下

    Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
        return $post;
    });

    首先 我们看下 数据库文章表的数据

    file

    假如我们查找文章 id 为 1,同时 他的 user_id 是 2, 那么访问的路由就是

    http://laravel7.test/api/users/2/posts/1

    file

    那么我们在查找 id 为 2 的数据,可以看到 他的 user_id 并不是 2 了,理论上我们不应该查到才是。

    http://laravel7.test/api/users/2/posts/2

    然而实际情况确 并非如此。数据也是返回来了。

    file

    文档上就是这样呀?就是改变路由文件而已,照着做了,发现并不可以。

    其实如果我们要实现如上的模式,我们还得需要设置模型的绑定关系

    Post 模型

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }

    User 模型

    public function posts()
    {
        return $this->hasMany(Post::class);
    }

    OK,再试着访问下,纳尼,为什么还是可以访问到???

    最终看了半天文档 我发现他给的路由后面有一个 动态参数 slug,加上试试。

    Route::get('api/users/{user}/posts/{post:slug}', function (\App\User $user, \App\Post $post) {
        return $post;
    });

    那么 路由就得换成如下的方式:

    http://laravel7.test/api/users/2/posts/et-saepe-enim-minus-et

    这下终于可以了,终于实现我们想要的效果了。但是 难道非得是 slug 吗?我换成 id 不行吗?

    Route::get('api/users/{user}/posts/{post:id}', function (\App\User $user, \App\Post $post) {
        return $post;
    });

    这样也是可以的。

    好了,以上就是 Laravel 7 路由的新特性,外加我趟过的坑,希望对你有帮助。

    关于极客返利

    极客返利 是由我个人开发的一款网课返利、返现平台。包含 极客时间返现、拉勾教育返现、掘金小册返现、GitChat返现。目前仅包含这几个平台。后续如果有需要可以考虑其他平台。 简而言之就是:你买课,我返现。让你花更少的钱,就可以买到课程。

    https://geek.laravelcode.cn

    https://geek.idaka.ink

    版权许可

    本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

    转载无需与我联系,但须注明出处,注明文章来源 Laravel 7 新特性-路由的趟坑之路(自定义键名以及作用域)

    联系我

    编程怪事
    展开全文
  • laravel5.4新特性

    2018-08-16 11:32:00
    http://www.cnblogs.com/webskill/category/1067140.html laravel 5.4 新特性 component and slot 使用: 1.component panel <article class="message"> <div class="message-header"> <p>He...
  • Laravel5.5新特性

    2018-02-24 22:26:00
    1、的报错页面 报错更加美观,并标记显示出错误的代码 2、包的自动配置 在conposer.json文件中加入包中的配置,下载后就会自动配置到app.php 文件中,使用更方便 在之前的 Laravel 版本当中,我们在安装和...
  • Laravel5.5新特性系列,带你了解Laravel5.5的功能以及功能改进,Laravel越来越强大,同时也越来越发杂。希望掌握使用Laravel的童鞋尽快学习。
  • Laravel 5.2 新特性系列 —— 多用户认证功能实现详解 发布于2016年2月20日 Laravel5.2新增多用户认证支持,即同时允许不同数据表用户(如前台用户、后台用户)登录认证。下面我们就来简单介绍多用户登录及注册...
  • 1、5.3项目目录变化 ...7、非常实用的toggle 在处理多对多的关系时,比如评论点赞,或者收藏、取消收藏的时候,非常实用。 8、notify:email通知 php artisan make:notification 9、notification中使用数据库
  • 1、什么是 Laravel EchoEcho是一个让我们在Laravel应用中轻松实现WebSockets(关于WebSockets工作原理和机制可参考这篇文章:WebSocket 实战)功能的工具,同时简化了构建复杂WebSockets交互中更加通用、复杂的部分...
  • Laravel 5.8 开始,传递到缓存驱动的表示缓存有效期(TTL)的整型数据单位将会从分钟调整为秒,秒级缓存会使得开发者得以对缓存周期进行更加细粒度的控制,并且符合 PSR-16 标准: The Time To Live (TTL) of an...
  • laravel5中不仅取消了自动载入App以下多个目录(如:controller、model等),laravel5还增加了许多帮助函数: ArraysPathsRoutingStringsURLsMiscellaneous如上所示,Routing是laravel5新增的函数,除此之外,还有...
  • Laravel 5.0 的新特性

    2015-02-08 06:51:02
    原文: http://laravel.com/docs/master/releases#laravel-5.0 译文: http://discuss.flarum.org.cn/24-laravel-5 ...Laravel 5.0 包括超过 22 个新特性Laravel 5.0 引入了一个新鲜的应用架构到默认的 ...
  • laravel 框架的优缺点 优点 社区非常活跃 Laravel 的设计思想是很先进的,非常适合应用各种开发模式。 0. laravel框架中 服务容器是整个系统功能调度配置的核心,在系统运行过程中动态的为系统提供需要的服务 从而...
  • PHP7新特性Laravel常见知识梳理 由于个人技术水平有限,答案或许会有偏差,欢迎大家指正。 PHP模块 PHP7 和 PHP5 的区别,具体多了哪些新特性? 性能提升了两倍 结合比较运算符...
  • 对于使用 Laravel 的开发者来说,可能都会惊叹于 Eloquent Model 的强大,但是在强大的表面之下,其实还是有很多鲜为人知的特性的,本文即来分享十个 Laravel Eloquent 的强大特性。 1.更强大的 find() 方法很多...
  • 下面总结了一下 Laravel 5.2.23 中将加入的一些功能。1. in_array() 校验规则Laravel 中的数组校验是非常棒的,最近我把我项目中的很多代码进行了替换,只需要简短的几行代码。在 5.2.23 中将加入一个的规则,...
  • 如何升级laravel5.4到laravel5.5并使用新特性? 2017-10-23 23:50 by 轩脉刃, ... 阅读, ... 评论, 收藏, 编辑 如何升级laravel5.4到laravel5.5并使用新特性? 修改composer.json: "laravel/framework": "5.5...
  • ## Laravel5新特性 - Events & Handlers 事件是系统开发中非常重要的一部分,可以在一次编码后只需修改事件规则,无需更改流程代码。比如商城站,用户在登陆之后,系统会做两件事情: 1.给用户发送站内信...
  • Laravel5的新特性 - 目录结构和命名空间 从Laravel4.2升级到Laravel5最大的一个原因就是因为目录结构的调整。Laravel5的目录结构能够更好的帮助人们理解web开发的最佳实践,对WEB的规范化将会做出不小的贡献。那么...
  • laravel-traits-示例 了解有关Laravel 7 Trait,如何在Laravel中创建Trait以及如何在Laravel 7应用程序中使用Trait的信息。 特性使我们能够开发可重用的代码并将其注入Laravel应用程序的控制器和模态中。
  • 里面吸取了很多开源项目的精髓,laravel 7、AdminLte、mews/captcha等,开箱即用,非常灵活,该版本是v2.0版本,后面根据大家的需求,结合laravel 7特性,推出更有laravel 7特色的版本。欢迎各位同仁使用后,提出...
  • Laravel 7发行说明

    2020-07-28 23:55:46
    引入 Laravel 框架或其组件时,应始终使用版本约束,如^7.0,因为 Laravel 的主要版本确实包含非兼容性更改。我们会努力确保您可以在一天或更短的时间内更新到最新版本。 支持政策 对于 LTS 版本,例如 Laravel 6...
  • Laravel 7.x - 学习/实践

    千次阅读 2020-07-30 22:37:30
    了解使用laravel 7.x的特性. 2.学习/操作 1.介绍 https://blog.csdn.net/william_n/article/details/103253609 https://xueyuanjun.com/books/laravel-docs-7 //Laravel 7 中文文档 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,985
精华内容 794
关键字:

laravel7新特性