• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

laravel, dobra praktyka

VPS Starter Arubacloud
0 głosów
223 wizyt
pytanie zadane 26 sierpnia 2019 w PHP przez mi-20 Stary wyjadacz (13,190 p.)

Witam, chciałbym zapytać jak przenieść kod z kontrolera do modelu. Otóż mam dość rozbudowaną funkcję (przykładowo rejestracji) w kontrolerze. Wiem, że tak rozbudowany kod nie powinien być w kontrolerze i chciałbym go przenieść do modelu jednak nie za bardzo wiem jak to zrobić

public function register(RegisterRequest $r)
    {
        DB::transaction(function () use ($r) {
            $u = User::create([
                'email' => $r->email,
                'password' => Hash::make($r->password)
            ]);
            $a = new Avatar();
            $a->addAvatar($r->sex, $u->id);
            Specific::create([
                'user_id' => $u->id,
                'name' => $r->name,
                'birthday' => $r->birthday,
                'sex' => $r->sex,
                'type_account' => $r->type_account
            ]);
            Contact::create([
                'user_id' => $u->id,
                'email' => $u->email
            ]);
            if ($r->type_account != 1){
                Company::create([
                    'user_id' => $u->id,
                    'name' => $r->name_company,
                    'nip' => $r->nip_company,
                    'country' => $r->country_company,
                    'address' => $r->address_company,
                    'post_code' => $r->post_code_company,
                    'city' => $r->city_company
                ]);
            }
        });
    }

próbowałem w taki sposób

$user = new User();
        $user->register($r);

i w User zrobić funkcję rejestracji jednak przekazanie danych w taki sposób nie działa. 

Prosiłbym o podpowiedź jak to powinno wyglądać

komentarz 27 sierpnia 2019 przez mi-20 Stary wyjadacz (13,190 p.)
Okej, teraz już wiem że powinienem to przenieść do osobnych klas jak jednak do tych klas przekazać dane?
komentarz 27 sierpnia 2019 przez Arkadiusz Waluk Ekspert (289,150 p.)
Nie wiem jakie dokładnie dane, ale generalnie najczęściej i najprościej przez argumenty do metod w tych klasach.
komentarz 27 sierpnia 2019 przez mi-20 Stary wyjadacz (13,190 p.)
chodzi mi o dane otrzymywane z formularzy
komentarz 27 sierpnia 2019 przez Arkadiusz Waluk Ekspert (289,150 p.)
To tak jak mówiłem, pewnie z metody kontrolera wywołujesz metodę tej klasy, więc możesz do niej w argumentach przesłać co potrzeba.
komentarz 1 września 2019 przez mi-20 Stary wyjadacz (13,190 p.)
Czy takie rozwiązanie jest dobre?

https://github.com/michallosak/classifieds
komentarz 1 września 2019 przez Arkadiusz Waluk Ekspert (289,150 p.)
Prawdę mówiąc nie widzę tu żadnego specjalnego rozwiązania, logika wszystkich akcji jest w kontrolerach, czy czegoś nie widzę?
komentarz 1 września 2019 przez mi-20 Stary wyjadacz (13,190 p.)
teraz, zła gałąź była ustawiona jako domyślna
komentarz 1 września 2019 przez Arkadiusz Waluk Ekspert (289,150 p.)

Coś w tym kierunku. Klasy można jednak wstrzykiwać automatycznie do argumentu kontrolera, nie trzeba tego robić ręcznie: https://laravel.com/docs/5.8/container#automatic-injection

Poza tym unikałbym raczej w tych klasach zwracania response, jak tu: https://github.com/michallosak/classifieds/blob/master/app/Support/Auth/Login.php#L16 - lepiej wg mnie wyjść z założenia, że response zwraca zawsze kontroler. Przekazywanie całego obiektu requesta do takich klas może z kolei być problematyczne (jak będziesz chciał ich użyć z innego miejsca gdzie nie będzie requesta), a nazywanie zmiennej $r (czy inne jednoliterowe nazwy) i nieokreślenie przyjmowanego typu to już w ogóle zaciemnia całość.

1 odpowiedź

0 głosów
odpowiedź 26 sierpnia 2019 przez olekjs Gaduła (4,590 p.)

Czemu chcesz przenieść tę metodę do modelu? Logika tworzenia nowego konta powinna być właśnie w kontrolerze. Jeśli chcesz ogarnąć tę metodę żeby nie była taka rozbudowana, możesz rozbić ją na oddzielne metody.

public function register(RegisterRequest $request)
    {
        DB::transaction(function () use ($request) {
            $user = $this->createUserWithModules($request);

            if ($request->type_account != 1) {
                Company::create(
                    array_merge(
                        ['user_id' => $user->id],
                        $request->only(['name_company', 'nip_company', 'country_company', 'address_company', 'post_code_company', 'city_company'])
                    )
                );
            }
        });
    }

    protected function createUserWithModules($request)
    {
        $user = User::create([
            'email'    => $request->email,
            'password' => Hash::make($request->password),
        ]);

        Contact::create([
            'user_id' => $user->id,
            'email'   => $user->email,
        ]);

        Specific::create(
            array_merge(
                ['user_id' => $user->id],
                $request->only(['name', 'birthday', 'sex', 'type_account'])
            )
        );

        Avatar::create([
            'sex'     => $request->sex,
            'user_id' => $user->id,
        ]);

        return $user;
    }

 

komentarz 26 sierpnia 2019 przez olekjs Gaduła (4,590 p.)
Zapomniałem dodać, że jeśli naprawdę chcesz przenieść tę logikę gdzieś indziej, to możesz utworzyć oddzielną klasę na to. Na przykład w App/Support. Dodatkowo mógłbyś porobić relacje tam gdzie masz user_id, wtedy będzie bardziej czytelny kod.
2
komentarz 26 sierpnia 2019 przez Arkadiusz Waluk Ekspert (289,150 p.)
Na pewno nie powinna być w kontrolerze, unika się umieszczania tam wszelkiej logiki. Zgodzę się jednak, że nie powinna być w modelu Eloquenta. To skojarzenie pewnie z MVC, gdzie coś nazywane "modelem" ma całą logikę, ale tutaj to po prostu nie pasuje. Najprościej wydzielić logikę do osobnych klas, chociażby czegoś w rodzaju serwisów.

Podobne pytania

+1 głos
1 odpowiedź 471 wizyt
pytanie zadane 4 listopada 2021 w PHP przez roberto23 Początkujący (270 p.)
0 głosów
2 odpowiedzi 494 wizyt
pytanie zadane 7 marca 2017 w PHP przez Sławek Obywatel (1,270 p.)
+3 głosów
1 odpowiedź 1,475 wizyt

93,015 zapytań

141,978 odpowiedzi

321,272 komentarzy

62,358 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...