Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Logowanie, zwrot/wypozyczenie ksiazek OOP - mocno początkujący
mrpickles
post 14.10.2019, 18:03:39
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 14.10.2019
Skąd: Białystok

Ostrzeżenie: (0%)
-----


Cześć,
Zaczynam naukę OOP i w napisałem skrypt który umożliwia rejestracje/logowanie/zwrot/wypożyczenie książek.
Mam świadomość istnienia SOLID oraz PSR - czytałem o PSR 1 / 2 i staram się przestrzegać.
Nie znam MVC ani testów np. PHPUnit - to będą kolejne kroki w nauce.

Czy taki skrypt można określić obiektowym, czy jest to jakaś hybryda? Zanim pójdę dalej jw chciałbym nauczyć się dobrych nawyków i w prawidłowy sposób posługiwać się OOP.

Skrypt nie wszedł na forum, umieściłem na githubie

Link do GitHub

Moje dodatkowe pytania:

1. Tworzenie obiektu Database w konstruktorze innych klas, czy jest to prawidłowe?
2. Metoda checkCredentials klasy log - czy nie narusza zasady pojedynczej odpowiedzialności? Czy nie powinna np. wyszukiwać użytkownika,a następnie inna metoda powinna weryfikować dane?

Dzięki za wszystkie uwagi i poświęcony czas smile.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
athabus
post 15.10.2019, 21:03:22
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Niestety trochę błądzisz, ale moim zdaniem to bardzo dobra decyzja, że próbujesz coś napisać samodzielnie zamiast uczyć się frameworka. Frameworki niestety uczą złych nawyków jeśli nie umiesz w porządne OOP.

To od czego bym zaczął na Twoim miejscu to composer. Composer dzisiaj to jest standard w każdym projekcie i warto go użyć już teraz choćby po to aby mieć autoloader.

Druga rzecz to PSR - pisałeś, że czytałeś i starasz się stosować, ale w kodzie tego zupełnie nie widać... Polecam zainstalować php-cs-fixer i odpalić w projekcie, a potem zobaczyć sobie jakimś diffem co zostało zmienione.

Mamy PHP 7.3, a w twoim klasach tego nie widać - nie ma typowania parametrów funkcji, typów zwracanych itp.

Z takich pierdół unikaj jak ognia stosowania if... else, a jeszcze bardziej zagnieżdżania ifów bo to zło wcielone.
Takich rzeczy jak to nie da się czytać
Kod
public function checkCredentials($data){
        $this->connection->query("SELECT * FROM uzytkownicy WHERE nick=:nick");
        $this->connection->bind(":nick",$data['nick']);
        $this->connection->execute();
        if($this->connection->rowCount()>0){
            if(password_verify($data["password"],$this->connection->singleResult()->haslo)){
                $this->isLoged=true;
                return $this->isLoged;
            }else{
            
            $this->error="Incorect nick or password";
            }
            
        }else{
            $this->IsError=true;
            $this->error="Incorect nick or password";
        }
    }


Zobacz o ile czytelniejsza byłaby ta funkcja po refactorze (użyłem wyjątków, ale możesz tu wstawić swoją logikę ze zwracaniem false itd):
Kod
public function checkCredentials(array $data): bool
    {
        $this->connection->query("SELECT * FROM uzytkownicy WHERE nick=:nick");
        $this->connection->bind(":nick",$data['nick']);
        $this->connection->execute();

        if($this->connection->rowCount() == 0) {
           throw new \Exception('User not found');
        }

        if(!password_verify($data["password"], $this->connection->singleResult()->haslo)) {
            throw new \Exception('Incorect user or password');
        }

        $this->isLoged = true;
        return true;
    }


Wewnątrz konstruktora (i ogólnie klas) nie powinieneś używać new bo to jest ukrywanie zależności. W dobrym kodzie wszystkie zależności powinny być wstrzykiwane w konstruktorze. Ale to może być dla Ciebie trudne gdy bo nie ogarniasz jeszcze zapewne wzorców projektowych typu fabryki, czy Dependency Injection. Niemniej postaraj się gdzie dasz radę raczej tworzyć klasy bez używanie w ich kodzie new. Czyli przykład:
Kod
/**
     * Źle
     */
    public function __construct()
    {
        $this->connection = new Database();
    }

    /**
     * Dobrze
     */
    public function __construct(Database $connection)
    {
        $this->connection = $connection;
    }


W php do komentarzy funkcji stosujemy php doc block, a jeszcze lepiej typowanie inputu/output + doc block jako uzupełnienie (np. o rzucane wyjątki, typu elementów w tablicy itp).

Jeśli myślisz na poważnie o kodowaniu, to zacznij w 100% stosować angielski - czemu funkcje są po angielsku, a baza po polsku? Pokracznie to wygląda.



