Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

5 Stron V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> DbM Framework - Autorska aplikacja frameworka opartego na wzorcu MVC
nospor
post 6.02.2024, 09:31:42
Post #41





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




Niby sluchasz co sie do ciebie mowi ale jednoczesnie nie sluchasz.

Mowie wyraznie: obiekt Database ma robic w index.php a nie w zadnym indexController....

Obiekt $database, ktory zrobisz w index.php masz potem przekazac do wszystkiego innego co go uzywa. A skoro z index.php przechodzisz do Route, to masz ten obiekt $database przekazac do Route a potem w route przekazujesz dalej czyli do kontrolerow itd itd. Schodzisz caly czas w dol, tu nie ma zadnej magii


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 6.02.2024, 10:37:49
Post #42





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


Jeżeli słucham to jak mogę nie słuchać. Rozumiem, że nie ma w tym żadnej magii, ale nie potrafię zrobić tego przejścia dobrze, coś się wysypuje i w tym problem.
Piszemy o tym któryś raz i jak piszesz dla Ciebie to proste, a nie kumam, nie że nie słucham, a zawiesiłem się w tym miejscu (chyba potrzebny reset ;-)

Database mam zrobić w public/index.php, czyli jak rozumiem ma być tak:

// Routing and database connection
use Dbm\Classes\Database;

$database = new Database;

$routes = require(BASE_DIRECTORY . 'application' . DS . 'routes.php');
$routes($database); // -> dodane $database

dalej mam plik routes.php

return function (Database $database) { // -> dodane $database
$uri = $_SERVER['REQUEST_URI'];

$router = new Router();
...
}

następnie to nic mi z tego przekazywania nie wychodzi, więc jak dalej... ?


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 6.02.2024, 11:14:14
Post #43





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




No masz dalej dodawac w dol te $database

$router = new Router($database);


Cytat
Jeżeli słucham to jak mogę nie słuchać.

Skoro mowie index.php a ty dodajesz w INdexController to jak ja mam to rozumiec skolei?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 6.02.2024, 11:48:20
Post #44





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


Dotąd już miałem
$router = new Router($database); i więcej..
ale idąc dalej i słuchając i tak musiałem dodać w IndexController bo się sypało,
w którymś miejscu dalej nie wychodzi


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 6.02.2024, 12:14:57
Post #45





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




zajebisty opis problemu: bo sie sypalo.. Jak masz problem z kodem ktory robimy, to podajesz komunikat bledu a nie walisz tekstem "bo sie sypalo" i totalnie zmieniasz koncepcje. No tak do niczego nie dojdziemy

Przeciez w Router masz

$controller = new $controller();

no to jaki problem zrobic z tego
$controller = new $controller($database);

?
oczywiscie konstruktor kontrolera tez ma przyjmowac ten parametr.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 6.02.2024, 15:18:56
Post #46





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


Dobrze, że pokazałeś palcem, bo nie mogłem tego znaleźć,
sorki zamotałem się, a tak samo proste jak w index.php,
ale przy zaktualizowanym kodzie w index.php jednak nie dajemy, tylko w klasie Router ? :

$database = new Database;
$controllerInstance = new $controller($database);

po czym w AbstractController

public function __construct(Database $database)
{
$this->database = $database;
}

i teraz jest ok, bo działa w IndexController:

Kod
/*
     * TODO! public function __construct(Database $database, Translation $translation) // TODO! Wstrzykiwanie do konstruktora!?
     */
    public function __construct(Database $database)
    {
        $model = new BlogModel($database);
        $this->model = $model;

        $translation = new Translation();
        $this->translation = $translation;
    }

    /*
     * TODO! public function index(Translation $translation, etc...) // TODO! Wstrzykiwanie do metody!?
     *
     * @Route: "/"
     */
    public function index()
    {
    ...
    }


i modele wygląda że są już super - konstruktor śmiga i mamy jedno połączenie.

Pozostały jeszcze zapytania o IndexController
1. czy można / jak zrobić aby wstrzykiwać do woli co tylko potrzebne
public function __construct(Database $database, Translation $translation, FirstService, SecondService, Three, etc....)
2. oraz wstrzykiwanie do metody ? np.
public function index(Translation $translation, etc...)

Ten post edytował Malinaa 6.02.2024, 15:21:31


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 6.02.2024, 15:26:07
Post #47





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




Cytat
ale przy zaktualizowanym kodzie w index.php jednak nie dajemy, tylko w klasie Router ? :
No i widzisz aty dalej swoje. Ja ci mowie jedno, a ty i tak robisz po swojemy.
Wyrnaznie pisalem ze to ma byc w index.php.
Teraz $database stworzyles w Router, na dodatek warunkowo przed tworzeniem kontrollera. Ale przeciez $database moze byc wykorzystawane w innych miejscach a nie tylko w kontrolerze a ty to wlasnie ograniczyles do kontrolera.

Cytat
1. czy można / jak zrobić aby wstrzykiwać do woli co tylko potrzebne
public function __construct(Database $database, Translation $translation, FirstService, SecondService, Three, etc....)

Albo powtarzasz kroki z database, albo wkoncu sciagasz DI co ci proponowano.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 6.02.2024, 16:22:25
Post #48





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


No, aż mi głupio, ale jeszcze nie mogę uwierzyć, że aby było ok trzeba wykonać aż takie przejście z pliku do pliku i plik po pliku.

Jest tak w pliku index.php

// Routing and database connection
use Dbm\Classes\Database;
$database = new Database;
$routes = require(BASE_DIRECTORY . 'application' . DS . 'routes.php');
$routes($database);

routes.php

return function (Database $database) {
$uri = $_SERVER['REQUEST_URI'];
$router = new Router($database);
...
}

class Router

public function __construct(Database $database)
{
$this->database = $database;
}

if (class_exists($controller)) {
$controllerInstance = new $controller($database);
...
}

AbstractController - nie jest abstract, więc nazwa do zmiany

public function __construct(Database $database)
{
$this->database = $database;
}

IndexController

