elegantly/laravel-money 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

elegantly/laravel-money

Composer 安装命令:

composer require elegantly/laravel-money

包简介

Use Brick/Money in your Laravel app

README 文档

README

Latest Version on Packagist Total Downloads Tests Laravel Pint PHPStan

Table of Contents

Introduction

This package provides seamless, expressive integration of Brick/Money with Laravel. It enables safe, precise handling of monetary values in your application—using value objects, smart casting, robust parsing, and powerful validation tools.

Features

  • MoneyCast – Automatically cast Eloquent attributes to Brick\Money\Money.
  • MoneyParser – Convert strings, integers, or floats into Money instances safely.
  • ValidMoney Rule – Validate monetary input with min/max boundaries, type safety, and nullability.

Installation

Install via Composer:

composer require elegantly/laravel-money

Configuration

Publish the configuration file if you need to customize defaults:

php artisan vendor:publish --tag="money-config"

Default config (config/money.php):

return [
    'default_currency' => 'USD',
];

Storing Money in the Database

For maximum precision, store money using:

  • a bigInteger column for the amount (in the smallest currency unit)
  • a string column for the ISO currency code

This avoids floating-point precision issues and ensures accurate calculations.

Example migration:

Schema::create('invoices', function (Blueprint $table) {
    $table->id();
    $table->bigInteger('amount');   // e.g., 1000 = $10.00
    $table->string('currency', 3);  // ISO 4217 code
    $table->timestamps();
});

Usage

Casting with a Currency Column (Recommended)

If your model stores both amount and currency, reference the currency column in the cast:

use Elegantly\Money\MoneyCast;
use Brick\Money\Money;

/**
 * @property Money $amount
 * @property string $currency
 */
class Invoice extends Model
{

    protected function casts(): array
    {
        return [
            'amount' => MoneyCast::of('currency'),
        ];
    }
}

Casting with a Fixed Currency

If the currency is known and constant, define it directly:

use Elegantly\Money\MoneyCast;
use Brick\Money\Money;

/**
 * @property Money $amount
 * @property Money $cost
 */
class Invoice extends Model
{
    protected function casts(): array
    {
        return [
            'cost'  => MoneyCast::of('EUR'),
            'price' => MoneyCast::of('USD'),
        ];
    }
}

Parsing Values

MoneyParser converts common numeric and string formats into Money instances:

use Elegantly\Money\MoneyParser;

MoneyParser::parse(null, 'EUR');     // null
MoneyParser::parse(110, 'EUR');      // 110.00 €
MoneyParser::parse(100.10, 'EUR');   // 100.10 €
MoneyParser::parse('', 'EUR');       // null
MoneyParser::parse('1', 'EUR');      // 1.00 €
MoneyParser::parse('100.10', 'EUR'); // 100.10 €

The parser handles nullability, empty strings, integers, floats, and decimal string formats gracefully.

Validation Rule

Using ValidMoney in Livewire

namespace App\Livewire;

use Elegantly\Money\Rules\ValidMoney;
use Livewire\Component;

class CustomComponent extends Component
{
    #[Validate([
        new ValidMoney(nullable: false, min: 0, max: 100),
    ])]
    public ?int $price = null;
}

Using ValidMoney in Form Requests

namespace App\Http\Requests;

use Elegantly\Money\Rules\ValidMoney;
use Illuminate\Foundation\Http\FormRequest;

class CustomFormRequest extends FormRequest
{
    public function rules()
    {
        return [
            'price' => [
                new ValidMoney(
                    nullable: false,
                    min: 0,
                    max: 100
                ),
            ],
        ];
    }
}

Testing

Run the test suite:

composer test

Changelog

See the CHANGELOG for a full history of updates.

Contributing

Contributions are welcome! Review the CONTRIBUTING file for details.

Security

If you discover a security vulnerability, please refer to the security policy.

Credits

License

This package is open-source software released under the MIT License. See LICENSE.md for details.

elegantly/laravel-money 适用场景与选型建议

elegantly/laravel-money 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 72k 次下载、GitHub Stars 达 20, 最近一次更新时间为 2024 年 08 月 27 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「money」 「laravel」 「laravel-money」 「Elegantly」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 elegantly/laravel-money 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 elegantly/laravel-money 我们能提供哪些服务?
定制开发 / 二次开发

基于 elegantly/laravel-money 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 72k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 20
  • 点击次数: 30
  • 依赖项目数: 4
  • 推荐数: 0

GitHub 信息

  • Stars: 20
  • Watchers: 1
  • Forks: 3
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2024-08-27