Laravel全球功能

时间:2016-05-10 23:01:32

标签: laravel laravel-5

我有2个型号:

比尔: id,account_id,descripcion,monto_pagado,saldo

付款: id,bill_id,monto

每当有人向帐户插入新帐单或插入新付款时,我都会假装计算帐户余额。

实现这一目标的最佳位置是什么:

  • as service
  • 作为模型中的变异者
  • 作为控制器中的功能

我知道我必须在我项目的其他地方打电话。所以我希望它成为一个全球性的功能。什么是最好的地方呢?

2 个答案:

答案 0 :(得分:0)

一个可能的解决方案,因为你提到想要它是一个全局函数,就是使用Laravel的自动加载功能。

创建一个包含计算功能的文件。它可以放在任何地方,并包含其他功能,但为了简洁起见,我们将它放在这里:App/Http/customFunctions.php。在您的文件中,创建您的函数:

function pretendCalculation()
{
    return $something;
}

接下来,告诉Laravel将其添加到composer.json中的自动加载列表中进行自动加载:

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/Http/customFunctions.php" <-- Here is the new file
    ]

然后只需执行composer dump auto-load -o等,现在您可以在应用程序的任何位置访问该文件/文件中的所有功能。

答案 1 :(得分:0)

您可以在模型中使用事件。如果要在数据库中实际创建模型之前计算,请使用creating;如果要在创建模型之后进行计算,请使用created

在App \ Providers \ AppServiceProvider :: boot()方法中,定义两个模型的事件:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Bill::creating(function ($bill) {
            // Do something with $bill
        });
    }

    // etc
}

为避免重复代码,您可以使用特征并在两个类中使用它。例如,将其命名为PretendCalculationTrait并将其放入app/Traits(如果需要,请创建目录):

<?php

namespace App\Traits;

trait PretendCalculationTrait
{
    public function pretendCalculate()
    {
        // Do your stuff
    }
}

然后在你的模型中,使用这个特性:

class Bill extends Eloquent
{
    use App\Traits\PretendCalculationTrait;

    // etc.
}

最后,在AppServiceProvider中,调用特征中定义的方法:

public function boot()
{
    Bill::creating(function ($bill) {
        return $bill->pretendCalculate();
    });

    Payment::creating(function ($payment) {
        return $payment->pretendCalculate();
    });
}

有关详细信息,请参阅Laravel Model Events文档。