public function __construct(Database $database)
{
$model = new BlogModel($database);
$this->model = $model;

$translation = new Translation();
$this->translation = $translation;
}

aż dochodzę do modelu BlogModel

public function __construct(Database $database)
{
$this->database = $database;
}

Czy teraz jest Ok?


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 6.02.2024, 16:29:49
Post #49





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




nie
aż dochodzę do modelu BlogModel

public function __construct(Database $database)
{
$this->database = $database;
}

a:

aż dochodzę do modelu BlogModel

public function __construct(Database $database)
{
parent::__construct($database);
// inne rzeczy w konstruktorze BlogModel
}



Moze to i glupio wyglada ale tak sie robi. W sensie nie robi sie tak jak ty to robisz, tylko sie uzywa automatow co juz ci proponowano. Ale tak wlasnie generalnie wyglada DI. Obiekt jest tworzony raz a potem przekazywany wszedzie tam gdzie potrzeba. Ulatwi to wiele spraw, chocby testowanie aplikacji


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 6.02.2024, 16:57:05
Post #50





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


Po zmianie w __construct()

Message: Cannot use "parent" when current class scope has no parent
File: Model\BlogModel.php on line 21


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 6.02.2024, 17:22:18
Post #51





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




sorki, mialem na mysli kontrollery a nie model.

czyli nie
IndexController

public function __construct(Database $database)
{
$model = new BlogModel($database);
$this->model = $model;

$translation = new Translation();
$this->translation = $translation;
}

a
IndexController

public function __construct(Database $database)
{
parent::__construct($database);
$model = new BlogModel($database);
$this->model = $model;

$translation = new Translation();
$this->translation = $translation;
}


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 6.02.2024, 18:50:18
Post #52





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


Aha, czyli dodać tylko linijkę:
parent::__construct($database);
w konstruktorze, ponieważ dziedziczy z kontrolera bazowego,
no i już wiem jak nazwać kontroler bazowy
AbstractController to BaseController
no i wszystko jasne smile.gif

Kod
Moze to i glupio wyglada ale tak sie robi. W sensie nie robi sie tak jak ty to robisz, tylko sie uzywa automatow co juz ci proponowano. Ale tak wlasnie generalnie wyglada DI. Obiekt jest tworzony raz a potem przekazywany wszedzie tam gdzie potrzeba. Ulatwi to wiele spraw, chocby testowanie aplikacji


A to nawet nie jest bez sensu zrobić takie ćwiczenie wink.gif

Ok, po zmianie został jeszcze routing, takie sobie linki SEO friendly wymyśliłem, np.:
/praesent-euismod-gravida-libero-a-luctus-nisi-fermentum-nec,art,5.html
że nie ma lekko z tym routingiem.

Mniejsza z tym routingiem, czy jest tu jakieś miejsce gdzie przydałby się np. AbstractController, albo Interfejs, a może Fabryczka ?; )

Ten post edytował Malinaa 6.02.2024, 19:08:38


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 7.02.2024, 10:47:34
Post #53





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




Cytat
Ok, po zmianie został jeszcze routing, takie sobie linki SEO friendly wymyśliłem, np.:
/praesent-euismod-gravida-libero-a-luctus-nisi-fermentum-nec,art,5.html
że nie ma lekko z tym routingiem.

No ale jakies pytanie w zwiazku z tym czy tylko komunikujesz? wink.gif

Cytat
Mniejsza z tym routingiem, czy jest tu jakieś miejsce gdzie przydałby się np. AbstractController, albo Interfejs, a może Fabryczka ?; )

No interfejsy daje sie w zasadzie wszedzie. u ciebie napewno na wszystko to co wstrzykujesz powinny byc interfejsy


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
com
post 7.02.2024, 15:09:08
Post #54





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


Cytat(Tomplus @ 24.01.2024, 09:31:42 ) *
Ja osobiście rozumiem dlaczego ktoś tworzy i stosuje własne FW. Mają kilka zalet:
- na początku są proste w obsłudze
- są lekkie
- uwzględniają specyfikę hostingu
- są szyte na miarę umiejętności twórcy.

Jednak problemy przychodzą gdy, projekt się rozrasta i różnych powiązań modułów jest coraz więcej. Zaczynają pojawiać się zbędne powtórzenia, blędy tam gdzie nie powinno ich być.


No i to jest pierwszy i podstawowy błąd, kiedyś kiedy środowisko PHP raczkowało powstawało wiele potworków, która były systemami Legancy już na samym starcie projektu, potem projekt coraz bardziej się rozrastał i zainwestowanych środków nikt już nikomu nie zwróci, wiec utrzymuje się takie twory po dziś, ale w 2024 roku powinno nie być już zrozumienia dla takich praktyk. Sam tak jak pisałem wyżej wiele lat temu tworzyłem własne bo mi się jak każdemu wydawało że prosty projekt to poco zatrudniać taka kobyle jak pełnoprawny FW, ale czasy mamy inne i FW też pozwalają na to by dla mikroporjektów odpalać je i nie jest to taki już ogromny narzut jak kiedyś, dlatego uśmiercono już Silexa czy Lumena, bo Symfony czy Laravel potrafią je w pełni zastąpić. A największym problemem tego było to co napisałeś: "są szyte na miarę umiejętności twórcy.", w zeszył roku przez pewien czas przyszło mi pracować z takim systemem, jego poziom rozwoju zatrzymał się na PHP 5.4, a na starcie wszystkie błędy musiały być tam filtrowane bo było ponad 500 błędów o tym, że używana jest metoda klasy jako statyczna metoda, nie było szans na podbicie nawet do 5.5, bez przepisania połowy tego kodu, pomijając to że jest tak napisany ze nawet rector by sobie z tym nie poradził, w planach miało być przejście na PHP 5.6 a potem 7, ale jak wiadomo nowe funkcjonalności wygrały z naprawa tego co przez lata tam napsuto. Dlatego nie róbmy sobie krzywdy tworząc takie fw dla ideii, jeśli chcemy poznać jak coś działa to kod jest open source można przejrzeć źródła i testy i nawet jak nadal uparcie chcemy coś pisać to trzeba już mieć doświadczenie tka jak ktoś już tutaj wcześniej o tym wspominał.

