Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 578 Pomógł: 6 Dołączył: 21.07.2008 Ostrzeżenie: (0%)
|
Witajcie,
miałem chwilę i usiadłem do autorskiego frameworka opartego na wzorcu MVC. Chciałbym go dopracować, utworzyć wersje stabilną. Kod frameworka jest dostępny pod adresem: https://github.com/artimman/dbmframework Zakończyłem pierwszy test aplikacji na serwerze zdalnym - powodzeniem. Wydaje się, że już jest całkiem Ok i ciekawe, czy ktoś się ze mną zgodzi? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
ok, to na plus:
+ znajomosc jako tako klas + uzywanie typowania w wiekszosci miejsc. + prawie uzywanie najnowszej wersji php (IMG:style_emoticons/default/wink.gif) a teraz troche krytki: w ogole na poczatek to zaprzyjaznij sie z takmi narzedziami jak : - php-cs-fixer - phpstan - inne do statycznej analizy kodu One wylapia ci na dzien dobry naprawde duzo bledow I generalnie mowie tutaj o bledach ktore nie sa moze jakos krytyczne, ale w dluzszej perspektywie beda uciazliwe do poprawnej pracy z twoim kodem. NIe wiem jak planujesz docelowo dostarczac swoj FW, ale na chwile obecna widze wrzuciles go fo VENDOR a ten katalog jest zastrzezony dla COMPOSER. wywal go wiec stamtad i wsadz nie wiem, np do LIBS. No i jesli twoj kod uzywa np phpmailer, ktory jest zapisany w composer.json to nie zapisuj go w GIT. Katalog VENDOR generalnie w GIT ma sie nie znalezc w ogole. po to jest composer plik config.php rowniez powinien nazywac sie np config.php.dist i dopiero ludzie kopiuja go sobie jako config.php lokalnie. Dlaczego? bo z kazdym updatem z twojego gita, ludzie straca swoje zmiany gdy to zostanie jak teraz declare(strict_types=1); ma byc w kazdym pliku php a nie w co drugim Potworki w stylu IF IF IF IF IF az oczy bola (IMG:style_emoticons/default/wink.gif) NIe bede omawial wszystkich bo w pyte tego masz, ale przyklad jak to sie poprawia Jesli masz kod IF (costam) { //blabla return 'cos tam' } return null; To zeby uniknac zagniezdzenia duzego to sie robi poprostu negacje na pocatku, wali nullem na poczatku a reszta duzego kodu leci juz bez zagniezdzenia czyli: IF (!costam) { return null; } //blabla return 'cos tam' Jak widzisz w zagniezdzeniu jest tylko return null a nie milion linijek public function __construct() { try { $this->connect = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_DATABASE, DB_USER, DB_PASSWORD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); $this->connect->exec("SET NAMES utf8"); return $this->connect; } catch (PDOException $exception) { throw new DbmException($exception->getMessage(), $exception->getCode()); } } No przeciez konstruktow nigdy nic nie zwraca wiec po grzyba tam return? konstruktor sam w sobie jest "returnem" (IMG:style_emoticons/default/wink.gif) public function querySql(string $sql, ?string $fetch = null): PDOStatement { if ($fetch == 'assoc') { $stmt = $this->connect->query($sql, PDO::FETCH_ASSOC); } else { $stmt = $this->connect->query($sql); } if (!$stmt) { throw new DbmException($this->connect->errorInfo()[2], $this->connect->errorInfo()[1]); } else { return $stmt; } } po co tu ten fetch jest raz ze stringiem a na dodatek nullem? skoro on odpowiada tylko za dwie mozliwosci, to zrob z niego boola i juz. Dodatkowo ten drugi ELSE na dole jest totalnei zbedny. : public function querySql(string $sql, bool $fetch = false): PDOStatement { if ($fetch) { $stmt = $this->connect->query($sql, PDO::FETCH_ASSOC); } else { $stmt = $this->connect->query($sql); } if (!$stmt) { throw new DbmException($this->connect->errorInfo()[2], $this->connect->errorInfo()[1]); } return $stmt; } Analogicznie cala masa innych funkcji tam public function requestData(string $fieldName) { if ($_SERVER['REQUEST_METHOD'] == "POST" || $_SERVER['REQUEST_METHOD'] == 'post') { if (array_key_exists($fieldName, $_POST)) { return trim($_POST[$fieldName]); } } elseif ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'get') { if (array_key_exists($fieldName, $_GET)) { return trim($_GET[$fieldName]); } } } To ze ktos wyslal dane POSTem, nie znaczy ze dane nie znajduja sie tez w GET. wlasnie ta funkcja zlikwidowales polowe funkcjonalnosci dla ludzia. public function setDataToDB($value) { $value = strip_tags($value); $value = htmlspecialchars($value); return $value; } A co ty mi tutaj kasujesz tagi z pola co chce wlozyc do bazy? Jak bede chcial skasowac to sam sobie skasuje. poza tym uzywasz bindowania wiec po co htmlspecialchars? To sie uzywa podczas wyswietlania a nie przed wkladaniem do bazy. Ta cala funkcja jest totalnie zbedna public function userPermissions(int $user): string { $database = new DbmDatabase(); $query = "SELECT roles FROM dbm_user WHERE id = ?"; if ($database->queryExecute($query, [$user])) { if ($database->rowCount() > 0) { $data = $database->fetchObject(); return $data->roles; } else { return 'dataNotFound'; } } else { return 'dataQueryError'; } } Jesli funkcja zwraca role, to ma zwracac role a nie komunikaty bledow. Od bledow masz wyjatki.I znowu wpyta zagniezdzen tutaj public static function temp_htmlUser($sessionUserId, $module = null): void { $database = new DatabaseClass(); $userId = (int) $sessionUserId; $query = "SELECT user.login, user.avatar, user_details.fullname FROM dbm_user user" . " INNER JOIN dbm_user_details user_details ON user_details.user_id = user.id" . " WHERE user.id = '$userId'"; if ($database->queryExecute($query)) { $data = $database->fetchObject(); Czemu ta funkcja radosnie tworzy polaczenie do bazy i jeszcze sama z siebie pobiera usera? polaczenie z baza ma byc stworzone rac w calej aplikacji i przekazywane potem do odpowiednich klas. W tym momecnie wczasie jednego request ty generujesz mase polaczen do bazy. Rowniez obiekt usera ma byc pobrany raz i przekazywane do odpowiednich klas. Klasa TranslationClass. Raz ze te Class w nazwie jest zbedne, a dwa raz funkcje z malej raz z z duzej... generalnie maja byc z malej. W klasie DatabaseClass, znowy Class zbedne ale: public function __construct() { try { $this->connect = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_DATABASE, DB_USER, DB_PASSWORD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); $this->connect->exec("SET NAMES utf8"); Ty tutaj znowu tworzyc nowy obiekt PDO, czyli nowe polaczenia. Kazdy model z tego dziedziczy, wiec jak odpalisz 3 modele to masz juz 3 nowe polaczenia do bazy. No tak sie nie robil .Jak pisalem wczesniej, jedno polaczenia do bazy masz tworzyc i ono ma byc przekazywan tam gdzie trzeba public function getSection(int $id): object { $query = "SELECT * FROM dbm_article_sections WHERE id = '$id'"; $this->queryExecute($query); if ($this->rowCount() > 0) { return $this->fetchObject(); } return (object) []; } I znowy strasznie mieszasz style. Raz jak nie ma rekordu to zwracasz NULL a tu radosnie zwracasz pusty obiekt. No sie zdecyduj na jedno i sie tego trzymaj public function userSigninCorrect(array $params, string $password): ?string { $query = "SELECT * FROM dbm_user WHERE (login=:login OR email=:email) AND verified=true LIMIT 1"; if ($this->queryExecute($query, $params)) { if ($this->rowCount() > 0) { $result = $this->fetchObject(); if (password_verify($password, $result->password)) { return $result->id; } else { return self::VALID_PASSWORD; } } else { return self::VALID_LOGIN; } } else { return null; } } I tutaj znowu, funkcja ktora powinna zwracac info czy user sie zalogowal czy nie to zwraca albo jako text id usera albo komunikaty bledow... No prosze cie (IMG:style_emoticons/default/wink.gif) public const VALID_LOGIN = 'loginNotFound'; public const VALID_PASSWORD = 'passwordNotMatched'; Chyba sie to powinno nazywac INVALID a nie VALID Jeszcze tego tam jest torche ale juz mi sie nie chce sprawdzac. Generalnie idziesz w dobrym kierunku powiedzmy, ale musisz troche popracowac jeszcze |
|
|
|
Malinaa DbM Framework - Autorska aplikacja frameworka opartego na wzorcu MVC 20.12.2023, 21:40:29
Malinaa Dzięki bardzo za sprawdzenie kodu.
Narzędzia były... 21.12.2023, 11:36:53
nospor phpstan sprawdza innego rodzaju rzeczy wiec poleca... 21.12.2023, 11:52:58
Malinaa KodNa tym to wlasnie polega a ty tego nie rozumies... 21.12.2023, 12:51:47
nospor A ,teraz kumam do czego piles piszac te "rado... 21.12.2023, 12:59:22
netir Jak zobaczyłem w model raw query bez bindowania to... 26.12.2023, 16:02:56
Malinaa Cytat(nospor @ 21.12.2023, 09:42:45 )... 28.12.2023, 16:04:08
nospor ad1) Nie widzi klasy App\Config\Constant... 29.12.2023, 22:02:12
Malinaa 1. Jak sprawić, aby widział klasę App\Config... 8.01.2024, 09:20:34
nospor ad1 Klasy maja byc widoczne w autoloading i wtedy ... 8.01.2024, 10:11:34
Malinaa 1. Klasa przeniesiona i widoczna - całość bez błęd... 8.01.2024, 13:28:12
nospor Cytatale to powinno być po prostu super dobrze.
Z ... 8.01.2024, 14:27:04
Malinaa CytatZ jednej strony nalegasz na super dobrze, a z... 9.01.2024, 13:01:28
nospor NIe wiem o co ci chodzi z zmiennymi globalnymi w S... 9.01.2024, 14:16:56
Malinaa Z protected static $connect to takie zakombin... 9.01.2024, 20:07:04
nospor CytatZ protected static $connect to takie zak... 10.01.2024, 09:55:45
viking https://github.com/artimman/dbmframework/bl...conf... 10.01.2024, 12:22:37
Malinaa Cytat(nospor @ 10.01.2024, 09:55:45 )... 11.01.2024, 11:55:06 
viking Cytat(Malinaa @ 11.01.2024, 11:55:06 ... 11.01.2024, 12:39:55
nospor CytatPodejście pragmatyczne w programowaniu, brzmi... 11.01.2024, 12:03:10
Malinaa Cytat(nospor @ 11.01.2024, 12:03:10 )... 11.01.2024, 12:36:08
Malinaa Cytat(viking @ 11.01.2024, 12:39:55 )... 11.01.2024, 13:19:54
viking Przeczytać przeczytałem ale napisałem dlaczego to ... 11.01.2024, 13:33:16
Malinaa Rozumiem, mimo to chciałbym opracować mechanizm (w... 11.01.2024, 14:01:52
viking To na początek ja bym spróbował ogarnąć temat z kt... 11.01.2024, 14:32:23
Malinaa Wydawało mi się, że takie powszechne rozwiązanie j... 11.01.2024, 22:42:39
com Malinaa musisz sobie postawić zasadnicze pytanie p... 18.01.2024, 14:49:35
Malinaa Cytat(viking @ 11.01.2024, 14:32:23 )... 18.01.2024, 21:38:13 
Salvation Cytat(Malinaa @ 18.01.2024, 21:38:13 ... 23.01.2024, 10:21:20
Tomplus Ja osobiście rozumiem dlaczego ktoś tworzy i stosu... 24.01.2024, 09:31:42
Malinaa Mam chwilę, więc usiadłem do projektu. Dependency ... 27.01.2024, 20:29:21
viking Kontroler to generalnie nie jest miejsce na wciska... 29.01.2024, 11:42:03
Malinaa Cytat(viking @ 29.01.2024, 11:42:03 )... 2.02.2024, 22:57:21
viking Musisz się w końcu zdecydować. Robisz to żeby się ... 3.02.2024, 15:34:29
Malinaa Cytat(viking @ 3.02.2024, 15:34:29 ) ... 3.02.2024, 21:54:10
viking Wstrzykiwanie zależności a menedżer (albo service ... 4.02.2024, 06:53:24
Malinaa Kilka konkretnych informacji się pojawiło. Dzięki.... 4.02.2024, 10:05:54
nospor skoro tak bardzo nie chcesz uzywac DI co ci zaprop... 4.02.2024, 20:07:12
Malinaa Cytat(nospor @ 4.02.2024, 20:07:12 ) ... 5.02.2024, 22:59:20
nospor Niby sluchasz co sie do ciebie mowi ale jednoczesn... 6.02.2024, 09:31:42
Malinaa Jeżeli słucham to jak mogę nie słuchać. Rozumiem, ... 6.02.2024, 10:37:49
nospor No masz dalej dodawac w dol te $database
... 6.02.2024, 11:14:14
Malinaa Dotąd już miałem
$router = new Router($d... 6.02.2024, 11:48:20
nospor zajebisty opis problemu: bo sie sypalo.. Jak masz ... 6.02.2024, 12:14:57
Malinaa Dobrze, że pokazałeś palcem, bo nie mogłem tego zn... 6.02.2024, 15:18:56
nospor Cytatale przy zaktualizowanym kodzie w index.php j... 6.02.2024, 15:26:07
Malinaa No, aż mi głupio, ale jeszcze nie mogę uwierzyć, ż... 6.02.2024, 16:22:25
nospor nie
aż dochodzę do modelu BlogModel
public functi... 6.02.2024, 16:29:49
Malinaa Po zmianie w __construct()
Message: Cannot use ... 6.02.2024, 16:57:05
nospor sorki, mialem na mysli kontrollery a nie model.
c... 6.02.2024, 17:22:18
Malinaa Aha, czyli dodać tylko linijkę:
parent::__construc... 6.02.2024, 18:50:18
nospor CytatOk, po zmianie został jeszcze routing, takie ... 7.02.2024, 10:47:34
com RE: DbM Framework - Autorska aplikacja frameworka opartego na wzorcu MVC 7.02.2024, 15:09:08
Malinaa Cytat(nospor @ 7.02.2024, 10:47:34 ) ... 8.02.2024, 11:44:53
nospor CytatInterfejsy. No to od czego zaczniemy? smile.g... 8.02.2024, 12:24:30
com Cytat(Malinaa @ 8.02.2024, 11:44:53 )... 9.02.2024, 09:22:50
Malinaa Cytat(com @ 9.02.2024, 09:22:50 ) Nie... 9.02.2024, 11:38:31
com Cytat(Malinaa @ 9.02.2024, 11:38:31 )... 9.02.2024, 12:19:11
Malinaa Cytat(nospor @ 8.02.2024, 12:24:30 ) ... 12.02.2024, 00:27:30 
Salvation Cytat(Malinaa @ 12.02.2024, 00:27:30 ... 12.02.2024, 09:24:26
Malinaa Cytat(Salvation @ 12.02.2024, 09:24:2... 12.02.2024, 20:27:50 
Salvation Cytat(Malinaa @ 12.02.2024, 20:27:50 ... 13.02.2024, 11:34:58 
Salvation Cytat(Malinaa @ 13.02.2024, 20:46:10 ... 14.02.2024, 15:21:12
Malinaa Cytat(Salvation @ 13.02.2024, 11:34:5... 13.02.2024, 20:46:10
viking Zaczynając od php 8.0 wszystkie parametry required... 14.02.2024, 09:24:11
Malinaa Cytat(viking @ 14.02.2024, 09:24:11 )... 17.02.2024, 00:06:00
nospor CytatJak to zrobić, aby było ok dla szablonów, w k... 17.02.2024, 11:21:45
Malinaa Tak przerabialiśmy i wiem jak mógłbym to zrobić dl... 17.02.2024, 20:09:45
nospor Jak ty sobei lubisz komplikowac prace
I co z tego ... 18.02.2024, 09:13:36
Malinaa Tak jakoś mam, że i tu gdzie można by przyjąć, że ... 18.02.2024, 20:21:15
nospor CytatJeśli w funkcji dam DatabaseInterface $d... 18.02.2024, 21:30:08
Malinaa Używam, choć przyszedł mi na myśl inny system szab... 19.02.2024, 20:34:23
nospor ad2) bez znaczenia
Na pozostale dwa juz nie wiem... 20.02.2024, 09:57:23
Malinaa 2. Ok i super.
1. Ach, dasz radę. Ten template je... 20.02.2024, 22:34:50
nospor CytatNie jest tak jak piszesz, albo coś nie kumam.... 21.02.2024, 09:18:19
Malinaa Tak chcę, aby było bezbłędnie. Czy będzie perfekcy... 24.02.2024, 23:15:43
nospor CytatSprawdzam jak działa templates/base.phtml i y... 25.02.2024, 20:33:19
Malinaa Gadanie, kumasz. Chociaż szczęście każdy rozumie n... 26.02.2024, 00:48:26
nospor Cytatwyskakuje błąd
Juz ci kiedys pisalem co masz ... 26.02.2024, 09:32:34
Malinaa Pamięć dobra, ale krótka o czym kiedyś pisałeś co ... 28.02.2024, 18:51:51
nospor CytatSorki, że dopytuje o takie szczegóły jak PHP_... 29.02.2024, 12:03:02
Malinaa Użycie PHP_EOL w TemplateEngine
Kodfile_put_conte... 29.02.2024, 21:47:31
nospor Cytat$this->translation = json_encode(... 1.03.2024, 09:40:08
Malinaa Chyba spanikowałem, na szybkości dodałem json_enco... 1.03.2024, 10:53:30
nospor CytatNapisałeś "dane trzymaj w obiekcie... 1.03.2024, 10:57:07
Malinaa Przy sprzątaniu i optymalizacji natrafiłem na kod ... 16.03.2024, 22:40:47
nospor metoda trans nadal za kazdym razem gdy jest wywoly... 19.03.2024, 10:37:19
Malinaa Metoda trans() w którym pliku/klasie?
W class Tra... 20.03.2024, 20:59:12
nospor Tak, wlasnie o cos takiego mi chodzilo
public fun... 21.03.2024, 09:06:40
Malinaa Konstruktor, o który chodziło to już był.
Obiekt ... 21.03.2024, 11:21:16
nospor CytatKonstruktor, o który chodziło to już był.
Mi ... 21.03.2024, 11:55:00
Malinaa Ok, rozumiem o czym mówisz, kilka tygodni temu zos... 21.03.2024, 13:39:53
nospor CytatJeśli tak to nie rozumiem, dlaczego aż od ind... 21.03.2024, 17:03:33
Malinaa CytatGeneralnei chodzi o to by nie tworzyc tego sa... 27.03.2024, 15:09:11 ![]() ![]() |
|
Aktualny czas: 30.12.2025 - 18:50 |