我有2个型号:
比尔: id,account_id,descripcion,monto_pagado,saldo
付款: id,bill_id,monto
每当有人向帐户插入新帐单或插入新付款时,我都会假装计算帐户余额。
实现这一目标的最佳位置是什么:
我知道我必须在我项目的其他地方打电话。所以我希望它成为一个全球性的功能。什么是最好的地方呢?
答案 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文档。