当前位置: 首页 > news >正文

[身份验证脚手架] 技术栈特定安装逻辑

第6章:技术栈特定安装逻辑

欢迎回来,Web开发者🐻‍❄️

在前一章中,我们学习了Laravel Breeze如何使用应用布局为网页提供一致且专业的外观。我们已经见识了前端UI(第2章:前端认证与个人资料界面),理解了后端逻辑(第4章:认证后端控制器与请求),甚至查看了连接URL与代码的"地图"(第3章:认证路由)。

所有这些"魔法"都始于我们在第1章:Breeze安装命令中首次遇到的breeze:install命令。还记得它如何要求您选择一个前端技术栈(如Blade、Livewire、React、Vue或仅API)吗?

但这里有一个问题:Breeze如何精确知道为这些截然不同的选择放置哪些文件,或者安装哪些包?如果选择了Blade却安装了React组件,或者反之,会导致一团混乱!

这就是技术栈特定安装逻辑的用武之地。它是Breeze使用的巧妙系统,确保当您选择特定的前端技术时,它会为该项目完美设置,且针对该选择。

问题:一刀切行不通

想象您正在建造一座乐高房子。您有不同的说明书:一本用于简单小屋,一本用于未来宇宙飞船,另一本用于城市摩天大楼。每本说明书需要不同的积木、不同的组装步骤,并最终形成完全独特的结构。

在Web开发中,不同的前端技术就像这些不同的乐高说明书:

  • Blade使用.blade.php文件和Laravel的服务器端渲染。
  • ReactVue使用.jsx.vue文件、JavaScript框架和Inertia.js的客户端渲染。
  • Livewire使用PHP构建动态界面,通常使用.blade.php文件作为组件。
  • 仅API意味着没有前端,只有后端认证逻辑。

如果Breeze尝试将所有技术栈的所有文件都塞入您的项目,那将是一团混乱的冲突文件、不必要的包和一个非常困惑的应用。我们需要一种方法来为"正确"的选择应用"正确"的指令和"正确"的部分。

Breeze通过为每个技术栈使用专门的安装逻辑来解决这个问题。

什么是技术栈特定安装逻辑?

将Breeze的breeze:install命令视为一位聪明的建筑师。当您告诉建筑师"我想要一座React房子"时,他们不会给您Blade房子的说明书。相反,他们会拿出特定的蓝图,列出确切材料,并概述基于React的项目所需的精确步骤。

这就是"技术栈特定安装逻辑"的含义:

  • 专用模块:Breeze为每个前端技术栈(Blade、Livewire、Inertia with React、Inertia with Vue和仅API)提供独特、专用的代码片段(如单独的说明书)。
  • 独特指令:每个模块仅包含其技术栈所需的特定步骤。这包括:
    • 添加正确的PHP包(通过Composer)。
    • 添加正确的JavaScript包(通过Node.js的npmyarn)。
    • 仅复制必要的模板文件(如.blade.php.jsx.vue文件)。
    • 配置特定的构建工具(如用于JavaScript打包的Vite)。
    • 设置相关的后端文件(如控制器或中间件)。
  • “存根” - 模板文件:Breeze不会从头创建文件。相反,它在其包内有一个隐藏的stubs目录。该目录包含为每个技术栈预先制作、完美版本的所有文件。安装逻辑只是将这些"存根"文件复制到您的新Laravel项目中。

这种方法确保您选择的前端环境被正确且干净地集成到Laravel项目中,没有任何不必要的混乱或冲突。

Breeze如何安装您选择的技术栈

让我们逐步了解当您运行breeze:install命令并选择一个技术栈(比如Blade with Alpine)时会发生什么。

  1. 运行命令:在终端中输入php artisan breeze:install
  2. Breeze提问:它会提示您选择技术栈和其他选项(如暗黑模式、测试框架)。
  3. Breeze识别您的选择:根据您的回答,命令知道您想要"Blade"技术栈。
  4. Breeze执行Blade特定指令:Breeze调用专用的"Blade安装程序",而不是通用安装。该安装程序执行基于Blade的项目所需的所有独特步骤。

在这里插入图片描述

这确保仅添加与Blade相关的文件和包,创建一个干净且功能齐全的设置。其他技术栈的过程类似,但每次调用的是不同的专用模块。

幕后:安装命令的助手

breeze:install命令(来自我们在第1章中看到的src/Console/InstallCommand.php)是指挥官,但它本身并不完成所有工作。它将技术栈特定的任务委托给"traits"。

PHP中的trait就像可以赋予不同类的能力或工具集。Breeze使用诸如InstallsBladeStackInstallsInertiaStacksInstallsLivewireStackInstallsApiStack等trait。每个trait包含实际执行文件复制和包安装的方法(如installBladeStack()installInertiaVueStack()等)。

让我们再次看看InstallCommand.php中简化版的handle()方法:

