发布于 2026-01-06 6 阅读
0

Laravel Modular [注释] 目录 1. 模块配置 2. 模型、工厂和 DTO

Laravel Modular [anotações]

目录

1. 模块配置

2. 模型、工厂和 DTO

药膏,tudo bem com você?

这是一个关于 Laravel 模块化设计的基础知识。在研究期间,Laravel 的目标配置必须允许我使用建筑设计的技巧。有关如何配置的信息,请参阅以下信息,然后将其描述为敏捷过程。

在介绍模块化的内容时,您可以了解有关设计实用程序的信息。 Como isso aqui é um subproduto dos meus estudos, tem muita coisa sobre or Laravel que acabei aprendendo durante o processo. Pode parecer óbvio para você,mas não para o “eu” do passado。

Já adianto:我的目标是在研究期间考虑相关的问题。 Para você, talvez pareçam “informações jogadas”, mas eu geralmente estudo apartir de palavras-chave ou topicos, usando-os como ponto departida para outras pesquisas (Google, YouTube e artigos).其实,这并不是一个假装的未来故事。

免责声明

请使用 IA 组织作为主题和目录的详细说明。在我的研究过程中,我们将提供一些要点,以帮助您组织工作。


目录

1. 模块配置

1.1. 自动装弹(PSR-4)

使用 Laravel 进行模块化,需要先了解新模块的情况composer.json。允许自动加载功能,并确保类可以进行模块化设置。

Se quiser saber mais: Link

1.2 服务提供商

O Service Provideré o coração de um módulo。 Cada 提供者主要提供基础 cadaServiceProvider和 possui dois métodos 原则:

  • register():Chamado primeiro,注册商服务和绑定。
  • boot():查看register()提供商的待办事项、服务和配置功能(可轮换和查看)。

Para registrar um novo provider, ele deve ser informado no arquivo config/app.php(ou configurado para ser descobertoautomaticamente)。

Laravel 的文档,包含有关主题的信息,推荐!

1.3. 模块化测试

使用模块化测试时,需要注册或注册模块phpunit.xml

2. 模型、工厂和 DTO

2.1. Conectando 工厂和模型

  • Por padrão,因为工厂 Procuram Pelas 没有命名空间模型App\Models
  • $modelPara conectar uma 工厂是一个 uma 模型,定义了一个没有归属于工厂的模型。
  • 关于 Laravel 的详细信息,请参阅 Laravel 工厂的变更情况。使用newFactory()模型估计方法:
use Modules\Product\Database\Factories\ProductFactory;

class Product extends Model
{
    protected static function newFactory()
    {
        return ProductFactory::new();
    }
}
Enter fullscreen mode Exit fullscreen mode

Saiba mais em:

2.2. 行动

没有 Laravel,您可以使用Actionsagrupar comportamentos 和 ações 面食,类似的usecase想法service

2.3.模型状态定义

没有银行可以定义 SEM 模型实例的状态。示例:

public const STATUS_PENDING = 'pending';

public static function startForUser(int $userId): self
{
    return self::make([
        'user_id' => $userId,
        'status' => self::STATUS_PENDING,
    ]);
}
Enter fullscreen mode Exit fullscreen mode

2.4. 数据传输对象(DTO)

Os DTOs são úteis para reduzir o acoplamento e melhorar a clareza。 Eles podem ser usados 段落:

  • 不同语言之间的通信。
  • 减少参数和方法的数量。
  • 代表 coleções de bados(收藏)。
  • 使用实例 DTO 的方法(fromEloquentModelfromEloquentCollection)作为 Eloquent 模型或集合的一部分。
class ProductDTO
{
    public function __construct(
        public readonly int $id,
        public readonly string $name,
        public readonly string $sku,
        public readonly float $price,
    ) {}

    public static function fromEloquentModel(Product $product): self
    {
        return new self(
            id: $product->id,
            name: $product->name,
            sku: $product->sku,
            price: $product->price,
        );
    }

    public static function fromEloquentCollection(Collection $products): Collection
    {
        return $products->map(fn (Product $product) => self::fromEloquentModel($product));
    }
}
Enter fullscreen mode Exit fullscreen mode

Saiba mais em:

3. IDE 助手

3.1. 安装和使用

O IDE Helper Generator for Laravel gera PHPDocs 可以将 IDE 作为模型的一部分。

