2015-11-13 60 views
0

在这个问题中,我要求为Laravel提供“最佳实践”建议。
我正在“airbnb-like”网站上列出住宿。 在网站的各种页面(后端和前端)我需要计算住宿的价格。价格是通过将住宿对象与搜索查询结合来计算的。

例如。
-accommodation:4晚
- >结果:每晚
- 搜索查询率=50欧元总价=200欧元

我应该在哪里放,使这些价格计算逻辑?
例如:
- 我应该为此创建一个PricesController吗?
- 我应该添加功能/方法到住宿控制器计算,或住宿模型?
- 我应该为此创建一个ServiceProvider吗?我应该在Laravel中把价格计算逻辑放在哪里?

回答

1

没有确定的方法来解决这个问题,在我看来这是关于laravel的最伟大的事情。

也许在app/app/Caclulations/Accommodation.php)中创建一个名为Calculations的目录,并命名空间为?这将是一个很好的面向对象的方法来解决这个问题。

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(); 
+0

史蒂夫嗨,这似乎是一个很好的解决方案。我已经创建了一个价格计算类,它接受住宿实例和搜索查询实例。我将这个类绑定到应用程序,并将其命名为''''bookData = App :: make('PriceCalc',[$ accommodation,$ searchData])''' 然后所有的方法都可以用这个 '''bookData-> totalPrice()'''等等。对你来说这看起来不错吗? – SiteHopper

+0

Hi @SiteHopper,看起来很好,但在我看来,并不需要将类绑定到应用程序本身,并在计算类上调用App :: make()方法。如果您知道需要构建它的类和参数,那么您可以使用'$ bookData = new PriceCalc($ accomodation,$ searchData);'自己创建实例。但最终,这完全取决于你!:) –

+0

感谢您的提示。我对将类绑定到应用程序的用法有点困惑。这什么时候适合? – SiteHopper

0

实际上你想要在多个控制器中使用这个逻辑。由于这个原因,在多个控制器中重复这个逻辑没有意义。

我会创建一个服务提供者。有了这个,你可以使用dependancy injection来根据需要使用这个逻辑。通过将这一逻辑放在一个地方,您可以更轻松地维护生活。

0

这取决于你想要得到什么。如果你认为这是一次性计算,即;您不必在此方法之外使用此计算,可以随它一起使用。否则,如果您认为必须在其他控制器/类的外部/外部使用此计算逻辑,则可以将此文件编写为方法,或者可以创建一个保存方法的辅助类。随你便。

相关问题