在这个问题中,我要求"最佳实践"对Laravel的建议。
我正在研究一个类似于airbnb的"我列出住宿的网站。
在网站的各个页面(后端和前端),我需要计算住宿的价格。通过将调节对象与搜索查询组合来计算价格。
例如。
- 住宿:费率=每晚50欧元
- 搜索查询:4晚
- >结果:总价= 200欧元
我应该把这些价格计算的逻辑放在哪里?
例如:
- 我应该为此创建一个PriceController吗?
- 我应该向AccommodationsController添加函数/方法来计算它,还是添加到Accommodation模型?
- 我应该为此创建一个ServiceProvider吗?
答案 0 :(得分:1)
没有明确的方法来解决这个问题,在我看来,这是拉拉维尔最伟大的事情。
也许在Calculations
(app/
)中创建一个名为app/Caclulations/Accommodation.php
的目录,并将其命名为?对于这个问题,这将是一个很好的面向对象的方法。
namespace App\Calculations;
class Accommodation
{
/**
* The rate per night.
*
* @var float
*/
protected $rate;
/**
* The amount of nights for the stay.
*
* @var int
*/
protected $nights = 1;
/**
* Constructor.
*
* @param float $rate
* @param int $nights
*/
public function __construct($rate = 50.00, $nights = 1)
{
$this->rate = $rate;
$this->nights = $nights;
}
/**
* Calculates the accommodation and returns the result.
*
* @return float
*/
public function calculate()
{
return $this->rate * $this->nights;
}
}
这样,如果计算发生变化,您可以修改计算类,从其他计算(例如基础计算)中扩展计算类,也可以在类中插入一些其他有用的东西,例如货币类型。
用法:
$total = (new Accommodation($rate, $nights))->calculate();
答案 1 :(得分:0)
实际上,你想要在多个控制器中使用这个逻辑。因此,在多个控制器中重复此逻辑毫无意义。
我会创建一个服务提供商。有了这个,您可以使用dependancy injection
在您需要的地方使用此逻辑。通过将此逻辑放在一个位置,您可以更轻松地进行维护。更轻松的生活。
答案 2 :(得分:0)
这取决于你想要得到什么。如果你认为这是一次性计算,即;你不必在这种方法之外使用这种计算,可以随意使用它。否则,如果您认为必须在其他控制器/类之外/在其他控制器/类中使用此计算逻辑,则可以将此文件作为方法编写,或者可以创建包含方法的帮助程序类。它取决于你。