To chyba na początek tyle.

Jak to ogarniesz to na Twoim miejscu spróbowałbym przerobić jakiś tutorial MVC żeby zrozumieć jak wygląda architektura prostej aplikacji w PHP. Robiesz bardzo wiele błędów i masz ogólnie źle zorganizowany kod. Przerobienie dobrego tutoriala na pewno pomoże.

Ogólnie szału nie ma, ale każdy kiedyś zaczynał, a widać że czytasz i starasz się rozwijać, więc to dobrze wróży. Już samo używanie gita i githuba na Twoim poziomie to bardzo dobry znak.Trzymam kciuki.

Ten post edytował athabus 15.10.2019, 21:04:54
Go to the top of the page
+Quote Post

Posty w temacie
- mrpickles   [PHP] Logowanie, zwrot/wypozyczenie ksiazek OOP - mocno początkujący   14.10.2019, 18:03:39
- - viking   Najpierw zastosuj autoloader, potem wyrzuć wszystk...   14.10.2019, 18:38:18
- - ohm   klasa Log jest dość mocno myląca, brak namespace...   14.10.2019, 20:13:08
- - mrpickles   1. Dodałem autoloadera 2. Nie znam smarty ani inne...   15.10.2019, 20:06:49
- - athabus   Niestety trochę błądzisz, ale moim zdaniem to bard...   15.10.2019, 21:03:22
- - mrpickles   Tak wiem, błądzę muszę poukładać wiedze. 1. zrobi...   17.10.2019, 21:00:47
- - viking   Przykładowo ta nieszczęsna klasa database. W przyp...   18.10.2019, 07:24:15
- - mrpickles   Usunąłem vendor/autoload w klasach - pozostałość b...   18.10.2019, 09:39:59
- - athabus   Ogólnie po zmianach wygląda już znacznie lepiej. P...   18.10.2019, 10:02:48
- - viking   https://martinfowler.com/eaaCatalog/ Dlaczego głów...   18.10.2019, 10:03:49
- - nospor   Njapierw klasa dziedziczy po Database class Regist...   18.10.2019, 10:21:30
- - athabus   Jeszcze taka ogólna uwaga odnośnie dziedziczenia. ...   18.10.2019, 10:36:44
- - mrpickles   Ustosunkuje się tylko niektórych elementów, bo dos...   18.10.2019, 11:49:49
|- - nospor   Cytat(mrpickles @ 18.10.2019, 11:49:4...   18.10.2019, 12:15:38
- - athabus   To o czym piszesz to jest częsty błąd w tutorialac...   18.10.2019, 12:14:40
- - mrpickles   Zakręciłem się i pracowałem na klonie, a zrobiłem ...   18.10.2019, 13:12:23
- - nospor   Generalnie nie chodzi o odzielenie php od html a o...   18.10.2019, 13:33:05
- - mrpickles   Ok czyli MVC się kłania. Dzięki za wyjaśnienia, ...   18.10.2019, 13:37:07
- - phpion   Wiele już zostało powiedziane ale ja dodam od sieb...   3.11.2019, 18:59:27
- - mrpickles   Trochę mnie nie było, jednak musiałem przyswoić do...   19.11.2019, 19:34:39
- - nospor   Jest zdecydowanie lepiej. echo View::renderTempl...   20.11.2019, 10:53:34
- - athabus   No prosze a już myślałem, że się poddałeś ;-) Ko...   21.11.2019, 08:36:44
- - mrpickles   Dzięki za uwagi:) 1) Powalczę z gitem - zamiast n...   21.11.2019, 16:45:44
- - athabus   Tak w telegraficzny skrócie, to to co zaproponował...   21.11.2019, 17:19:04
- - viking   Możesz też zmienić podejście i poczytać o https://...   21.11.2019, 18:53:53
- - mrpickles   Utknąłem, nie mam pomysłu, przeglądałem dokumentac...   5.12.2019, 22:28:48
- - athabus   Najprościej chyba możesz to zrobić przechwytując w...   6.12.2019, 21:45:45
- - mrpickles   Zrobiłem tak, że kontroler zwraca Response, a w Ru...   8.12.2019, 20:51:37
- - nospor   Widze nadal kodu nie testujesz FrontController.ph...   7.01.2020, 16:34:45
- - mrpickles   Przez ostatni czas przerabiałem Laravela, teraz wr...   29.02.2020, 14:31:25
- - nospor   Zrozum, rzeczy konfiguracyjne nie moga lezej w GIT...   29.02.2020, 17:49:42
- - mrpickles   Dzięki teraz wiem o co chodzi. Tak używam laravela...   1.03.2020, 00:11:46


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 1.06.2024 - 08:31