Cytat
Malinaa musisz sobie postawić zasadnicze pytanie poco to tworzysz?


Cytat(Malinaa @ 18.01.2024, 21:38:13 ) *
Pan Bóg stworzył istotę dla hecy, z tyłu plecy, z przodu plecy. A jednak po niej przyszedł ten, który był zrodzony, a nie stworzony smile.gif
Chcesz pomóc? Napisz jak mam zakodować DI i inne drobiazgi, o których pisałem wyżej.


Chcę pomoc ale kompletnie nie zrozumiałeś przekazu, wysłałem Ci wartościowy materiał https://symfony.com/doc/current/create_framework/index.html do którego nie zajrzałeś nawet. Uparłeś się żeby stworzyć FW bez composera, co w 2024 jest już niedopuszczalne w żadnym greenfield`zie. Kiedy w końcu PHP dojrzało do pewnych standardów które w Javie, czy C# mamy od lat i za których brak PHP przez lata był hejtowany, ty robisz wszytko by nadal powielać wszystkie złe praktyki jakie przez lata w tym języku stosowano. Wysiałem tobie również https://phptherightway.com/ tutaj również nie zajrzałeś, tam masz odpowiedzi chociażby na pytanie jak wdrożyć DI https://phptherightway.com/#dependency_injection Skoro chcesz poznać jak to działa to o tym poczytaj, nie oczekuj że podam Ci coś na tacy bo wtedy nie poznasz jak to działa, ale jak chcesz naprawdę czegoś się nauczyć z tworzenia tego FW to zanim zaczniesz pisać kod musisz zglebić te zagadnienia i przed wszystkim słuchać rad innych, którzy też kiedyś to poznawali tak jak Ty, nikt się nie budzi z tą wiedzą, zobacz przez ile postów z nospor pisałeś o tym jak wdrożyć DI, a wynikało to z tego że nie wiedziałeś czym jest ten wzorzec, wiec tego nie potrafiłeś przełożyć na kod. Jeśli chcesz naprawdę do czegoś w tym FW dojść to musisz bardzo dużo poczytać o tym, a dopiero potem próbować to przełożyć na kod, my siadamy do kodu bo już znamy pojecie DI itp, ty je poznajesz wiec to normalne że nie widzisz tego jeszcze w kodzie, ale jakbyś miał już teorie za sobą to byś to tak samo widział jak my smile.gif Patrzysz na to że Wordpress nie ma composera, co oczywiście jest prawdą ale on powstał w 2004 roku, tam ten kod jest tak stary że jak powstawał było jeszcze PHP 4.X, potem 5.0, stąd ma wiele rzeczy których by w 2024 roku nie zastosowano, zaczynając od konwencji nazewnictwa klas i metod, braku composera w oficjalnym core i wsparcia dla PSR, ale ten kod ma 20 lat, nikt czegoś co przez 20 lat szczególnie w ramach open source nie przepisze na obecne standardy, będzie to utrzymywane w tej formie do końca jego istnienia, ale przez to własnie PHP jest tak bardzo nienawidzony, za Wordpressa bo nadal ludzie myślą że PHP wygląda tak jak Wordpress, ale jak ten system blogowy zasila jakieś 60% internetu to nie ma możliwości tak drastycznych zmian, bo tam musi być zachowana kompatybilność by 60% internetu się nie wysypało, ale to nie znaczy, że jesteśmy zmuszeni do tego by dalej tak pisać w Wordpressie, bo nie jesteśmy możemy użyć https://roots.io/bedrock/ i mieć kod na miarę 2024 roku i musisz to kolego zrozumieć, że nie jesteśmy już w 2004 roku, nie ma miejsca na tworzenie tego w ten sposób jeśli faktycznie chcesz się czegoś nauczyć i kiedyś nam za to podziękujesz że nie szedłeś tą ślepą drogą smile.gif Jak zaczniesz pisać to tak jak na 2024 rok przystało wtedy bardzo chętnie zrobię Ci Review kodu smile.gif Swoją drogą już Ci pisałem MVC to tylko pewna konwencja(https://www.youtube.com/watch?v=pJSoS4VBIW4&themeRefresh=1 poza tym obejrzyj sobie to), nie da się jej zaadaptować do WEB, to zawsze będzie jakaś wariacja wokół tego i nie ma problemu by katalog z templatkami nazywał się templates, a jak robisz templatki w czystym PHP/HTML to jak najbardziej dobrym rozszerzeniem dla tego jest phtml, to już taki standard(wprawdzie już raczej się nie używa tylko systemów jak twig ale w teorii można)

  1. Fatal error: Uncaught TypeError: Argument 1 passed to Dbm\Classes\Router::matchRoute() must be of the type string, null given, called in \www\dbm\application\classes\Router.php on line 38 and defined in \www\dbm\application\classes\Router.php:83 Stack trace: #0 \www\dbm\application\classes\Router.php(38): Dbm\Classes\Router->matchRoute(NULL) #1 \www\dbm\application\routes.php(43): Dbm\Classes\Router->dispatch(NULL) #2 \www\dbm\public\index.php(54): {closure}(Object(Dbm\Classes\Database)) #3 {main} thrown in \www\dbm\application\classes\Router.php on line 83


Swoją droga nie można tego nawet uruchomić bo na sztywno zaszyłeś w metodzie dispatch w 37 lini klasy Router
  1. $uri = $this->matchLocalhost($uri);

i nie można było tego odpalić na jakiś vhoscie, to powinno być opcjonalne albo konfigurowalne. Fajne logo takie trochę kradzione od JetBrains wink.gif

Cytat(Malinaa @ 6.02.2024, 18:50:18 ) *
Ok, po zmianie został jeszcze routing, takie sobie linki SEO friendly wymyśliłem, np.:
/praesent-euismod-gravida-libero-a-luctus-nisi-fermentum-nec,art,5.html
że nie ma lekko z tym routingiem.

