Laravel 6.x核心特性深度解析

好的,Laravel 6.x 是一个重要的长期支持版本,引入了一些显著的特性改进。以下是其主要特性:

  1. 语义化版本号:

    • Laravel 6 开始正式采用 语义化版本号
    • 这意味着版本号将遵循 主版本号.次版本号.修订号 的格式。
    • composer.json 中引入依赖时,应使用 ^6.0 来指定允许安装 6.x 系列的版本。
  2. 任务调度中间件:

    • 允许为调度任务定义中间件。

    • 这使得在任务执行前后应用通用逻辑(如日志记录、速率限制、重试逻辑等)变得更加方便。

    • 例如:

      php 复制代码
      $schedule->command('report:generate')
               ->daily()
               ->middleware([RateLimited::class]);
  3. Job 中间件:

    • 类似于 HTTP 中间件,现在可以为队列任务定义中间件。

    • 这允许在处理队列任务之前和之后执行代码,实现诸如日志记录、任务重试策略、任务速率限制等功能。

    • 例如,创建一个记录任务处理时间的中间件:

      php 复制代码
      class LogJobExecution
      {
          public function handle($job, $next)
          {
              $start = microtime(true);
              $next($job);
              Log::info('Job executed in: ' . (microtime(true) - $start) . ' seconds');
          }
      }
      • 然后在 Job 类中使用 middleware 方法指定:
      php 复制代码
      public function middleware()
      {
          return [new LogJobExecution];
      }
  4. Eloquent 子查询增强:

    • 新增了对 where 子句中使用子查询的支持,语法更简洁。

    • 例如,查询所有拥有超过 100 美元收入的用户:

      php 复制代码
      User::where(function ($query) {
          $query->selectRaw('SUM(amount)')
                ->from('payments')
                ->whereColumn('user_id', 'users.id');
      }, '>', 100)->get();
    • 新增了 existsnotExists 方法,用于更优雅地编写基于相关模型是否存在的查询:

      php 复制代码
      User::whereExists(function ($query) {
          $query->select(DB::raw(1))
                ->from('posts')
                ->whereColumn('posts.user_id', 'users.id');
      })->get();
  5. 轻量级前端脚手架:

    • 移除了 laravel/ui 前端脚手架包(包含 Bootstrap/Vue 的认证脚手架)。
    • 提供了更轻量级的替代方案,用户可以根据需要选择使用 Vue、React 或其他前端框架,并通过 composer require laravel/ui 单独安装所需的脚手架。
  6. 改进的授权响应:

    • 当授权策略的 deny 方法被调用时(例如在控制器中使用 $this->authorize(...)),现在会抛出 AuthorizationException 异常。
    • 这个异常会携带一个可选的、更详细的拒绝消息,可以在全局异常处理器中进行自定义处理或返回给用户。
  7. 云端编译驱动:

    • 新增了 s3 驱动作为 config/cache.phpconfig/session.php 配置文件中 driver 选项的可选值。

    • 这使得可以将编译后的 Blade 模板缓存存储在 Amazon S3 等云存储服务中,对于在多服务器环境下部署应用非常有用。

    • 配置示例 (config/view.php):

      php 复制代码
      'compiled' => env(
          'VIEW_COMPILED_PATH',
          realpath(storage_path('framework/views'))
      ),
      // 或者使用 S3
      // 'compiled' => 's3',
  8. lazy 集合方法:

    • Illuminate\Support\Collection 新增了 lazy 方法。

    • 它返回一个 LazyCollection 实例,适用于处理非常大的数据集(例如数百万条数据库记录)。

    • LazyCollection 使用 PHP 的生成器 (yield) 实现,仅在需要时才从数据源加载数据,从而大大降低内存消耗。

    • 示例:

      php 复制代码
      $users = DB::table('huge_users_table')->cursor()->lazy();
      foreach ($users as $user) {
          // 处理每个用户
      }
  9. whenunless 集合方法支持传递值:

    • whenunless 集合方法现在支持将条件表达式的值作为参数传递给回调函数。

    • 这使得在条件为真时,可以在回调中使用该值进行更复杂的操作。

    • 示例:

      php 复制代码
      $collection->when(true, function ($collection, $value) {
          return $collection->push($value);
      }, 'some_value');
  10. ArrStr 辅助函数的改进:

    • Arr::sortRecursive 方法现在会递归地对数组的所有嵌套数组进行排序(之前仅对第一层排序)。
    • Str::isUuid 方法用于检查给定字符串是否是有效的 UUID。
    • 新增了 Str::orderedUuid 方法,生成按时间排序的 UUID (更适合用作数据库索引)。
  11. artisan 命令的改进:

    • make:model 命令新增了 --all 选项,用于一次性生成模型、迁移、工厂、资源控制器等。
    • route:list 命令的输出格式有所改进,更易读。
    • 新增了 test 命令 (php artisan test),作为 phpunit 命令的替代,提供更简洁的测试运行体验。
  12. dumpdd 的改进:

    • 现在可以在多个参数上调用 dumpdd,并且每个参数都会被转储。
    • 示例:dump($var1, $var2);
  13. 其他优化和修复:

    • 框架核心代码进行了大量优化和错误修复。
    • 依赖库升级(如 Symfony 组件)。

总的来说,Laravel 6.x 在保持框架易用性的同时,引入了更多现代化的开发特性(如任务/Job 中间件、子查询增强、LazyCollection),并对项目结构(语义化版本、轻量级前端)和开发者体验(授权响应、artisan 命令)进行了优化。

相关推荐
帐篷Li3 小时前
CPS统计数据汇总 实现计划
状态模式
onebyte8bits3 小时前
NestJS 系列教程(十八):文件上传与对象存储架构(Multer + S3/OSS + 访问控制)
前端·架构·node.js·状态模式·nestjs
前端不太难3 小时前
深度解析:OpenClaw 多智能体系统四大支柱
人工智能·状态模式·openclaw
前端不太难5 小时前
鸿蒙游戏开发的正确分层方式
华为·状态模式·harmonyos
兄弟加油,别颓废了。5 小时前
【无标题】
状态模式
SuperEugene5 小时前
Python 函数与模块化:前端工程化思维完全通用| 基础篇
前端·python·状态模式
前端不太难1 天前
推理+护栏:OpenClaw的信任双保险
状态模式·openclaw
观无2 天前
.NET Core + Ocelot 网关 跨域 (CORS) 配置
状态模式·.netcore
前端不太难2 天前
鸿蒙游戏如何接入支付 / 排行榜 / 社交
游戏·状态模式·harmonyos