Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

136 Stron V   1 2 3 > » 

com
Napisane: Dzisiaj, 09:21





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

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

zacznijmy od tego że skoro to było dawno temu to zapewne używasz tam modułu mysql zamiast mysqli/PDO, od PHP 7 ten moduł już nie jest dostępny smile.gif
  Forum: Przedszkole · Podgląd postu: #1262622 · Odpowiedzi: 4 · Wyświetleń: 75

com
Napisane: 9.02.2024, 12:19:11





Grupa: Zarejestrowani
Postów: 3 033
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
  Forum: Oceny · Podgląd postu: #1262347 · Odpowiedzi: 94 · Wyświetleń: 5 935

com
Napisane: 9.02.2024, 09:22:50





Grupa: Zarejestrowani
Postów: 3 033
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
  Forum: Oceny · Podgląd postu: #1262344 · Odpowiedzi: 94 · Wyświetleń: 5 935

com
Napisane: 7.02.2024, 15:09:08





Grupa: Zarejestrowani
Postów: 3 033
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. }
  Forum: Oceny · Podgląd postu: #1262329 · Odpowiedzi: 94 · Wyświetleń: 5 935

com
Napisane: 18.01.2024, 14:49:35





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

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

Malinaa musisz sobie postawić zasadnicze pytanie poco to tworzysz? Kiedy będziesz szukał potencjalnej pracy kiedyś zakładam na pewno to nastąpi zapytają Cie jakie frameworki znasz, nie powiesz im przecież, że tylko "DbM Framework" bo nikt tego poza Tobą nie zna. Dziś startując na rynku pracy większość ofert wymaga od pracownika znajomości jednego z fw: Symfony, Laravel itp. Jakaś bazę wiedzy już zebrałeś i większość z nas pisała kiedyś własny framework albo swojego cmsa, bo kiedyś to było modne, czasy się zmieniły, dziś nie ma to już sensu, a tworzenie takiego czegoś często uczy Cie od razu z automatu złych praktyk, bo nie masz żadnego mentora który wytyka błędy, nospor i viking dotknęli tylko szczytu góry lodowej przeglądając to w mniej czy bardziej dokładny sposób, ale dziś to nie wystarczy. Podstawami do nauki PHP od zawsze była dokumentacja, ale oprócz tego przez lata wypracowane zostały pewne standardy oznaczone jako PSR https://www.php-fig.org/psr/ i jeśli tworzysz oprogramowanie i się do nich nie stosujesz to od początku popełniasz błąd, który w próżniejszym czasie będzie Cie kosztował nauka złych nawyków których nie będziesz się w łatwy sposób w stanie pozbyć. Polecałbym poczytać np coś takiego https://phptherightway.com/ i zamiast przepalać własne godziny na tworzenie własnego frameworka bez wiedzy i doświadczenia, skupić się na próbie zrozumienia jak działa jeden z powszechnych i dostępnych fw na rynku. A jeśli masz ambicja do tego żeby stworzyć własnego CMSa jako taki pet project dla samorozwoju, to właśnie oprzyj go na takim Symfony czy Laravel, dzięki temu uda Ci się zrozumieć jak to działa i nie będziesz uczył się złych praktyk, a poznasz wiele dobrych praktyk, szczególnie jeśli chodzi o Symfony to nie ma tam antywzorców itp Troche gorzej jest w Laravel, oczywiście da się je wyeliminować ale to trzeba być już na wyższym poziomie wtajemniczenia, niemniej jednak nawet użycie Laravel będzie miało równie wymierne korzyści(po prostu Laravel posiada/posiadał takie anty wzorce jak Active Record(można go zastąpić przez jakiś Data Mapper np Doctrine) oraz nadmiernie wykorzystywał wzorzec Fasady, ale pozostałe kwestie są tam na najwyższym poziomie). Do nauki polecam https://symfonycasts.com/ lub https://laracasts.com/. Na przyszłość jak już tworzysz własny Fw to jest coś takiego jak https://symfony.com/doc/current/create_framework/index.html i należało by się zastosować do tych zasad opisanych tam żeby to miało jakikolwiek sens smile.gif