To nie jest akurat SEO friendly https://www.seroundtable.com/google-commas-...tion-32741.html smile.gif

Prosze tutaj obsługa routingu(żeby nie było że nie chcę pomoc)
Klasa Router
  1.  
  2. class Router
  3. {
  4. protected $routes = [];
  5. private $database;
  6.  
  7. public function __construct(Database $database)
  8. {
  9. $this->database = $database;
  10. }
  11.  
  12. public function addRoute(string $route, array $arrayController): void
  13. {
  14. $arrayControllerAction = $this->changeArrayKey($arrayController, ['controller', 'method']);
  15. $this->routes[$route] = $arrayControllerAction;
  16. }
  17.  
  18. public function dispatch(string $uri): void
  19. {
  20. $database = $this->database;
  21.  
  22. $uri = $this->matchLocalhost($uri);
  23. $route = $this->matchRoute($uri);
  24. $uri = $route['uri'];
  25.  
  26. $hasParams = false;
  27. if (!empty($route['params'])) {
  28. $hasParams = true;
  29. $uri = $this->buildRouteUri($route['paths'], $route['params']);
  30. }
  31.  
  32. if (array_key_exists($uri, $this->routes)) {
  33. $controller = $this->routes[$uri]['controller'];
  34. $method = $this->routes[$uri]['method'];
  35.  
  36. if (class_exists($controller)) {
  37. $controllerInstance = new $controller($database);
  38.  
  39. if (method_exists($controllerInstance, $method)) {
  40. if ($hasParams) {
  41. $controllerInstance->$method((int)end($route['params']));
  42. } else {
  43. $controllerInstance->$method();
  44. }
  45.  
  46. } else {
  47. throw new ExceptionHandler("No method $method on class $controller!", 500);
  48. }
  49. } else {
  50. throw new ExceptionHandler("No controller $controller!", 500);
  51. }
  52. } else {
  53. throw new ExceptionHandler("Route not found! addRoute('$uri')", 404);
  54. }
  55. }
  56.  
  57. private function changeArrayKey(array $array, array $keys): array
  58. {
  59. foreach ($array as $key => $value) {
  60. $newArray[$keys[$key]] = $value;
  61. }
  62.  
  63. return $newArray;
  64. }
  65.  
  66. private function matchLocalhost(string $uri): ?string
  67. {
  68. $haystack = APP_PATH;
  69. $needle = 'localhost';
  70.  
  71. if (strpos($haystack, $needle) !== false) {
  72. $folder = substr($haystack, strpos($haystack, $needle) + strlen($needle));
  73.  
  74. return str_replace($folder, '/', $uri);
  75. }
  76.  
  77. return null;
  78. }
  79.  
  80. private function buildRouteUri(array $paths, array $params): string
  81. {
  82. $params[0] = '{#}';
  83. $params[count($params) - 1] = '{id}';
  84. return '/'.implode('/', $paths). '/'. implode(',', $params).'.html';
  85. }
  86.  
  87. private function matchRoute(string $uri): array
  88. {
  89. $path = filter_var($uri, FILTER_SANITIZE_URL);
  90. $path = ltrim($path, '/');
  91. $path = explode("/", $path);
  92.  
  93. if (($pos = strpos($uri, '?')) !== false) {
  94. $uri = substr($uri, 0, $pos);
  95. }
  96. $paths = [];
  97. $params = [];
  98. foreach ($path as $subPath) {
  99. if (strpos($subPath, '.html') !== false) {
  100. $params = explode(',', $subPath);
  101. $param = end($params);
  102. if (($pos = strpos($param, '.html')) !== false) {
  103. $params[count($params) - 1] = substr($param, 0, $pos);
  104. }
  105. } else {
  106. $paths[] = $subPath;
  107. }
  108.  
  109. }
  110.  
  111. /*if (strpos($uri, ',') !== false) {
  112.   $uri = substr($uri, 0, 1) . substr($uri, strpos($uri, ',') + 1);
  113.   }*/
  114.  
  115. /* $parts = explode(',', $uri);
  116.   $uri = '/' . array_pop($parts); */
  117.  
  118. foreach($path as $index => $param){
  119. if(preg_match("/{.*}/", $param)){
  120. $indexNum[] = $index;
  121. }
  122. }
  123.  
  124. //print_r($indexNum);
  125.  
  126. /*if ((strpos($uri, '-')) !== false) {
  127.   //$parts = explode('/', $uri);
  128.   //$last = array_pop($parts);
  129.   //echo ' | '. $last;
  130.  
  131.   $link = str_replace(['/', '.html'], '', $uri);
  132.   $segments = explode(',', str_replace('/', '', $link));
  133.  
  134.   foreach ($segments as $key => $value) {
  135.   if (is_numeric($value)) {
  136.   $segments[$key] = '{$}';
  137.   }
  138.   if ((strpos($value, '-')) !== false) {
  139.   $segments[$key] = '{#}';
  140.   }
  141.   }
  142.  
  143.   //$uri = '/' . $path[0] . '/' . implode(',', $segments) . '.html';
  144.   $uri = '/' . implode(',', $segments) . '.html';
  145.  
  146.   //echo $uri;
  147.   }*/
  148.  
  149. return [
  150. 'uri' => $uri,
  151. 'paths' => $paths,
  152. 'params' => $params
  153. ];
  154. }
  155.  
  156. /* private function requestMethod() : string
  157.   {
  158.   return $_SERVER['REQUEST_METHOD'];
  159.   }
  160.  
  161.   private function requestPath(): string
  162.   {
  163.   return parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
  164.   } */
  165. }
  166.  


