2015-11-13 4 views
0

В этом вопросе я прошу совета «лучшей практики» для Laravel.
Я работаю над сайтом «airbnb-like», где я перечисляю номера. На разных страницах сайта (backend и frontend) мне нужно рассчитать цену за проживание. Цена рассчитывается путем объединения объекта размещения с поисковым запросом.

Например.
-Размещения: ставка = 50 евро за ночь
-Поиска запроса: 4 ночей
-> результата: общая цена = 200 евро

Где я должен поставить логику, что делает эти вычисления цен?
Например:
-Можно ли создать для этого PriceController?
-Можно ли добавить функции/методы в HousingController, которые вычисляют это, или к модели размещения?
-Можно ли создать ServiceProvider для этого?Где я должен поместить логику расчета цены в Laravel?

ответ

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

Привет Стив, это кажется хорошим решением. Я создал класс для расчета цены, который принимает экземпляр проживания и экземпляр поискового запроса. Я привязываю этот класс к приложению и вызываю его так: '' '$ bookData = App :: make ('PriceCalc', [$ accommodation, $ searchData])' ''. Тогда все методы доступны мне так: '' '$ bookData-> totalPrice()' '' и т. Д. Вам это кажется хорошо? – SiteHopper

+0

Привет @SiteHopper, это кажется прекрасным, но на мой взгляд, нет необходимости связывать класс с самим приложением и вызывать метод 'App :: make()' в классе вычислений. Если вам известен класс и аргументы, необходимые для его построения, вы можете также создать экземпляр самостоятельно, используя '$ bookData = new PriceCalc ($ accomodation, $ searchData);'. Но в итоге все зависит от вас!:) –

+0

Спасибо за подсказку. Я немного смущен об использовании привязки класса к приложению. Когда это будет уместно? – SiteHopper

0

Реально говоря, вы хотите эту логику в нескольких контроллерах. В связи с этим нет смысла повторять эту логику в нескольких контроллерах.

Я бы создал поставщика услуг. С этим вы можете использовать dependancy injection, чтобы использовать эту логику там, где вам нужно. Имея эту логику в одном месте, вы упрощаете обслуживание &.

0

Это зависит от того, что вы пытаетесь получить. Если вы считаете, что это разовый расчет, т. Е. вам не нужно использовать этот расчет вне этого метода, нормально с ним идти. В противном случае, если вы считаете, что вам придется использовать эту логику вычислений вне/в других контроллерах/классах, вы можете записать этот файл как метод или создать класс-помощник, содержащий ваш метод. Тебе решать.

Смежные вопросы