Kiedy już opanujesz podstawy wybranego przez siebie fw, bez problemu jeśli trafisz na jakiś problem przy tworzeniu tego własnego CMSa znajdziesz tutaj na forum i na innych masę osób które znają ten fw na wylot i beda w stanie Ci pomoc, nakierować itp, nikt tego nie napisze za Ciebie ale to będzie dla Ciebie merytorycznie znacznie korzystniejsze niż ocenianie wielu godzin twojej pracy nad "DbM Framework", bo jakby się defakto nad tym mocno zastanowić i zastosować do PSR i innych dobrych praktyk to ten kod cały by trzeba napisać na nowo smile.gif Nie chcę Cie zrazić i nie odbierz tego jako hejt, to normalne kiedy osoba która się uczy zabiera się za tworzenie FW/CMS, a na jej kod spojrzy ktoś z dużo większym stażem, tez kiedyś zaczynałem i popełniłem taki sam projekt, zarówno robiłem własnego CMSa jak i fw w swojej karierze(ale dopiero pierwszy komercyjny projekt zrobiony w Symfony, nawet po latach jak do niego zajrzałem, to mimo iż dziś posiadam o wiele więcej doświadczenia niż wtedy, ale budowałem go zgodnie z dokumentacja na SynfonyCast wtedy defa kto nazywało się jeszcze KnpUniversity, to jak patrze na ten kod po latach to on nadal nie wymaga zmian, no możne poza tym że dziś bym dodał typy zmiennych wszędzie gdzie się tylko da, za to jak zaglądam do swojego cmsa/fw to widzę jak mało jeszcze wtedy znałem te technologie), ale to było ponad 15 lat temu, dziś bym się tego nie podjął a od początku po przestudiowaniu dokumentacji dla PHP zacząłbym eksperymenty pewnie z Symfony smile.gif Tobie również życzę by "DbM Framework" pozostało historia do której wrócisz za 10 lat i zobaczysz jaki przeskok w swojej wiedzy za ten czas zyskałeś i żeby pierwszy twój projekt w fw jaki sobie wybierzesz nadal za te 10 lat cieszył oko, a nawet jakby było tam cos do poprawy to żebyś mimo wszytko dostrzegał to jaka przepaść będzie dzielić cms na fw "DbM Framework" a na ogólnodostępnym fw, ale to myśle już teraz zauważysz jeśli spróbujesz pójść w te stronę smile.gif Bo jeszcze przed Tobą poznanie czym jest DDD i tworzenie kody który będzie Framework-agnostic, bo fw to jest taki Ninja Master toolbox(scyzoryk, pila, klucze w jednym) i jest on w miarę uniwersalny ale on powinien być tylko jednym z narzędzi ułatwiającym prace tak jak IDE jest dla pisania kodu i powinien pomagać a nie nas ograniczać smile.gif ale to gdzieś tam daleko w przyszłości zrozumiesz o czym mówię smile.gif

PS na koniec dodam jeszcze że w protokole HTTP nie da odzwierciedlić wzorca MVC, tutaj tworzona jest tylko jedna z wariacji bazująca na tej idei, ale nigdy nie będzie to pełnoprawny MVC, wiec w sumie powoli przestaje się tak nawet nazywać te fw(Jeśli przeczytasz o Symfony na nie polskiej stronie Wikipiedii, bo tam nikt tego nie redaguje to nie ma już nic wzmianki o MVC) wink.gif
  Forum: Oceny · Podgląd postu: #1262269 · Odpowiedzi: 94 · Wyświetleń: 5 935

com
Napisane: 30.01.2023, 18:35:41





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

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

po pierwsze wklej ten kod w odpowiednie tagi, po drugie
const popup = document.getElementById("popup2"); itp powinny być w tym momencie unikalne smile.gif
  Forum: JavaScript · Podgląd postu: #1261035 · Odpowiedzi: 2 · Wyświetleń: 886

com
Napisane: 30.01.2023, 09:29:26





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

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

od wersji jest composer.lock
  Forum: Przedszkole · Podgląd postu: #1261021 · Odpowiedzi: 6 · Wyświetleń: 500

com
Napisane: 26.01.2023, 22:25:15





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

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

Masz false bo
  1. $cities = $result->fetch();


zwrócił błąd, sprawdź sobie jaki wink.gif
  Forum: Przedszkole · Podgląd postu: #1261000 · Odpowiedzi: 3 · Wyświetleń: 417

com
Napisane: 27.01.2023, 13:13:56





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

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

@Salvation nie musisz mi tłumaczyć czym jest Docker, wiem używam. " Windows ma już WSL 2" ma ale nie zawsze to działa tak jak natywne(zdarzają się problemy) wink.gif
@nospor w tym samym czasie to nie ale przełączasz się miedzy wersjami jednym klikiem wink.gif ewentualnie stawiasz kilka obok siebie na różnych portach, ale to już wtedy lepiej tego Dockera wink.gif tylko kto tak pracuje tongue.gif
  Forum: Przedszkole · Podgląd postu: #1261010 · Odpowiedzi: 9 · Wyświetleń: 476

com
Napisane: 27.01.2023, 11:10:48





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

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

@nospor jasne że działa dlatego napisałem "lepiej" wink.gif

lepsze może tak czy wygodniejsze zależy co się potrzebuje biggrin.gif

w laragon możesz wymienić PHP, nginx/apache na inna wersje, sam generuje vhosty i certy sh, ma klienta do db, odpalisz redisa i memcached, mongodb , ustawisz mailera biggrin.gif całkiem sprytne narzędzie ;D
  Forum: Przedszkole · Podgląd postu: #1261007 · Odpowiedzi: 9 · Wyświetleń: 476

com
Napisane: 27.01.2023, 10:11:16





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

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

@Salvation jasne choć do tego lepiej mieć wtedy linuxa i to trochę jednak coś innego niż autor pyta wink.gif
  Forum: Przedszkole · Podgląd postu: #1261005 · Odpowiedzi: 9 · Wyświetleń: 476

com
Napisane: 26.01.2023, 19:41:57





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

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

