2015-11-13 150 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

這取決於你想要得到什麼。如果你認爲這是一次性計算,即;您不必在此方法之外使用此計算,可以隨它一起使用。否則,如果您認爲必須在其他控制器/類的外部/外部使用此計算邏輯,則可以將此文件編寫爲方法,或者可以創建一個保存方法的輔助類。隨你便。

相關問題