// 文件:src/Console/InstallCommand.php(简化版handle方法)// ...class InstallCommand extends Command
{// 这些行引入了专门的安装工具use InstallsApiStack, InstallsBladeStack, InstallsInertiaStacks, InstallsLivewireStack;// .../*** 执行控制台命令。*/public function handle(){// 根据您的选择,调用其中一个'use' trait的特定方法:if ($this->argument('stack') === 'vue') {return $this->installInertiaVueStack(); // 来自InstallsInertiaStacks trait} elseif ($this->argument('stack') === 'react') {return $this->installInertiaReactStack(); // 来自InstallsInertiaStacks trait} elseif ($this->argument('stack') === 'blade') {return $this->installBladeStack(); // 来自InstallsBladeStack trait} elseif (in_array($this->argument('stack'), ['livewire', 'livewire-functional'])) {return $this->installLivewireStack($this->argument('stack') === 'livewire-functional'); // 来自InstallsLivewireStack trait} elseif ($this->argument('stack') === 'api') {return $this->installApiStack(); // 来自InstallsApiStack trait}// ... 错误处理}
}

说明:

  • use InstallsApiStack, ...;:这行告诉我们的InstallCommand,它可以访问这些trait中定义的所有方法。
  • if/elseif块检查您选择了哪个技术栈,并调用对应的安装方法(如installBladeStack())。

现在,让我们看看其中一个trait方法的内部,了解实际复制是如何发生的。我们将简化installBladeStack()方法:

// 文件:src/Console/InstallsBladeStack.php(简化版)
namespace Laravel\Breeze\Console;use Illuminate\Filesystem\Filesystem; // 用于处理文件的Laravel助手trait InstallsBladeStack
{protected function installBladeStack(){// 1. 安装/更新Node.js包(Tailwind、Alpine.js)$this->updateNodePackages(function ($packages) {return ['@tailwindcss/forms' => '^0.5.2','alpinejs' => '^3.4.2',// ... Blade特定的其他前端包] + $packages; // 将这些包添加到您的package.json});// 2. 复制PHP控制器(new Filesystem)->copyDirectory(__DIR__.'/../../stubs/default/app/Http/Controllers', // 源:Breeze的默认(Blade)控制器存根app_path('Http/Controllers')                          // 目标:您项目的控制器文件夹);// 3. 复制Blade视图(HTML模板)(new Filesystem)->copyDirectory(__DIR__.'/../../stubs/default/resources/views', // 源:Breeze的Blade视图存根resource_path('views')                            // 目标:您项目的视图文件夹);// 4. 复制Blade组件(如<x-guest-layout>)(new Filesystem)->copyDirectory(__DIR__.'/../../stubs/default/app/View/Components', // 源:Breeze的Blade组件存根app_path('View/Components')                           // 目标:您项目的组件文件夹);// 5. 复制配置文件(Tailwind、Vite)copy(__DIR__.'/../../stubs/default/tailwind.config.js', base_path('tailwind.config.js'));copy(__DIR__.'/../../stubs/default/resources/css/app.css', resource_path('css/app.css'));// ... 还有许多其他行来复制所有其他必要的文件并设置路由。$this->components->info('Breeze脚手架安装成功。');}
}

说明:

  • use Illuminate\Filesystem\Filesystem;:这行导入了一个强大的Laravel工具,可以轻松复制文件和文件夹。
  • __DIR__.'/../../stubs/default/...':这是非常重要的部分!__DIR__指的是InstallsBladeStack.php文件的当前目录。../../stubs/default向上导航两个目录,然后进入stubs/default文件夹。这是存储Blade技术栈所有预制作文件的地方。
  • copyDirectory()copy():这些来自Filesystem类的方法用于将整个文件夹或单个文件从Breeze的stubs复制到您的新Laravel项目中。
  • updateNodePackages():这是Breeze使用的一个辅助方法,用于安全地将新的JavaScript包添加到您项目的package.json文件中。

每个技术栈的安装程序工作方式类似,但指向不同的存根目录(如stubs/inertia-vuestubs/inertia-reactstubs/apistubs/livewire)并安装不同的包集。

示例:Inertia with Vue(简化版)

对于Inertia Vue技术栈,installInertiaVueStack()方法(来自InstallsInertiaStacks trait)会:

  1. 需要Composer包:安装inertiajs/inertia-laravellaravel/sanctumtightenco/ziggy(PHP包)。

    // 文件:src/Console/InstallsInertiaStacks.php(简化版)
    trait InstallsInertiaStacks
    {protected function installInertiaVueStack(){$this->requireComposerPackages(['inertiajs/inertia-laravel:^2.0','laravel/sanctum:^4.0','tightenco/ziggy:^2.0']);// ... 其他安装步骤}
    }
    

    说明: requireComposerPackages()运行composer require命令来添加这些PHP库。

  2. 更新Node.js包:安装@inertiajs/vue3vue@vitejs/plugin-vue等。

    // 文件:src/Console/InstallsInertiaStacks.php(简化版)
    trait InstallsInertiaStacks
    {protected function installInertiaVueStack(){// ... 之前的步骤$this->updateNodePackages(function ($packages) {return ['@inertiajs/vue3' => '^2.0.0','vue' => '^3.4.0','@vitejs/plugin-vue' => '^6.0.0',// ... 其他Inertia-Vue包] + $packages;});// ... 其他安装步骤}
    }
    

