Witam jak w temacie.
Z PHP mam styczność jakiś czas i nie mam się kogo zapytać czy moje poczynania idą w dobrym kierunku.
Jest to zaczątek sklepu internetowego.
Jest to plik index.php który tak na prawdę łączy wszystko w całość i decyduje o wyświetleniu elementów strony.
Jest to jakieś wyjście - raczej takie toporne...
Kilka uwag:
- wciąż powtarzasz "isset($_GET['coś']) && $_GET['coś']" - aż się prosi aby z tego funkcję zrobić, co będzie zwracała dane pole z $_GET jeśli tam istnieje.
- sprawdzasz różne wartości dla tego samego pola i potem dołączasz tę samą stronę - to w ramach jednego warunku if można zrobić.
- ify nie są wykluczające się, wiec jak zrobię index.php?akcja=wyloguj&info=zarejestrowano to się załaduje Uzytkownik.php i wyświetli komunikat "Zarejestrowano nowego użytkownika".
Takie warunkowe wciąganie plików sugeruje, że pewnie w nich masz jakiś kod HTML na żywca ze wstawkami PHP - to podejście, które szybko się mści, bo o ile na początku łatwo coś wyświetlić, to potem trudno się to utrzymuje.
O wiele lepszym podejściem byłoby utworzenie obiektów, które generują kod HTML i w zależności od argumentów tworzysz odpowiedni obiekt, który pokazuje stronę taką lub inną.
Ogólnie najlepiej jest maksymalnie rozdzielać warstwę logiki od warstwy prezentacji.
Popatrz w internecie jak to się robi w różnych popularnych projektach - tam stopień skomplikowania będzie trochę duży, ale pewnie znajdziesz też jakieś proste przykłady.
<?php
namespace sklep\Getsprawdzenie;
class Getsprawdzenie
{
public function Sprawdz($nazwaget, $wartosc)
{
if (isset($_GET[$nazwaget]) && $_GET[$nazwaget] == $wartosc)
return true;
else
return false;
}
}
Teraz w if-ach wywołuje funkcję Sprawdz z parametrem nazwy get-a i wartością do sprawdzenia
Odnośnie drugiej uwagi:
Nie ująłem wszystkiego co się da w jednym if-ie dla przejrzystości kodu.
Odnośnie trzeciej uwagi:
Rzeczywiście if-y się nie wykluczają i to jest do małej poprawki
Kolejne pytanie:
Oto kod i pytanie: jeśli robię coś źle to co robię źle ?
Skrypt ten jest dołączany do pliku index.php.
Dodam że działa prawidłowo.
Oto kod:
Ogólna uwaga - kiepsko to wygląda. Czy to w ogóle było zaprojektowane, czy tak jest pisane w miarę potrzeb? Tutaj by się przydał generalny refactoring, bo funkcjonalności mało, a już jest kaszanka...
Odporny na błędy na pewno ten skrypt nie jest - odwoływanie się do elementów tablicy, które mogę nie istnieć, zwracanie zmiennych, które mogą być niezdefiniowane, obsługi błędów w zasadzie brak, niewykluczające się warunki w ifach na końcu, kod JS co robi reload, nazwy metod nieadekwatne do tego co robią, nazwy zmiennych generyczne zamiast opisowych (wynik, wiersz), drukowanie kodu html wewnątrz php (lepiej zastąpić to choćby jakimś prymitywnym systemem szablonów stron)...
Nawiązywanie połączenia z bazą w każdej metodzie albo dla każdego zapytania jest bez sensu - lepiej to zrobić raz - albo w konstruktorze, albo w jakiejś metodzie dla obiektu całego sklepu - potem metody odpowiedzialne za konkretne akcje powinny się odwoływać do jakiegoś pola z połączeniem do bazy danych.
Zdecydowanie polecam przemyśleć architekturę tego rozwiązania - spisać sobie wymagania/potrzeby, przygotować szkic projektu - "rozrysować" sobie z jakich modułów ma się składać, ich relacje - a potem dopiero to zaprogramować.
<?php
namespace Konfiguracja\Trasowanie;
class Trasowanie
{
static public function Odczytajadres($parametr) : bool
{
preg_match("/[a-z]+$/", $_SERVER['REQUEST_URI'],$otrzymanadana);
//tu powinno być sprawdzenie czy $otrzymanadana jest tablicą - is_array($otrzymanadana)
if (count($otrzymanadana) == 1)
{
if ($parametr == $otrzymanadana[0])
{
return true;
}
else
{
return false;
}
}
else
if (count($otrzymanadana) != 1)
{
return false;
}
}
}
?>
Czy ta przymiarka jest dobra czy powinienem coś zmienić ?
Mówiąc 'dobra' chodzi mi o to czy właśnie w ten sposób wyciąga się dane z adresu url ?
Jaka jest różnica w wydajności jeśli chodzi o wywoływanie metod statycznych a zwykłych ?
<?php
namespace Moduly\Sklep\Kontrolery\sklep;
require_once 'Moduly/Sklep/Modele/sklep.php';
use Moduly\Sklep\Modele\sklep\sklep as sklepmodel;
require_once 'Konfiguracja/wywolajwidok.php';
use Konfiguracja\wywolajwidok\wywolajwidok;
class sklep
{
public function pokazprodukty()
{
$sklep = new sklepmodel();
$produktyzbazy = $sklep->pobierzproduktyzbazy();
if ($produktyzbazy)
{
wywolajwidok::wywolajwidok("Sklep","pokazprodukty",$produktyzbazy);
}
else
{
wywolajwidok::wywolajwidok("Sklep","pokazprodukty",'brakproduktow');
}
}
}
try {
$sklep = new sklep();
$akcja = $GLOBALS['akcjakontrolera'];
$sklep->$akcja();
} catch (\Exception $e) { echo $e->getLine(); };
Nie jest to żadna finalna wersja więc mogą być niedociągnięcia. Niestety użyłem zmiennej globalnej bo na prawdę nie przychodzi mi do głowy jak ją zastąpić.
Wstawiam kod aby ktoś mi doradził jak poprzednio czy idę w dobrym kierunku ?
Przepraszam że tak ciągnę ten temat ale nie mam się kogo zapytać, jestem samoukiem i nie chce rozwijać się w kierunku który jest zły stąd prośba o opinie.
Tak ogólnie - straszny ten kod. Mało co jest zrobione "zgodnie ze sztuką" - czyli tak, aby działało dobrze i jednocześnie nadawało się do rozbudowy/utrzymania.
Ta zmienna globalna i sposób jej użycia - to taka wisienka na torcie - nie rób tak. To z pewnością da się napisać lepiej... Mam nadzieję, że ta akcjakontrolera nie pochodzi z jakiegoś POST albo GET bo to już będzie potencjalnie luka bezpieczeństwa...
Zacznij od przerobienia jakichś kursów, nawet darmowych, przejrzyj jakieś sensowne projekty open source, podejrzyj jak się tam różne rzeczy robi, potem usiądź i zastanów się co chcesz zrobić, zaprojektuj to (forma dowolna - rysunek, opis, tabelka... pomyśl jakie będziesz miał obiekty, jak się będą wołały, jakie API potrzebujesz) i dopiero zacznij pisać. Jeśli chcesz być samoukiem - spoko - ale rób to z głową. Wiedzy w internecie jest mnóstwo - wystarczy z niej skorzystać. Bez sensu zaczynać jest od przyswajania sobie złych praktyk - zacznij od poznania tych dobrych i stosowania ich od samego początku.
Rozpocząłem pisanie nowego przykładowego kodu.
Nie używam teraz zmiennych globalnych do przekazania nazwy metody kontrolera (akcji). Użyłem do tego singletonu.
<?php
//to plik odpowiedzialny za konfigurację routingu (chyba tak to się po angielsku nazywa)
require_once "src/routes.php";
use src\routes\routes;
$routes = new routes();
//poniżej pierwszy parametr to pierwsza część adresu a drugi to druga część adresu czyli w przeglądarce musze wpisać adres/index.php/stronaglowna
$routes->dodajadres("stronaglowna","","StronaGlownaController","indexAction");
<?php
//to jest ten mój nieszczęsny kontroler
namespace app\controllers\StronaGlownaController;
require_once "src/przekazywanieakcji.php";
use src\przekazywanieakcji\akcje;
class StronaGlownaController
{
public function __construct()
{
$akcja = akcje::getInstance();
if ($akcja != null)
$this->$akcja();
else
return false;
}
public function indexAction()
{
//wiem tego tu nie powinno być
echo "WYWOŁANO";
}
}
$StronaGlownaController = new StronaGlownaController();
Nie poddajesz się - to dobrze, ale dalej brniesz w fatalnym kierunku - to źle...
To wciąż bardzo nieudany kod jest...
Co niby to akcje::getInstance() zwraca? Jeśli to singleton, to powinno zwrócić instancję tego singletona, a jednak tutaj to zwraca nazwę funkcji do zawołania... Czyli to raczej nie jest singleton...
Jaką masz gwarancję, że jeśli akcja nie jest nullem, to taka funkcja istnieje w ogóle? Wołasz ją dosyć beztrosko.
Dlaczego konstruktor zwraca jakąś wartość? Teoretycznie można tak zrobić, ale nie znam dobrego powodu, aby to robić... Jak korzystasz z tej zwracanej wartości?
Mieszasz polskie i angielskie nazwy - zaciemnianie kodu.
Powtórzę jeszcze raz - zacznij od podstaw, zapoznaj się z dobrymi praktykami programowania, przemyśl co chcesz zrobić i dopiero zabierz się za pisanie...
Czy mógłbyś podać jakiś dobry kurs w internecie o robieniu własnego frameworka php mvc ?
Może jakąś książkę albo kurs do kupienia ?
Będę bardzo wdzięczny i dziękuję za Twoje zaangażowanie mario_7.
PHP to nie moja bajka - wiele lat temu trochę się nim interesowałem, ale obecnie nie mam w zasadzie z nim styczności (poza doraźnymi poprawkami w wordpressie czy phpbb tutaj na forum ).
Zacząłbym od standardowych miejsc - czyli po prostu strona domowa PHP, potem udemy (są darmowe kursy), linkedin learning (darmowy miesiąc powinien wystarczyć na obejrzenia ciekawych kursów), youtube (tutaj warto pewnie znaleźć jakieś kursy polecane przez renomowane portale, bo pewnie sporo różnej jakości porad też się znajdzie). Zapewne więcej dowiesz się zaglądając na jakieś tematyczne forum czy inną społeczność skupioną wokół tego języka.