PHP Laravel: лучший способ, чем эти операторы if - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно назначить комиссионные вновь созданной цене.Комиссионные могут быть изменены для клиентов, типов и цен.поэтому, если есть комиссия типа, она должна сначала получить ее, откат к клиентам, откат к умолчанию.

мой код работает, но он выглядит слишком "if-y".может быть, есть лучший подход к этому?

  private function addDefaultOnlineCommission(Price $price)
   {
       $defaultCommission = (object)Commission::DEFAULT_COMMISSIONS;

       $typeCommission = $price->type->commissions()
           ->where('is_online', '=', true)->first();

       $clientCommission = $price->type->client->commissions()
           ->where('is_online', '=', true)->first();


       if (!$clientCommission && !$typeCommission) {
           $commission = $defaultCommission;
       }

       if ($clientCommission && !$typeCommission) {
           $commission = $clientCommission;
       }

       if ($typeCommission) {
           $commission = $typeCommission;
       }

       $price->commissions()->create([
           'commission_type'   => $commission->commission_type,
           'commission_value'  => $commission->commission_value,
           'min_value'         => $commission->min_value,
           'is_online'         => true,
           'valid_from'        => Carbon::now()->format('Y-m-d H:i:s'),
       ]);
   }

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Чисто самоуверенный, но я бы обработал его с помощью операторов объединения нулей:

$commission = $typeCommission ?? $clientCommission ?? $defaultCommission;

Это будет использовать первое ненулевое значение.Таким образом, он устанавливает приоритет слева направо.

0 голосов
/ 10 декабря 2018

Я думаю, что функции выглядят как "if-y", потому что ваши операторы сложнее, чем они должны быть.Также вы всегда загружаете все свои запасные варианты, что не всегда необходимо.Я бы реорганизовал функцию для загрузки следующего уровня только при необходимости.Это может выглядеть примерно так:

private function addDefaultOnlineCommission ( Price $price ) {

    // load the type commission
    $commission = $price->type->commissions()->where( 'is_online', '=', true )->first();

    // if there is no type commission, check client commission
    if( empty($commission) ){
        $commission = $price->type->client->commissions()->where( 'is_online', '=', true )->first();
    }

    // if there is no client commission either, fall back to the default
    if( empty($commission) ){
        $commission = (object)Commission::DEFAULT_COMMISSIONS;
    }

    $price->commissions()->create( [
        'commission_type'  => $commission->commission_type,
        'commission_value' => $commission->commission_value,
        'min_value'        => $commission->min_value,
        'is_online'        => true,
        'valid_from'       => Carbon::now()->format( 'Y-m-d H:i:s' ),
    ] );

}

Это не только уменьшает длину вашей функции, но и делает ее более читаемой imho.Кроме того, вы избегаете ненужных запросов.

Примечание. Вы можете заменить empty () на is_null (), поскольку first () возвращает пустое значение для пустых результатов.

0 голосов
/ 10 декабря 2018

Как насчет этого?

   if (!$clientCommission && !$typeCommission) {
       $commission = $defaultCommission;
   } else if ($clientCommission && !$typeCommission) {
       $commission = $clientCommission;
   } else {
       $commission = $typeCommission;
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...