    说明: 这将Inertia Vue应用所需的JavaScript依赖项添加到您的package.json中。

  3. 复制Vue组件和布局:从stubs/inertia-vue/resources/js/Pagesstubs/inertia-vue/resources/js/Layouts复制.vue文件用于页面和组件。

    // 文件:src/Console/InstallsInertiaStacks.php(简化版)
    trait InstallsInertiaStacks
    {protected function installInertiaVueStack(){// ... 之前的步骤(new Filesystem)->copyDirectory(__DIR__.'/../../stubs/inertia-vue/resources/js/Components',resource_path('js/Components'));(new Filesystem)->copyDirectory(__DIR__.'/../../stubs/inertia-vue/resources/js/Layouts',resource_path('js/Layouts'));(new Filesystem)->copyDirectory(__DIR__.'/../../stubs/inertia-vue/resources/js/Pages',resource_path('js/Pages'));// ... 其他安装步骤}
    }
    

    说明: 这些命令将认证表单、仪表板和个人资料页面的实际.vue文件复制到您的resources/js目录中。

技术栈特定操作摘要

以下是每个技术栈安装逻辑处理的关键内容的快速概述:

特性Blade技术栈Inertia (React/Vue)技术栈Livewire技术栈API技术栈
PHP包(最少额外)inertiajs/inertia-laravellaravel/sanctumtightenco/ziggylivewire/livewirelivewire/voltlaravel/sanctum
Node.js包tailwindcssalpinejs@inertiajs/react/@inertiajs/vue3react/vue@vitejs/plugin-react/@vitejs/plugin-vuetailwindcsstailwindcss(已移除)
复制的UI文件.blade.php视图(如login.blade.php.jsx.vue组件(如Login.jsx.blade.php视图用于Livewire组件(无,相关前端文件已移除)
复制的后端文件控制器、表单请求、视图组件控制器、表单请求、Inertia中间件控制器、Livewire动作/表单API特定控制器、中间件、提供者
配置文件tailwind.config.jspostcss.config.jsvite.config.jstailwind.config.jspostcss.config.jsvite.config.jstailwind.config.jspostcss.config.jsvite.config.jsconfig/sanctum.php.env调整
特殊逻辑如果未选择,移除暗黑模式类可选TypeScript/ESLint/SSR设置,如果未选择,移除暗黑模式类volt:install命令,如果未选择,移除暗黑模式类移除package.json、前端目录

此表清楚地展示了每个技术栈如何需要一组独特的资源和配置,所有这些都由Breeze的技术栈特定逻辑精确处理。

结论

技术栈特定安装逻辑是驱动Laravel Breeze多功能性的隐藏引擎。通过智能地为每个前端技术选择(Blade、Livewire、React、Vue、仅API)提供专用指令、包和文件模板,Breeze确保您的项目从一开始就干净且正确地设置。

这种深思熟虑的设计为您节省了无数手动配置的时间,并帮助您避免常见陷阱,让您直接开始构建应用的独特功能。

您现在明白了,当您运行php artisan breeze:install时,这不是一个通用过程,而是一个高度定制的安装体验,动态适应您的偏好。

END ★,°:.☆( ̄▽ ̄).°★* 。

http://www.dtcms.com/a/348501.html

相关文章:

  • 人形机器人——电子皮肤技术路线:光学式电子皮肤及MIT基于光导纤维的分布式触觉传感电子皮肤
  • Java 学习笔记(基础篇9)
  • 有哪些工具可以帮助监测和分析JVM的内存使用情况?
  • 前端漏洞(上)- Django debug page XSS漏洞(漏洞编号:CVE-2017-12794)
  • jvm对象内存占用
  • 基于Spring Cloud与Kafka的支付金融场景面试问答解析
  • 代码救世:我在末世用编程称王(1)
  • 模块测试与低功耗模式全攻略
  • 什么是 Nonce?
  • 一台Win11电脑桌面图标一直重复闪烁的解决办法
  • 阿里 通义千问 Java23种设计模式
  • Python性能优化实战(三):给内存“减负“的实用指南
  • mysql 5.7 查询运行时间较长的sql
  • 【数据结构入门】排序算法(2):直接选择排序->堆排序
  • NLP:Transformer各子模块作用(特别分享1)
  • Python JSON数据格式
  • 禁用 Nagle 算法(TCP_NODELAY)
  • 【数据结构】-5- 顺序表 (下)
  • 谷德红外温度传感器在 3D 打印领域应用探究
  • 【小程序-慕尚花坊02】网络请求封装和注意事项
  • 序言|从《Machine Learning: A Probabilistic Perspective》出发:我的学习实践
  • 16、web应用系统分析语设计
  • 经营分析的价值不在报告厚度,而在行动颗粒度
  • .NET反射与IL反编译核心技术
  • 关于 svn无法查看下拉日志提示“要离线”和根目录看日志“no data” 的解决方法
  • Rust Web开发指南 第三章(Axum 请求体解析:处理 JSON、表单与文件上传)
  • 【Python NTLK自然语言处理库】
  • 数学建模-线性规划(LP)
  • GPT-5国内免费体验
  • 【Android】从一个AndroidRuntime看类的加载