Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> DbM Framework - Autorska aplikacja frameworka opartego na wzorcu MVC
Malinaa
post 20.12.2023, 21:40:29
Post #1





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

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


Witajcie,
miałem chwilę i usiadłem do autorskiego frameworka opartego na wzorcu MVC.
Chciałbym go dopracować, utworzyć wersje stabilną.

Kod frameworka jest dostępny pod adresem:
https://github.com/artimman/dbmframework

Zakończyłem pierwszy test aplikacji na serwerze zdalnym - powodzeniem.
Wydaje się, że już jest całkiem Ok i ciekawe, czy ktoś się ze mną zgodzi?


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
com
post 7.02.2024, 15:09:08
Post #2





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

Posty w temacie
- Malinaa   DbM Framework - Autorska aplikacja frameworka opartego na wzorcu MVC   20.12.2023, 21:40:29
- - nospor   ok, to na plus: + znajomosc jako tako klas + uzywa...   21.12.2023, 09:42:45
- - Malinaa   Dzięki bardzo za sprawdzenie kodu. Narzędzia były...   21.12.2023, 11:36:53
- - nospor   phpstan sprawdza innego rodzaju rzeczy wiec poleca...   21.12.2023, 11:52:58
- - Malinaa   KodNa tym to wlasnie polega a ty tego nie rozumies...   21.12.2023, 12:51:47
- - nospor   A ,teraz kumam do czego piles piszac te "rado...   21.12.2023, 12:59:22
- - netir   Jak zobaczyłem w model raw query bez bindowania to...   26.12.2023, 16:02:56
- - Malinaa   Cytat(nospor @ 21.12.2023, 09:42:45 )...   28.12.2023, 16:04:08
- - nospor   ad1) Nie widzi klasy App\Config\Constant...   29.12.2023, 22:02:12
- - Malinaa   1. Jak sprawić, aby widział klasę App\Config...   8.01.2024, 09:20:34
- - nospor   ad1 Klasy maja byc widoczne w autoloading i wtedy ...   8.01.2024, 10:11:34
- - Malinaa   1. Klasa przeniesiona i widoczna - całość bez błęd...   8.01.2024, 13:28:12
- - nospor   Cytatale to powinno być po prostu super dobrze. Z ...   8.01.2024, 14:27:04
- - Malinaa   CytatZ jednej strony nalegasz na super dobrze, a z...   9.01.2024, 13:01:28
- - nospor   NIe wiem o co ci chodzi z zmiennymi globalnymi w S...   9.01.2024, 14:16:56
- - Malinaa   Z protected static $connect to takie zakombin...   9.01.2024, 20:07:04
- - nospor   CytatZ protected static $connect to takie zak...   10.01.2024, 09:55:45
- - viking   https://github.com/artimman/dbmframework/bl...conf...   10.01.2024, 12:22:37
- - Malinaa   Cytat(nospor @ 10.01.2024, 09:55:45 )...   11.01.2024, 11:55:06
|- - viking   Cytat(Malinaa @ 11.01.2024, 11:55:06 ...   11.01.2024, 12:39:55
- - nospor   CytatPodejście pragmatyczne w programowaniu, brzmi...   11.01.2024, 12:03:10
- - Malinaa   Cytat(nospor @ 11.01.2024, 12:03:10 )...   11.01.2024, 12:36:08
- - Malinaa   Cytat(viking @ 11.01.2024, 12:39:55 )...   11.01.2024, 13:19:54
- - viking   Przeczytać przeczytałem ale napisałem dlaczego to ...   11.01.2024, 13:33:16
- - Malinaa   Rozumiem, mimo to chciałbym opracować mechanizm (w...   11.01.2024, 14:01:52
- - viking   To na początek ja bym spróbował ogarnąć temat z kt...   11.01.2024, 14:32:23
- - Malinaa   Wydawało mi się, że takie powszechne rozwiązanie j...   11.01.2024, 22:42:39
- - com   Malinaa musisz sobie postawić zasadnicze pytanie p...   18.01.2024, 14:49:35
- - Malinaa   Cytat(viking @ 11.01.2024, 14:32:23 )...   18.01.2024, 21:38:13
|- - Salvation   Cytat(Malinaa @ 18.01.2024, 21:38:13 ...   23.01.2024, 10:21:20
- - Tomplus   Ja osobiście rozumiem dlaczego ktoś tworzy i stosu...   24.01.2024, 09:31:42
- - Malinaa   Mam chwilę, więc usiadłem do projektu. Dependency ...   27.01.2024, 20:29:21
- - viking   Kontroler to generalnie nie jest miejsce na wciska...   29.01.2024, 11:42:03
- - Malinaa   Cytat(viking @ 29.01.2024, 11:42:03 )...   2.02.2024, 22:57:21
- - viking   Musisz się w końcu zdecydować. Robisz to żeby się ...   3.02.2024, 15:34:29
- - Malinaa   Cytat(viking @ 3.02.2024, 15:34:29 ) ...   3.02.2024, 21:54:10
- - viking   Wstrzykiwanie zależności a menedżer (albo service ...   4.02.2024, 06:53:24
- - Malinaa   Kilka konkretnych informacji się pojawiło. Dzięki....   4.02.2024, 10:05:54
- - nospor   skoro tak bardzo nie chcesz uzywac DI co ci zaprop...   4.02.2024, 20:07:12
- - Malinaa   Cytat(nospor @ 4.02.2024, 20:07:12 ) ...   5.02.2024, 22:59:20
- - nospor   Niby sluchasz co sie do ciebie mowi ale jednoczesn...   6.02.2024, 09:31:42
- - Malinaa   Jeżeli słucham to jak mogę nie słuchać. Rozumiem, ...   6.02.2024, 10:37:49
- - nospor   No masz dalej dodawac w dol te $database ...   6.02.2024, 11:14:14
- - Malinaa   Dotąd już miałem $router = new Router($d...   6.02.2024, 11:48:20
- - nospor   zajebisty opis problemu: bo sie sypalo.. Jak masz ...   6.02.2024, 12:14:57
- - Malinaa   Dobrze, że pokazałeś palcem, bo nie mogłem tego zn...   6.02.2024, 15:18:56
- - nospor   Cytatale przy zaktualizowanym kodzie w index.php j...   6.02.2024, 15:26:07
- - Malinaa   No, aż mi głupio, ale jeszcze nie mogę uwierzyć, ż...   6.02.2024, 16:22:25
- - nospor   nie aż dochodzę do modelu BlogModel public functi...   6.02.2024, 16:29:49
- - Malinaa   Po zmianie w __construct() Message: Cannot use ...   6.02.2024, 16:57:05
- - nospor   sorki, mialem na mysli kontrollery a nie model. c...   6.02.2024, 17:22:18
- - Malinaa   Aha, czyli dodać tylko linijkę: parent::__construc...   6.02.2024, 18:50:18
- - nospor   CytatOk, po zmianie został jeszcze routing, takie ...   7.02.2024, 10:47:34
- - com   RE: DbM Framework - Autorska aplikacja frameworka opartego na wzorcu MVC   7.02.2024, 15:09:08
- - Malinaa   Cytat(nospor @ 7.02.2024, 10:47:34 ) ...   8.02.2024, 11:44:53
- - nospor   CytatInterfejsy. No to od czego zaczniemy? smile.g...   8.02.2024, 12:24:30
- - com   Cytat(Malinaa @ 8.02.2024, 11:44:53 )...   9.02.2024, 09:22:50
- - Malinaa   Cytat(com @ 9.02.2024, 09:22:50 ) Nie...   9.02.2024, 11:38:31
- - com   Cytat(Malinaa @ 9.02.2024, 11:38:31 )...   9.02.2024, 12:19:11
- - Malinaa   Cytat(nospor @ 8.02.2024, 12:24:30 ) ...   12.02.2024, 00:27:30
|- - Salvation   Cytat(Malinaa @ 12.02.2024, 00:27:30 ...   12.02.2024, 09:24:26
- - Malinaa   Cytat(Salvation @ 12.02.2024, 09:24:2...   12.02.2024, 20:27:50
|- - Salvation   Cytat(Malinaa @ 12.02.2024, 20:27:50 ...   13.02.2024, 11:34:58
|- - Salvation   Cytat(Malinaa @ 13.02.2024, 20:46:10 ...   14.02.2024, 15:21:12
- - Malinaa   Cytat(Salvation @ 13.02.2024, 11:34:5...   13.02.2024, 20:46:10
- - viking   Zaczynając od php 8.0 wszystkie parametry required...   14.02.2024, 09:24:11
- - Malinaa   Cytat(viking @ 14.02.2024, 09:24:11 )...   17.02.2024, 00:06:00
- - nospor   CytatJak to zrobić, aby było ok dla szablonów, w k...   17.02.2024, 11:21:45
- - Malinaa   Tak przerabialiśmy i wiem jak mógłbym to zrobić dl...   17.02.2024, 20:09:45
- - nospor   Jak ty sobei lubisz komplikowac prace I co z tego ...   18.02.2024, 09:13:36
- - Malinaa   Tak jakoś mam, że i tu gdzie można by przyjąć, że ...   18.02.2024, 20:21:15
- - nospor   CytatJeśli w funkcji dam DatabaseInterface $d...   18.02.2024, 21:30:08
- - Malinaa   Używam, choć przyszedł mi na myśl inny system szab...   19.02.2024, 20:34:23
- - nospor   ad2) bez znaczenia Na pozostale dwa juz nie wiem...   20.02.2024, 09:57:23
- - Malinaa   2. Ok i super. 1. Ach, dasz radę. Ten template je...   20.02.2024, 22:34:50
- - nospor   CytatNie jest tak jak piszesz, albo coś nie kumam....   21.02.2024, 09:18:19
- - Malinaa   Tak chcę, aby było bezbłędnie. Czy będzie perfekcy...   24.02.2024, 23:15:43
- - nospor   CytatSprawdzam jak działa templates/base.phtml i y...   25.02.2024, 20:33:19
- - Malinaa   Gadanie, kumasz. Chociaż szczęście każdy rozumie n...   26.02.2024, 00:48:26
- - nospor   Cytatwyskakuje błąd Juz ci kiedys pisalem co masz ...   26.02.2024, 09:32:34
- - Malinaa   Pamięć dobra, ale krótka o czym kiedyś pisałeś co ...   28.02.2024, 18:51:51
- - nospor   CytatSorki, że dopytuje o takie szczegóły jak PHP_...   29.02.2024, 12:03:02
- - Malinaa   Użycie PHP_EOL w TemplateEngine Kodfile_put_conte...   29.02.2024, 21:47:31
- - nospor   Cytat$this->translation = json_encode(...   1.03.2024, 09:40:08
- - Malinaa   Chyba spanikowałem, na szybkości dodałem json_enco...   1.03.2024, 10:53:30
- - nospor   CytatNapisałeś "dane trzymaj w obiekcie...   1.03.2024, 10:57:07
- - Malinaa   Przy sprzątaniu i optymalizacji natrafiłem na kod ...   16.03.2024, 22:40:47
- - nospor   metoda trans nadal za kazdym razem gdy jest wywoly...   19.03.2024, 10:37:19
- - Malinaa   Metoda trans() w którym pliku/klasie? W class Tra...   20.03.2024, 20:59:12
- - nospor   Tak, wlasnie o cos takiego mi chodzilo public fun...   21.03.2024, 09:06:40
- - Malinaa   Konstruktor, o który chodziło to już był. Obiekt ...   21.03.2024, 11:21:16
- - nospor   CytatKonstruktor, o który chodziło to już był. Mi ...   21.03.2024, 11:55:00
- - Malinaa   Ok, rozumiem o czym mówisz, kilka tygodni temu zos...   21.03.2024, 13:39:53
- - nospor   CytatJeśli tak to nie rozumiem, dlaczego aż od ind...   21.03.2024, 17:03:33
- - Malinaa   CytatGeneralnei chodzi o to by nie tworzyc tego sa...   27.03.2024, 15:09:11


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

 



RSS Wersja Lo-Fi Aktualny czas: 24.05.2024 - 05:45