Полезно ли добавлять пользовательский метод в класс модели Laravel для вставки записи в другую таблицу? - PullRequest
2 голосов
/ 31 октября 2019

Я следую учебному пособию по созданию реферальной системы в Laravel. В руководстве не было показано, как реализовать метод addCredit () класса пользовательской модели. Я немного запутался. Предполагая, что у меня есть другая таблица для хранения записей кредитов, например:

 user_credits
 ------------ 
 user_id
 credits 

Является ли хорошей практикой писать код в методе addCredits модели пользователя для обновления таблицы user_credits? Что будет лучшим в этом случае?

class User extends Authenticatable
{
    /**
     *  Add bonus to the user
     */
    public function addCredits($credit) {
        //
    }
} 

Класс слушателя для обработки добавления бонуса для обоих пользователей.

namespace App\Listeners;

use App\Events\UserReferred;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class RewardUser
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  UserReferred $event
     * @return void
     */
    public function handle(UserReferred $event)
    {
        $referral = \App\ReferralLink::find($event->referralId);
        if (!is_null($referral)) {
            \App\ReferralRelationship::create(['referral_link_id' => $referral->id, 'user_id' => $event->user->id]);

            if ($referral->program->name === 'Sign-up Bonus') {
                // User who was sharing link
                $provider = $referral->user;
                // add credits to provider
                $provider->addCredits(15);
                // User who used the link
                $user = $event->user;
                $user->addCredits(20);
            }
        }
    }
}

1 Ответ

0 голосов
/ 31 октября 2019

Я не совсем уверен, это хорошая практика или нет, но я предпочитаю абстрагировать такие вещи в автономный сервис.

В вашем случае это будет что-то вроде этого:

CreditService

namespace App\Services;

use App\User;

class CreditService
{
    private $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function addCredits($credits)
    {
        $this->user->credits += $credits;
        $this->user->save();
    }
}

Затем в контроллер / слушатель вы можете работать с этим сервисом

use App\Services\CreditService;

...

public function handle(UserReferred $event)
{
    $referral = \App\ReferralLink::find($event->referralId);
    if ( !is_null($referral) ) {
        \App\ReferralRelationship::create([
            'referral_link_id' => $referral->id, 
            'user_id' => $event->user->id,
        ]);

        if ( $referral->program->name === 'Sign-up Bonus' ) {
            (new CreditService($referral->user))->addCredits(15);
            (new CreditService($event->user))->addCredits(20);
        }
    }
}

Способ, которым вы делаете, а затем используетесервис может быть другим. Итак, если вы не хотите работать через конструкторы, вы можете написать статический класс и напрямую передать User в метод.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...