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

CRUD - jeden serwis czy każda akcja oddzielnie?

VPS Starter Arubacloud
0 głosów
279 wizyt
pytanie zadane 31 marca 2019 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)
Witam,

teraz mam jeden serwis UserService w którym mam metody odpowiadające za edycje, dodanie, usuwanie i pobieranie użytkownika, i tutaj jest moje pytanie: powinienem stworzyć dla każdej akcji oddzielny serwis? np UserCreate, UserEdit itp. czy zostawić to w jednym serwisie?
komentarz 1 kwietnia 2019 przez Ehlert Ekspert (212,630 p.)

@Comandeer dlatego MVC odchodzi do lamusa smiley

komentarz 1 kwietnia 2019 przez niezalogowany

@Ehlert - ale dlaczego MVC do lamusa...

Nie każdy pisze aplikacje, gdzie musisz mieć tryliard kodu i logiki... W czym jest zły MVC? 

Nie chcę tu nikogo atakować, tylko chyba we wszyskich tych patternach, czy je stosować, czy nie, czy może inne... To zależy - przynajmniej tak mi się wydaje.

komentarz 1 kwietnia 2019 przez Ehlert Ekspert (212,630 p.)

@ViruS, spoko. Ja z kolei narobiłem się w syfiastych projektach gdzie nieliniowa logika była dosłownie upchana wszędzie, a każde miejsce wieńczyło 

$model->save();

Stąd też nienawiść do tego typu rozwiązań.

komentarz 1 kwietnia 2019 przez niezalogowany
No tak, należy też pamiętać, że nazwanie wzorca, że jest kiepski tylko dlatego, bo inni używają go źle...

No, ale rozumiem Cię, bo użeram się codziennie z... brakiem jakichkolwiek patternów :P
komentarz 1 kwietnia 2019 przez Ehlert Ekspert (212,630 p.)
Co do mojej niechęci do mvc... Może ona wynikać z tego iż wszystkie fw architektonicznie bazujące na tym wzorcu są przestarzałe... CI, Kohana, CodeIgniter, Zend, Symfony 1. O ile miałem okazję w nich pisać o tyle nie wyobrażam sobie implementacji w nich czegoś dużego.

1 odpowiedź

0 głosów
odpowiedź 1 kwietnia 2019 przez Ehlert Ekspert (212,630 p.)
IMO Twój serwis jest ok. Może przydałaby się bardziej intuicyjna nazwa i na pewno testy.
komentarz 1 kwietnia 2019 przez `Krzychuu Stary wyjadacz (13,940 p.)

kod jak na razie wygląda tak:

<?php

declare(strict_types=1);

namespace App\Service;

use App\Entity\User;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class UserService
{
    /** @var EntityManagerInterface  */
    private $entityManager;

    /** @var UserRepository */
    private $userRepository;

    /** @var UserPasswordEncoderInterface  */
    private $passwordEncoder;

    /** @var AccountService */
    private $accountService;

    /**
     * @param EntityManagerInterface $entityManager
     * @param UserRepository $userRepository
     * @param UserPasswordEncoderInterface $encoder
     * @param AccountService $accountService
     */
    public function __construct(
        EntityManagerInterface $entityManager,
        UserRepository $userRepository,
        UserPasswordEncoderInterface $encoder,
        AccountService $accountService
    ) {
        $this->entityManager = $entityManager;
        $this->userRepository = $userRepository;
        $this->passwordEncoder = $encoder;
        $this->accountService = $accountService;
    }

    /**
     * @param User $user
     * @return string
     */
    public function createUser(User $user): string
    {
        $account = $this->accountService->createAccount();

        $user->setAccount($account);
        $user->setPassword(
            $this->passwordEncoder->encodePassword($user, $user->getPlainPassword())
        );

        $this->entityManager->persist($account);
        $this->entityManager->persist($user);
        $this->entityManager->flush();

        return $user->getUsername();
    }

    /**
     * @param string $username
     * @return User|false
     *
     * TODO Add return type declaration
     */
    public function getUserByUsername(string $username)
    {
        $user = $this->userRepository->findOneBy([
            'username' => $username,
        ]);

        return $user instanceof User ? $user : false;
    }
}
<?php

declare(strict_types=1);

namespace App\Service;

use App\Entity\Accounts;
use App\Repository\AccountsRepository;
use Doctrine\ORM\EntityManagerInterface;

class AccountService
{
    /** @var EntityManagerInterface */
    private $entityManager;

    /** @var AccountsRepository */
    private $accountsRepository;

    /** @var UserService */
    private $userService;

    /**
     * @param EntityManagerInterface $entityManager
     * @param AccountsRepository $accountsRepository
     * @param UserService $userService
     */
    public function __construct(
        EntityManagerInterface $entityManager,
        AccountsRepository $accountsRepository,
        UserService $userService
    ) {
        $this->entityManager = $entityManager;
        $this->accountsRepository = $accountsRepository;
        $this->userService = $userService;
    }

    /**
     * @return Accounts
     */
    public function createAccount(): Accounts
    {
        $account = new Accounts();
        $account->setFirstName("-");

        return $account;
    }

    /**
     * @param Accounts $data
     * @param string $username
     *
     * @return Accounts|boolean
     *
     * TODO Add return type declaration
     */
    public function updateAccount(Accounts $data, string $username)
    {
        $user = $this->userService->getUserByUsername($username);

        if ($user) {
            $account = $this->accountsRepository->find($user->getAccount()->getId());
        } else {
            return false;
        }

        if (!$account instanceof Accounts) {
            return false;
        }

        $account->setFirstName($data->getFirstName());

        $this->entityManager->flush();

        return $account;
    }
}

tylko muszę go troche zrefaktoryzować bo wyskakuje błąd circular reference

 

Podobne pytania

0 głosów
1 odpowiedź 88 wizyt
pytanie zadane 30 września 2020 w PHP przez User007 Bywalec (2,400 p.)
0 głosów
3 odpowiedzi 524 wizyt
pytanie zadane 1 lutego 2019 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)
0 głosów
2 odpowiedzi 151 wizyt
pytanie zadane 3 września 2018 w PHP przez BetBet Użytkownik (550 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...