Plik routes.php

  1. return function (Database $database) {
  2. $uri = $_SERVER['REQUEST_URI'];
  3.  
  4. $router = new Router($database);
  5.  
  6. $router->addRoute('/', [IndexController::class, 'index']);
  7. $router->addRoute('/link.html', [IndexController::class, 'linkMethod']);
  8. $router->addRoute('/home.html', [HomeController::class, 'index']);
  9. $router->addRoute('/about.html', [AboutController::class, 'index']);
  10. $router->addRoute('/contact.html', [ContactController::class, 'index']);
  11. $router->addRoute('/regulation.html', [RegulationController::class, 'index']);
  12. $router->addRoute('/page', [PageController::class, 'index']);
  13. $router->addRoute('/page/site', [PageController::class, 'siteMethod']); // ? /page/site.html
  14. $router->addRoute('/site.html', [PageController::class, 'siteMethod']); // ?
  15. $router->addRoute('/offer.html', [PageController::class, 'offerMethod']); // /{#},offer.html
  16. $router->addRoute('/blog', [BlogController::class, 'index']);
  17. $router->addRoute('/blog/sections', [BlogController::class, 'sectionsMethod']);
  18. $router->addRoute('/blog/{#},sec,{id}.html', [BlogController::class, 'sectionMethod']);
  19. $router->addRoute('/blog/{#},art,{id}.html', [BlogController::class, 'articleMethod']);
  20.  
  21. $router->dispatch($uri);
  22. };



W pliku routes musiałem poprawić route dla artykułow bo pattern się nie zgadzał z regułami rewrite oraz linkami na stronie

  1. private function buildRouteUri(array $paths, array $params): string
  2. {
  3. $params[0] = '{#}';
  4. if (is_numeric($params[count($params) - 1])) {
  5. $params[count($params) - 1] = '{id}';
  6. }
  7. if (!empty($paths)) {
  8. $paths = '/'.implode('/', $paths). '/';
  9. } else {
  10. $paths = '/';
  11. }
  12. return $paths . implode(',', $params).'.html';
  13. }


Mała zamiana do obsługi stron typu the-best-offer,offer.html

  1. private function matchRoute(string $uri): array
  2. {
  3. $path = filter_var($uri, FILTER_SANITIZE_URL);
  4. $path = ltrim($path, '/');
  5. $path = explode("/", $path);
  6.  
  7. if (($pos = strpos($uri, '?')) !== false) {
  8. $uri = substr($uri, 0, $pos);
  9. }
  10. $paths = [];
  11. $params = [];
  12. foreach ($path as $subPath) {
  13. if (strpos($subPath, '.html') !== false) {
  14. $params = explode(',', $subPath);
  15. if (end($params) === $subPath) {
  16. $params = [];
  17. break;
  18. }
  19. $param = end($params);
  20. if (($pos = strpos($param, '.html')) !== false) {
  21. $params[count($params) - 1] = substr($param, 0, $pos);
  22. }
  23. } else {
  24. $paths[] = $subPath;
  25. }
  26.  
  27. }
  28.  
  29. /*if (strpos($uri, ',') !== false) {
  30.   $uri = substr($uri, 0, 1) . substr($uri, strpos($uri, ',') + 1);
  31.   }*/
  32.  
  33. /* $parts = explode(',', $uri);
  34.   $uri = '/' . array_pop($parts); */
  35.  
  36. foreach($path as $index => $param){
  37. if(preg_match("/{.*}/", $param)){
  38. $indexNum[] = $index;
  39. }
  40. }
  41.  
  42. //print_r($indexNum);
  43.  
  44. /*if ((strpos($uri, '-')) !== false) {
  45.   //$parts = explode('/', $uri);
  46.   //$last = array_pop($parts);
  47.   //echo ' | '. $last;
  48.  
  49.   $link = str_replace(['/', '.html'], '', $uri);
  50.   $segments = explode(',', str_replace('/', '', $link));
  51.  
  52.   foreach ($segments as $key => $value) {
  53.   if (is_numeric($value)) {
  54.   $segments[$key] = '{$}';
  55.   }
  56.   if ((strpos($value, '-')) !== false) {
  57.   $segments[$key] = '{#}';
  58.   }
  59.   }
  60.  
  61.   //$uri = '/' . $path[0] . '/' . implode(',', $segments) . '.html';
  62.   $uri = '/' . implode(',', $segments) . '.html';
  63.  
  64.   //echo $uri;
  65.   }*/
  66.  
  67. return [
  68. 'uri' => $uri,
  69. 'paths' => $paths,
  70. 'params' => $params
  71. ];
  72. }


