namchung / laravel-auto-morph-map
自动别名和映射 Eloquent 模型的多态类型。
Requires
- php: ^7.3
- laravel/framework: ^6.0|^7.0
Requires (Dev)
- kint-php/kint: ^3.3
- mockery/mockery: ^1.3
- orchestra/testbench: ^4.0|^5.1
- phpunit/phpunit: ^8.5
This package is not auto-updated.
Last update: 2024-09-24 20:07:47 UTC
README
通过自动将 Eloquent 模型映射为简短、统一的类名,从而将您的内部应用程序命名空间结构从数据库中解耦。
默认情况下,Laravel 将使用完全限定的类名来存储相关模型类型。例如,在上述示例中,一个
Comment
可能属于一个Post
或一个Video
,默认的commentable_type
将分别是App\Post
或App\Video
。但是,您可能希望将数据库与应用程序的内部结构解耦。在这种情况下,您可以定义一个关系“多态映射”,以指示 Eloquent 使用每个模型的自定义名称而不是类名。
有关更多信息,请参阅 Laravel 文档中的自定义多态类型。
Laravel auto morph map 通过扫描所有 Eloquent 模型,自动将它们别名为 统一的单表名称,并将它们注册为多态类型来改进这一点。无需再手动调用 Relation::morphMap()
来注册模型多态类型,也无需在添加、更改或删除模型时维护那个讨厌的多态映射列表。
目录
需求
- PHP 7.3 或更高版本
- Laravel 6.0 或更高版本
如何安装
通过 Composer
composer require sebastiaanluca/laravel-auto-morph-map
如何使用
安装此包后,您即可立即开始使用!该包将扫描所有您的模型,并在运行时自动注册它们的多态类型。
除了为您扫描和别名字符模型外,此包不会更改 Laravel 的任何原生功能。因此,请参阅 Laravel 文档了解如何使用 自定义多态类型。
如果您想自定义一些行为,请继续阅读。
定义模型命名空间
Laravel auto morph map 使用您的 composer.json
PSR-4 自动加载部分来了解要扫描的命名空间和路径。在任何新的 Laravel 项目中,默认的 App\\
命名空间已经就位,因此对于大多数项目无需额外的设置。如果您已注册了其他命名空间,例如本地模块或(开发)包,它们也会被扫描。
{ "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', ]);
大小写
将您的模型名称(在经过命名方案转换后)转换为更统一的字符串。默认情况下,基于您的命名方案的模型名称会被转换为 下划线命名法。
您可以将其更改为使用下划线、短横线、驼峰、Pascal 或不使用命名。有关可能的选项,请参阅 \SebastiaanLuca\AutoMorphMap\Constants\CaseTypes
。
下划线命名法(默认)
Relation::morphMap([ 'collection_item' => 'App\CollectionItem', ]);
短横线命名法
Relation::morphMap([ 'collection-item' => 'App\CollectionItem', ]);
驼峰命名法
Relation::morphMap([ 'collectionItem' => 'App\CollectionItem', ]);
Pascal 命名法
Relation::morphMap([ 'CollectionItem' => 'App\CollectionItem', ]);
无(由您的命名方案和 Laravel 的类到表转换方法确定)
Relation::morphMap([ 'collection_item' => 'App\CollectionItem', ]);
许可
此软件包在 MIT 许可证(MIT)下运行。有关更多信息,请参阅 LICENSE。
变更日志
有关最近更改的更多信息,请参阅 CHANGELOG。
测试
composer install
composer test
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CODE OF CONDUCT。
安全
如果您发现任何安全相关的问题,请通过电子邮件 hello@sebastiaanluca.com 反馈,而不是使用问题跟踪器。
鸣谢
关于
我的名字是 Sebastiaan,我是一个专注于构建定制 Laravel 应用的自由职业后端开发者。查看我的 作品集 了解更多信息,查看我的 博客 获取最新的技巧和窍门,以及我的其他 软件包 来启动您的下一个项目。
您的项目需要一些指导吗?请通过电子邮件 hello@sebastiaanluca.com 联系我!