sebastiaanluca/laravel-auto-morph-map

此包已被放弃,不再维护。没有建议的替代包。

自动别称和映射 Eloquent 模型的多态类型。

7.0.1 2021-06-22 12:36 UTC

This package is auto-updated.

Last update: 2022-03-07 15:09:15 UTC


README

Latest stable release Software license Build status Total downloads Total stars

Read my blog View my other packages and projects Follow @sebastiaanluca on Twitter Share this package on Twitter

通过自动别称和映射您的 Eloquent 模型为简短、统一类名,将您的内部应用程序命名空间结构与数据库解耦。

默认情况下,Laravel 会使用完全限定的类名来存储相关模型的类型。例如,在上面的例子中,一个 Comment 可能属于一个 Post 或一个 Video,默认的 commentable_type 将分别是 App\PostApp\Video。但是,您可能希望将数据库与应用程序内部结构解耦。在这种情况下,您可能定义一个关系 "morph map",以指导 Eloquent 使用每个模型的自定义名称而不是类名。

有关更多信息,请参阅 Laravel 文档中的 自定义多态类型

Laravel auto morph map 通过扫描所有您的 Eloquent 模型,将它们自动别称为 统一的单个表名 并将其注册为多态类型来改进这一点。无需再进行数十次手动 Relation::morphMap() 调用来注册模型多态类型,也不需要在添加、更改或删除模型时维护那个令人烦恼的多态映射列表。

目录

要求

  • PHP 8 或更高版本
  • Laravel 8 或更高版本

如何安装

通过 Composer

composer require sebastiaanluca/laravel-auto-morph-map

如何使用

安装此包后,您就可以立即使用!该包将扫描所有您的模型并自动动态地注册它们的多态类型。

除了为您扫描和别称模型之外,此包不会更改任何原生 Laravel 功能。因此,请参阅 Laravel 文档了解如何使用 自定义多态类型

如果您想自定义一些行为,请继续阅读。

定义模型命名空间

Laravel auto morph map 使用您的 composer.json PSR-4 自动加载部分来知道要扫描哪些命名空间和路径。在任何新的 Laravel 项目中,默认的 App\\ 命名空间已经就位,因此对于大多数项目不需要额外的设置。如果您有其他已注册的命名空间,如本地模块或 (dev) 包,它们也将被扫描。

{
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "MyModule\\": "modules/MyModule/",
            "MyPackage\\": "MyPackage/src/"
        }
    }
}

此外,它还会过滤掉特质、抽象类、辅助文件和其他不可用项,仅绑定有效的 Eloquent 模型。

覆盖现有别名

如果您愿意,您仍然可以在服务提供者的 boot 方法中覆盖已别名的形态类型,就像您通常做的那样

use Illuminate\Database\Eloquent\Relations\Relation;

Relation::morphMap([
    'posts' => \App\Post::class,
    'videos' => \App\Video::class,
]);

这些将始终优先于已定义的。

在生产中缓存形态类型

为了缓存所有别名并加快您的应用程序在生产中的速度,请在部署脚本中添加缓存命令

php artisan morphmap:cache

这将扫描您当前的所有模型,并将静态缓存文件写入到 bootstrap/cache 目录。在随后的框架启动时,它会读取缓存文件而不是实时扫描和别命名。

注意,这样就会禁用运行时扫描,这意味着新模型将不会被识别,现有模型的变化也不会反映出来(在开发期间不太方便)。

要清除缓存文件,运行

php artisan morphmap:clear

配置

运行

php artisan vendor:publish

并选择

laravel-auto-morph-map (configuration)

以发布配置文件。

命名

确定模型形态类型基本值时使用的命名方案。默认为单数表名(由Laravel自动确定或由模型中的 $table 变量覆盖)。

您可以将此更改为使用单数表名、表名或类基本名。有关可能选项,请参阅 \SebastiaanLuca\AutoMorphMap\Constants\NamingSchemes

单数表名(默认)

Relation::morphMap([
    'collection_item' => 'App\CollectionItem',
]);

表名

Relation::morphMap([
    'collection_items' => 'App\CollectionItem',
]);

类基本名

Relation::morphMap([
    'CollectionItem' => 'App\CollectionItem',
]);

大小写

将您的模型名称(在通过命名方案转换后)转换为更一致的字符串。默认情况下,基于您的命名方案的模型名称被转换为 snake case

您可以将此更改为使用 snake、slug、camel、studly 或无大小写。有关可能选项,请参阅 \SebastiaanLuca\AutoMorphMap\Constants\CaseTypes

Snake case(默认)

Relation::morphMap([
    'collection_item' => 'App\CollectionItem',
]);

Slug case

Relation::morphMap([
    'collection-item' => 'App\CollectionItem',
]);

Camel case

Relation::morphMap([
    'collectionItem' => 'App\CollectionItem',
]);

Studly case

Relation::morphMap([
    'CollectionItem' => 'App\CollectionItem',
]);

无(由您的命名方案和Laravel的类到表转换方法确定)

Relation::morphMap([
    'collection_item' => 'App\CollectionItem',
]);

许可

此包在MIT许可(MIT)下运行。有关更多信息,请参阅 LICENSE

变更日志

请参阅 CHANGELOG 了解最近发生了什么变化。

测试

composer install
composer test

贡献

请参阅 CONTRIBUTINGCODE_OF_CONDUCT 了解详细信息。

安全

如果您发现任何安全相关的问题,请通过电子邮件 hello@sebastiaanluca.com 而不是使用问题跟踪器。

鸣谢

关于

我叫Sebastiaan,是一名专注于构建定制Laravel应用的自由职业后端开发者。查看我的作品集获取更多信息,查看我的博客获取最新技巧和窍门,以及我的其他软件包,以启动您下一个项目。

您有一个需要指导的项目吗?请发送电子邮件至hello@sebastiaanluca.com