laragon wink.gif
  Forum: Przedszkole · Podgląd postu: #1260994 · Odpowiedzi: 9 · Wyświetleń: 476

com
Napisane: 26.01.2023, 19:47:09





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

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

inna opcja rozliczenia niż b2b nie wchodzi w grę?
  Forum: Praca oferowana (Job offers) · Podgląd postu: #1260995 · Odpowiedzi: 2 · Wyświetleń: 504

com
Napisane: 26.01.2023, 19:49:58





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

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

@lukaszzgz jak chcesz taki stary to byś musiał starej wersji zainstalować, ale to jest be sensu uczyć się na czymś takim wink.gif
  Forum: Frameworki · Podgląd postu: #1260996 · Odpowiedzi: 4 · Wyświetleń: 1 051

com
Napisane: 18.01.2023, 17:32:20





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

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

dziś to już https://www.php-fig.org/per/coding-style/ nie PSR-12 wink.gif
  Forum: Przedszkole · Podgląd postu: #1260920 · Odpowiedzi: 4 · Wyświetleń: 313

com
Napisane: 18.01.2023, 17:08:26





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

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

prosty sposób w bloku catch zrob mechanizm logowania do loga i tyle wink.gif
  Forum: PHP · Podgląd postu: #1260919 · Odpowiedzi: 2 · Wyświetleń: 396

com
Napisane: 18.01.2023, 17:51:22





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

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

hasło klucz browser fingerprint i device fingerprint
  Forum: PHP · Podgląd postu: #1260921 · Odpowiedzi: 3 · Wyświetleń: 450

com
Napisane: 18.01.2023, 17:55:17





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

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

Te zadanie jest bez sensu, tak sie nie powinno towrzyc kodu jak narzucili wink.gif
  Forum: Przedszkole · Podgląd postu: #1260922 · Odpowiedzi: 8 · Wyświetleń: 261

com
Napisane: 8.11.2022, 09:50:21





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

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

Przede wszystkim to utf-8 bez bom, ale jak miałeś inne kodowanie to trzeba dać konwertuj a nie ustaw bo to nie zadziała w ten sposób smile.gif
  Forum: PHP · Podgląd postu: #1260147 · Odpowiedzi: 5 · Wyświetleń: 610

com
Napisane: 26.10.2022, 00:27:55





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

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

https://symfony.com/doc/4.4/setup/upgrade_major.html
To na pewno jakaś sugestia wink.gif

Myślę że nie ma prostej odpowiedzi na to pytanie bo to dużo zależy od tego jakiej jakości masz obecny kod wink.gif Na pewno się pojawi pare zmian i tak 4.4 niedługo kończy swój LTS wink.gif

https://tomasvotruba.com/blog/2019/09/09/ho...o-5-in-25-days/

Pewnie Rector jest w stanie pomoc wink.gif

Z wersji 6.X będzie na pewno łatwiej, w późniejszym czasie ale to nie LTS smile.gif
  Forum: Frameworki · Podgląd postu: #1260078 · Odpowiedzi: 4 · Wyświetleń: 1 004

com
Napisane: 25.10.2022, 20:41:39





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

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

Po pierwsze używaj bbcodes, po drugie skoro:
Cytat
Symfony wersja 4.4


To czemu wgl przeglądasz dokumentacje dla 5.4 i więcej? smile.gif

>W 4.4 nie ma EnumTypes wcale wink.gif
  Forum: Frameworki · Podgląd postu: #1260074 · Odpowiedzi: 9 · Wyświetleń: 1 292

com
Napisane: 13.10.2022, 11:53:13





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

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

Zainstaluj sobie tego composera globalnie na serwerze by robić to tak jak napisali bo tak tylko sobie utrudniasz życie, tutaj opisane jak
https://getcomposer.org/doc/00-intro.md#globally smile.gif
  Forum: Przedszkole · Podgląd postu: #1259969 · Odpowiedzi: 14 · Wyświetleń: 430

com
Napisane: 12.10.2022, 14:09:51





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

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

Cytat
Composer (version 2.2.18) successfully installed to: /home/users/host/public_html/domena/composer/composer.phar
Use it: php public_html/domena/composer/composer.phar


Czemu nie czytasz co Ci napisał?

  1. php public_html/domena/composer/composer.phar install


a jak chcesz composer install to musisz sobie to przerzucić w odpowiednie miejsce
https://getcomposer.org/doc/00-intro.md#globally
  Forum: Przedszkole · Podgląd postu: #1259960 · Odpowiedzi: 14 · Wyświetleń: 430

com
Napisane: 13.10.2022, 11:55:27





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

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

przyszedłeś tu po pomoc czy po obrażać innych?
  Forum: Przedszkole · Podgląd postu: #1259970 · Odpowiedzi: 11 · Wyświetleń: 662

com
Napisane: 13.10.2022, 12:00:30





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

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

@malaww zgłoś błąd, argumetujac to tym co opisał @Tomplus wink.gif
  Forum: Przedszkole · Podgląd postu: #1259971 · Odpowiedzi: 4 · Wyświetleń: 1 360

136 Stron V   1 2 3 > » 

New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 19:32