oraz matchRoute by nie łapało niepotrzebnie /link.html jako pattern /{#}.html wtedy kiedy nie powinno wink.gif

poza tym powinno być raczej
1,user.html
a nie user,1.html skoro już taka konwencje przyjąłeś w offer smile.gif

ale jak tak ma być jak masz to wtedy jeszcze taka zmiana
  1. private function buildRouteUri(array $paths, array $params): string
  2. {
  3. if (count($params) > 2) {
  4. $params[0] = '{#}';
  5. }
  6. if (is_numeric($params[count($params) - 1])) {
  7. $params[count($params) - 1] = '{id}';
  8. }
  9. if (!empty($paths)) {
  10. $paths = '/'.implode('/', $paths). '/';
  11. } else {
  12. $paths = '/';
  13. }
  14. return $paths . implode(',', $params).'.html';
  15. }


i w routes.php

  1. return function (Database $database) {
  2. $uri = $_SERVER['REQUEST_URI'];
  3.  
  4. $router = new Router($database);
  5.  
  6. $router->addRoute('/', [IndexController::class, 'index']);
  7. $router->addRoute('/link.html', [IndexController::class, 'linkMethod']);
  8. $router->addRoute('/home.html', [HomeController::class, 'index']);
  9. $router->addRoute('/about.html', [AboutController::class, 'index']);
  10. $router->addRoute('/contact.html', [ContactController::class, 'index']);
  11. $router->addRoute('/regulation.html', [RegulationController::class, 'index']);
  12. $router->addRoute('/page', [PageController::class, 'index']);
  13. $router->addRoute('/page/site', [PageController::class, 'siteMethod']); // ? /page/site.html
  14. $router->addRoute('/site.html', [PageController::class, 'siteMethod']); // ?
  15. $router->addRoute('/offer.html', [PageController::class, 'offerMethod']); // /{#},offer.html
  16. $router->addRoute('/{#},offer.html', [PageController::class, 'offerMethod']); // /{#},offer.html
  17. $router->addRoute('/blog', [BlogController::class, 'index']);
  18. $router->addRoute('/blog/sections', [BlogController::class, 'sectionsMethod']);
  19. $router->addRoute('/blog/{#},sec,{id}.html', [BlogController::class, 'sectionMethod']);
  20. $router->addRoute('/blog/{#},art,{id}.html', [BlogController::class, 'articleMethod']);
  21. $router->addRoute('/{#},sec,{id}.html', [BlogController::class, 'sectionMethod']);
  22. $router->addRoute('/{#},art,{id}.html', [BlogController::class, 'articleMethod']);
  23. $router->addRoute('/user,{id}.html', [UserController::class, 'index']);
  24.  
  25. $router->dispatch($uri);
  26. };


Oczyścicie musisz poprawić UserController według nowej konwencji z DI

Popraw tez linki bo potem musisz mieć powielone reguły bo raz są z blog raz bez, zależy gdzie klikniesz:
  1. $router->addRoute('/blog/{#},sec,{id}.html', [BlogController::class, 'sectionMethod']);
  2. $router->addRoute('/blog/{#},art,{id}.html', [BlogController::class, 'articleMethod']);
  3. $router->addRoute('/{#},sec,{id}.html', [BlogController::class, 'sectionMethod']);
  4. $router->addRoute('/{#},art,{id}.html', [BlogController::class, 'articleMethod']);


Jeszcze małą zmiana by każdy pattern był obsługiwany
  1. private function buildRouteUri(array $paths, array $params): string
  2. {
  3. $paramsLength = count($params);
  4. if (!is_numeric($params[0]) && $paramsLength > 2) { // pattern /{#},sec,{id}.html itp
  5. $params[0] = '{#}';
  6. }
  7. if (!is_numeric($params[0]) && !is_numeric(end($params))) { // pattern /{#},offer.html
  8. $params[0] = '{#}';
  9. }
  10. if (is_numeric(end($params))) { // pattern /user,{id}.html
  11. $params[$paramsLength - 1] = '{id}';
  12. }
  13. if (!empty($paths)) {
  14. $paths = '/'.implode('/', $paths). '/';
  15. } else {
  16. $paths = '/';
  17. }
  18. return $paths . implode(',', $params) . '.html';
  19. }


oraz dispatch dla pn takiej reguły
  1. $router->addRoute('/your-website-title,site.html', [PageController::class, 'siteMethod']);

  1. public function dispatch(string $uri): void
  2. {
  3. $database = $this->database;
  4.  
  5. //$uri = $this->matchLocalhost($uri);
  6. $route = $this->matchRoute($uri);
  7. $uri = $route['uri'];
  8. $hasParams = false;
  9. if (!array_key_exists($uri, $this->routes)) {
  10. if (!empty($route['params'])) {
  11. $hasParams = true;
  12. $uri = $this->buildRouteUri($route['paths'], $route['params']);
  13. }
  14. }
  15.  
  16. if (array_key_exists($uri, $this->routes)) {
  17. $controller = $this->routes[$uri]['controller'];
  18. $method = $this->routes[$uri]['method'];
  19.  
  20. if (class_exists($controller)) {
  21. $controllerInstance = new $controller($database);
  22.  
  23. if (method_exists($controllerInstance, $method)) {
  24. if ($hasParams) {
  25. $controllerInstance->$method((int)end($route['params']));
  26. } else {
  27. $controllerInstance->$method();
  28. }
  29.  
  30. } else {
  31. throw new ExceptionHandler("No method $method on class $controller!", 500);
  32. }
  33. } else {
  34. throw new ExceptionHandler("No controller $controller!", 500);
  35. }
  36. } else {
  37. throw new ExceptionHandler("Route not found! addRoute('$uri')", 404);
  38. }
  39. }


Ten post edytował com 7.02.2024, 11:49:05
Go to the top of the page
+Quote Post
Malinaa
post 8.02.2024, 11:44:53
Post #55





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


Cytat(nospor @ 7.02.2024, 10:47:34 ) *
No ale jakies pytanie w zwiazku z tym czy tylko komunikujesz? wink.gif
No interfejsy daje sie w zasadzie wszedzie. u ciebie napewno na wszystko to co wstrzykujesz powinny byc interfejsy


Routing jest w trakcie budowy. Pierwsza wersja działa tylko na localhost po konfiguracji w kilku prostych krokach wg. instrukcji w README,
ale kiedy utworzyłem na Windows domenę dla testów okazuje się, że w domenie routing nie działa, więc muszę poprawić.

Są tu pozostałości z wersji pierwszej FW, np. /public/ .htaccess
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] tego ?url=$1 nie powinno już być (było potrzebne przy sprytnej metodzie zamiast routingu)!?
Trzeba by pliki .htaccess w /public/ i katalogu głównym zrobić do porządku, aby routing działał na serwerze zdalnym i lokalnym.

Pozbyłem się sprytnej metody (która funkcjonowała jako routing na local i zdalnym) i utworzyłem na jej miejsce routing, który coś nie bardzo chce zadziałać na zdalnym.
Jeżeli przychodzi pomysł jak poprawić wymienione elementy, prośba o info.

Usuwając 'url' będą też inne metody do poprawienia, np. class DataFlatfile -> function fileName()
poza tym przy routingu wykorzystywany był define('APP_PATH', ''); co tez nie jest za dobrze, APP_PATH to raczej miało być używane dla szablonów mailera itp.
register-created-account.html -> {page_address} ale nie w routingu.

Interfejsy. No to od czego zaczniemy? smile.gif
Przydałby się pierwszy Interfejs, no tylko od czego zacząć.

Poznałem i przeanalizowałem ho, setki interfejsów, ale żebym który napisał. Ha ha mam okazje!
Jakie to proste, ale kiedy zacząć trzeba od podstaw?!

Jako, że aplikacja funkcjonuje już w pierwszej wymaganej opcji bez menedżera pakietów, można spróbować jak sobie radzi z Composerem.
Wgrałem PHPUnit, teoretycznie zainstalowane, ale gorzej z uruchomieniem testu, a przydałby się pierwszy test np. tego naszego połączenia z bazą danych.