安装:

composer require --dev barryvdh/laravel-ide-helper
Enter fullscreen mode Exit fullscreen mode

Gerando PHPDocs:

  • Para o caminho padrão das 模型:
php artisan ide-helper:models
Enter fullscreen mode Exit fullscreen mode
  • Para um caminho 个性化(例如:na 意大利面modules):
php artisan ide-helper:models --dir=modules
Enter fullscreen mode Exit fullscreen mode

3.2. Composer 脚本

可以使用脚本号composer.json

"scripts": {
    "ide": "php artisan ide-helper:models --dir=modules"
}
Enter fullscreen mode Exit fullscreen mode

Uso na CLI:

composer run ide
Enter fullscreen mode Exit fullscreen mode

4. 模块化视图

Para trabalhar com 查看模块,使用新注册者resources/views方法。boot()Service Provider

class OrderServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        $this->loadViewsFrom(__DIR__ . '/../../Ui/Views', 'order');
        Blade::anonymousComponentPath(__DIR__ . '/../../Ui/Views/components', 'order');
        Blade::componentNamespace('Modules\\Order\\Ui\\ViewComponents', 'order');
    }
}
Enter fullscreen mode Exit fullscreen mode

4.1. 诺迈斯的观点

使用loadViewsFrom()注册商的名称空间视图,进行模块间的冲突。

  • Exemplo: view('order::checkout') buscará a view em Modules/Order/Ui/Views/checkout.blade.php.

4.2. 字母组件

使用Blade::anonymousComponentPath()Para registrar uma Pasta de componentes Blade anônimos。

  • PHP 协会的其他类别, apenas arquivos .blade.php
  • 例如: <x-order::alert />渲染Modules/Order/Ui/Views/components/alert.blade.php

4.3. 类组件

使用Blade::componentNamespace()PHP 类组件的名称空间注册器。

  • 圣组件 criados com php artisan make:component
  • 例如: 渲染无命名空间<x-order::checkout-summary />的类组件CheckoutSummaryModules\Order\Ui\ViewComponents

Laravel 的基本观点:

5. 工具和插件

5.1. Laravel IDEA

  • PHPStorm 是 Laravel 的支持插件。
  • 在模块系统中,允许定义项目的模块化结构(例如:diretório modulescom 命名空间Modules)。
  • 可以使用 Laravel 的内部模块继续运行。

我不想在Laravel IDEA上使用 PHPStorm,建议使用它

5.2. 包 Laravel 模块

  • Laravel Modules一个流行的模块化项目。
  • Fornece uma estruturaorganizada para criar e gerenciar modulos。
  • O Laravel IDEA possui support nativo para este pacote。

6. 组织:Abordagens

6.1. 垂直切片

  • Organiza o código agrupando por funcionalidade(例如Order > Checkout:),e não por tipo de arquivo。
  • 所有相关事项均与我们的功能有关。
  • 方便地进行可视化和操作,以实现统一的功能。

Mais sobre esse topico em:

6.2. Agrupamento por Tipo(按类型分组)

  • Organiza o código por tipo de arquivo(例如:模型控制器)。
  • 可以将模型事件src等模块组合起来,然后再进行 Laravel 的操作。

7. Padrões de Design e Boas Práticas

7.1. Acoplamento Temporal 与 Eventos

  • 问题: 时间问题: 时间问题: 一些问题取决于执行过程中的外部因素,可能会导致严格的执行和执行上的困难。
  • 解决方案:使用事件:按照具体方法执行,按责任分开。 O Fluxo prime dispara um evento e outras parts do sistema podem “escutar” e reagir de forma Independente(例如:enviar um e-mail deconfirmação ou atualizar o estoque)。

8. 其他主题

8.1. 工厂序列

  • LaravelSequences允许在工厂实例中更改属性值。
  • É útil para criar bado de teste com pequenas variações.
use Illuminate\Database\Eloquent\Factories\Sequence;

User::factory()
    ->count(3)
    ->state(new Sequence(
        ['name' => 'Alice'],
        ['name' => 'Bob'],
        ['name' => 'Carol'],
    ))
    ->create();
Enter fullscreen mode Exit fullscreen mode

参考:Laravel:序列

文章来源:https://dev.to/clintonrocha98/laravel-modular-anotacoes-56ai