Zaktualizowałem cały kod na Gicie z wersji 2.1 do 2.2 z nowym DI.
W logach miałem zero błędów. Przed wysłaniem sprawdziłem kod narzędziami od jakości kodu, wynik 0 błędów

Cytat(com @ 7.02.2024, 15:09:08 ) *
No i to jest pierwszy i podstawowy błąd...


Czyli kodowanie w czystym PHP uważasz za błąd? No, mając na względzie samą komercje, to masz racje, po prostu nie opłaca się pisać kodu od nowa kiedy są gotowce.
Czas jest cenny, ale pomijając komercyjne projekty może przyjmijmy, że mamy czas, ponieważ gotowce też nie wzięły się z powietrza.
Przyznam jednak, że jestem skłonny przyznać Ci racje bardziej niżeli słowom, które napisał Tomplus, ale generalnie macie podobnie racje smile.gif

To co może zakodujemy coś interesującego w PHP?!

Cytat
Chcę pomoc ale kompletnie nie zrozumiałeś przekazu, wysłałem Ci wartościowy materiał... Uparłeś się żeby stworzyć FW bez composera...


Dziękuje za chęci. Chyba nie oczekujesz, że ogarnę materiał, nad którym pracowałeś latami w tydzień (jednocześnie pisząc kod)... Uparłem się, no ok, ale nie prawdą jest że bez Composera itp. itd.
Obiecuję Ci smile.gif, że spróbuję ogarnąć przesłane materiały, ale kiedy przeczytam wszystkie treści, które chciałbym przeczytać to pójdę na psychologię, oczywiście programować sztuczną inteligencje No na psychologii to chyba wszystko można.

Cytat
Swoją droga nie można tego nawet uruchomić...

Sorki, nie ukończyłem prac nad routingiem, działa tylko na localhost w dowolnym katalogu, na domenie sypie się.

Cytat
Fajne logo...

Do logo wziąłem mapę Polski i jej obrys pokolorowałem na kolory, które pasowały do template.
Super, że fajne, a że wyszło podobne do JetBrains to nie grzech.

Cytat
To nie jest akurat SEO friendly...

Ok

Przesłałeś poprawki routingu, Wow. Spróbuję wdrożyć przesłany kod i zobaczę jak sobie poradzi w domenie.
Raczej przy weekendzie się tym zajmę, bo dzisiaj to już ogromny komercyjny zegar mnie goni.

Ten post edytował Malinaa 8.02.2024, 13:35:54


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 8.02.2024, 12:24:30
Post #56





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




Cytat
Interfejsy. No to od czego zaczniemy? smile.gif
Przydałby się pierwszy Interfejs, no tylko od czego zacząć.

Nie rozumiem jak to od czego zaczac?

Tworzysz interfejs o nazwie np. DatabaseInterface
Twoja klasa Database implentuje ten interfejs
class Database implements DatabaseInterace


a wszedzie tam w konstruktorach czy gdzie tam miales (Database $database) to teraz masz miec (DatabaseInterface $database)

No to sa juz podstawy interfejsow.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
com
post 9.02.2024, 09:22:50
Post #57





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


Cytat(Malinaa @ 8.02.2024, 11:44:53 ) *
Czyli kodowanie w czystym PHP uważasz za błąd? No, mając na względzie samą komercje, to masz racje, po prostu nie opłaca się pisać kodu od nowa kiedy są gotowce.
Czas jest cenny, ale pomijając komercyjne projekty może przyjmijmy, że mamy czas, ponieważ gotowce też nie wzięły się z powietrza.
Przyznam jednak, że jestem skłonny przyznać Ci racje bardziej niżeli słowom, które napisał Tomplus, ale generalnie macie podobnie racje smile.gif

To co może zakodujemy coś interesującego w PHP?!



Dziękuje za chęci. Chyba nie oczekujesz, że ogarnę materiał, nad którym pracowałeś latami w tydzień (jednocześnie pisząc kod)... Uparłem się, no ok, ale nie prawdą jest że bez Composera itp. itd.
Obiecuję Ci smile.gif, że spróbuję ogarnąć przesłane materiały, ale kiedy przeczytam wszystkie treści, które chciałbym przeczytać to pójdę na psychologię, oczywiście programować sztuczną inteligencje No na psychologii to chyba wszystko można.


Sorki, nie ukończyłem prac nad routingiem, działa tylko na localhost w dowolnym katalogu, na domenie sypie się.


Do logo wziąłem mapę Polski i jej obrys pokolorowałem na kolory, które pasowały do template.
Super, że fajne, a że wyszło podobne do JetBrains to nie grzech.


Ok

Przesłałeś poprawki routingu, Wow. Spróbuję wdrożyć przesłany kod i zobaczę jak sobie poradzi w domenie.
Raczej przy weekendzie się tym zajmę, bo dzisiaj to już ogromny komercyjny zegar mnie goni.


Nie uważam za kodowanie w czystym PHP za błąd, ale mówimy o zupełnie czymś innym, na tym polegać powinno kodowanie w czystym PHP https://tsh.io/blog/how-create-framework-ag...ication-in-php/ tylko to nie ten poziom wiedzy, wspomniałem o tym wcześniej już smile.gif najpierw trzeba poznać jakiś FW by potem pisać kod niezależny od niego, pisanie w czystym PHP to nie tworzenie własnego FW, bo nawet jak dla jakiegoś projektu musisz stworzyć jakiś SharedKernel czy Core w czystym PHP to nadal nie jest to pełnoprawny FW jaki teraz próbujesz stworzyć. Po prostu powinieneś używać tego tam gdzie ma to sens smile.gif

Jasne że możemy zakodować, ale z użyciem np Symfony/Laravel, pisząc logikę jako framework-agnostic, nie DbM Framework wink.gif

Ten materiał nie jest stworzony przez mnie, polecam Ci tylko wartościowe źródła z internetu które warto przestudiować, tym bardziej biorąc się za tworzenie FW, bez tych podstaw to się nie uda dobrze smile.gif

Wystarczyło pozbyć się tej metody i działa smile.gif

Co do logo jasne ale jak coś jest zbyt podobne do siebie to jest plagiat, wiec to grzech smile.gif

Poprawiłem ale dla wersji poprzedniej, widziałem że zrobiłeś zmiany w wersji 2.2 wiec musisz sobie poprawić różnice smile.gif



Pytasz o interfejsy, bo znów nie znasz tego pojecie, przez co nie wiesz jak to przełożyć na kod, musisz najpierw poczytać potem próbować coś zastosować w własnym kodzie smile.gif Jak zrozumiesz pojecie interfejsu to łatwo przyjdzie Ci go stworzyć, np dla przypadku o którym wspomniał nospor
Go to the top of the page
+Quote Post
Malinaa
post 9.02.2024, 11:38:31
Post #58





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


Cytat(com @ 9.02.2024, 09:22:50 ) *
Nie uważam za kodowanie w czystym PHP za błąd... tylko to nie ten poziom wiedzy...


Pierwszy raz w tym poście słowo poziom jest jak najbardziej uzasadnione i tym razem bez dwóch zdań przyznam (mimo że nie powinienem) - masz racje.
Gdybym miał większą wiedzę, o której piszesz nie bawiłbym się frameworkami, a od razu zajął sztuczną inteligencją smile.gif
ale póki co pozwól, że stworzę kod, który jak rozumiem tylko dla mnie ma sens - jest mi potrzebny jak WordPress 60 procentom Internetu
(chociaż 10 lat temu ostatni raz użyłem tego kodu, bo kiedy go zobaczyłem i napisałem kilka wtyczek uznałem, że nie ma sensu iść tą "ślepą" drogą),
poza tym może zostańmy przy temacie postu frameworkach nie koniecznie autorskich wink.gif a Symfony i Laravel.
Powstaje odwieczne pytanie sensu... podążania tą drogą?

P.S. Dziękuje za przesłanie poprawek routingu, sprawdziłem śmiga w domenie,
jeszcze zajrzę jak chodzi na localhost, no i można poczytać o interfejsach itd... I nastała jasność.


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
com
post 9.02.2024, 12:19:11
Post #59





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


Cytat(Malinaa @ 9.02.2024, 11:38:31 ) *
Pierwszy raz w tym poście słowo poziom jest jak najbardziej uzasadnione i tym razem bez dwóch zdań przyznam (mimo że nie powinienem) - masz racje.
Gdybym miał większą wiedzę, o której piszesz nie bawiłbym się frameworkami, a od razu zajął sztuczną inteligencją smile.gif
ale póki co pozwól, że stworzę kod, który jak rozumiem tylko dla mnie ma sens - jest mi potrzebny jak WordPress 60 procentom Internetu
(chociaż 10 lat temu ostatni raz użyłem tego kodu, bo kiedy go zobaczyłem i napisałem kilka wtyczek uznałem, że nie ma sensu iść tą "ślepą" drogą),
poza tym może zostańmy przy temacie postu frameworkach nie koniecznie autorskich wink.gif a Symfony i Laravel.
Powstaje odwieczne pytanie sensu... podążania tą drogą?

P.S. Dziękuje za przesłanie poprawek routingu, sprawdziłem śmiga w domenie,
jeszcze zajrzę jak chodzi na localhost, no i można poczytać o interfejsach itd... I nastała jasność.


Żeby dziś znaleźć prace trzeba jeden z nich znać, a zakładam że kiedyś będziesz chciał pracować jako programista, skoro próbujesz się tego uczyć? FW to tylko narzędzie, jak młotek do wbijania gwoździ, jak nie będziesz potrafił jego obsługiwać to zrobisz sobie krzywdę, z FW jest tak samo. Jak już potrafisz go używać to wtedy czas na gwoździarkę i tu jest tak samo, poznajesz nowe rzeczy, zaczynasz pisać kod zgodny z ideą DDD, stajesz się framework-agnostic itp smile.gif

Super że działa, ciesze się i fajnie że zaczynasz słuchać o tym żeby poczytać smile.gif
Go to the top of the page
+Quote Post
Malinaa
post 12.02.2024, 00:27:30
Post #60





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

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


Cytat(nospor @ 8.02.2024, 12:24:30 ) *
Tworzysz interfejs o nazwie np. DatabaseInterface
Twoja klasa Database implentuje ten interfejs
class Database implements DatabaseInterace


Ogólnie jak działają interfejsy to wiem, w praktyce wyszło o czym nie wiedziałem, ale już też zrobione.
Interfejsy utworzone. Coś chyba jeszcze jest nie tak, ponieważ w np.

DatabaseInterface

public function queryExecute(string $query, ?array $params = [], bool $reference = false): bool;

kiedy zmienię na bool $reference bez wartości w Visualu pojawia się chmurka: Expected 3 arguments, Found 2.

Aplikacja działa ok, ale Visual coś pokazuje nie ok?


Cytat(com @ 9.02.2024, 12:19:11 ) *
Super że działa, ciesze się i fajnie że zaczynasz słuchać o tym żeby poczytać smile.gif

O interfejsach poczytane, chociaż powtarzają się w Necie te same podstawy i za wiele poza tym o czym napisał nospor się nie dowiedziałem, ale zawsze to coś nowego.

Routing jeszcze nie daje spokoju, ponieważ linki nie są SEO friendly, np. present-eusmod-grvd-lbero-luctus-ns-fermentum-nec,art,5.html
Jaka byłaby najlepsza opcja z końcówką .html, może /art/5/present-eusmod-grvd-lbero-luctus-ns-fermentum-nec.html
ale ze slashami w adresie i prawidłową ścieżką był zawsze kłopot w przeglądarce ?

Ten post edytował Malinaa 12.02.2024, 00:53:00


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post

5 Stron V  < 1 2 3 4 5 >
Reply to this topicStart new topic
25 Użytkowników czyta ten temat (25 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 17:02