Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

5 Stron V  « < 3 4 5  
Reply to this topicStart new topic
> DbM Framework - Autorska aplikacja frameworka opartego na wzorcu MVC
Malinaa
post 28.02.2024, 18:51:51
Post #81





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

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


Pamięć dobra, ale krótka o czym kiedyś pisałeś co zrobić gdy wyskakuje błąd. Takie podsumowanie, że już nie kumam.
Wolałbym się nad tym nie rozwodzić, but life is brutal and full of zasadzkas and sometimes kopas w dupas... tylko zgredzi nic nie kumają that there are beautiful moments in life, so let's enjoy life before old age hunt down you

Funkcje w szablonach mogą być jeszcze z wersji pierwszej, sprzed tego o czym pisałeś. Potem zobaczę do tych funkcji, przy optymalizacji i spróbuje według nowych wytycznych poprawić powtórki.
Na ten czas poprawiałem TODO w kodzie i wyszły te szablony do zrobienia.

Problem nie jest w samym błędzie, to można poprawić, ale poprawianie tego błędu nie wiele daje, gdyż funkcją preg_replace() której dotyczy błąd nie rozwiąże problemu rozszerzenia szablonów o dodatkowe funkcje, funkcjonalność.
Raczej przydałby się kolejny mechanizm dla takiego rozszerzenia. Chyba, że wystarczy poprawić preg_replace(),, dodać jakąś pętle itp. Wystarczy jedna sprytna metoda, nie potrzebnie tu kombinuje, bo nie wiem jak dopracować ten silnik szablonów?

Z tego co poczytałem $this w templates to nie kłopot, więc decyduje się na takie rozwiązanie, gdzie this/y będą tak <?= $this->trans('lang') ?>
https://github.com/artimman/dbmframework/bl...ates/base.phtml
i powinno być Ok, lepsze niż kombinacje z preg_replace(), poza tym w znacznikach <?php ?> zawsze zadziała, natomiast kompilowane przez funkcje to już zależy na co trafi.

Dzięki dodaniu klasy TemplateEngine rozwiązany został problem w pliku template.php use Dbm\Interfaces\DatabaseInterface
oraz aplikacja rozbudowana została o takie mechanizmy jak kompilator szablonów i cache.

Jeżeli teraz szablony są Ok pozostały drobne pytania (oznaczone TODO)
1. private static $blocks = array(); Zastanawiałem się nad static array, ale powinno być Ok?
2. w Necie wyczytałem, że nie powinno się używać PHP_EOL należy użyć "/n"? Przy formatowaniu kodu HTML zakładam, że lepiej jest użyć PHP_EOL, wówczas powinno wykonać to samo w każdym systemie.

P.S. Usunąłem kilka powtórek else, które wyłapałem, że są do poprawienia.
Już sobie przypominam kiedy wyskakuje błąd, to wrzucić kod i komunikat błędu. Ok, ale tak tylko sobie "głośno" myślałem co z tym zrobić i problem rozwiązany.
Sorki, że dopytuje o takie szczegóły jak PHP_EOL, ale w Sieci jak taka ilość różnych informacji, że czasem trudno rozróżnić co jest dobre, a co nie.

Ten post edytował Malinaa 28.02.2024, 19:20:09


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 29.02.2024, 12:03:02
Post #82





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




Cytat
Sorki, że dopytuje o takie szczegóły jak PHP_EOL, ale w Sieci jak taka ilość różnych informacji, że czasem trudno rozróżnić co jest dobre, a co nie.

A gdzie ty chcesz uzywac tego PHP_EOL? Bo ciezko mi sobie wyobrazic gdzie ci jest potrzebne

INna sprawa ze nie zastanawiasz sie nad kodem ktory piszesz. W wielu miejscach masz

<?= trans('charset') ?>
czyli wywolujesz funkcje trans() petryliard razy. A co robi funkcja trans?
za kazdym razem robi
require($pathTranslation);
no tak nie mozna.... Wczytaj plik raz, jego przerobine dane trzymaj w obiekcie i korzystaj z nich a nie za kazdym razem przerabiasz ten sam proces. A require to tylko jezna z nieicznych rzeczy ktore bez sensu powtarzac odpalajac trans()


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

"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 29.02.2024, 21:47:31
Post #83





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

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


Użycie PHP_EOL w TemplateEngine

Kod
file_put_contents($cachedFile, '<?php class_exists(\'' . __CLASS__ . '\') or exit; ?>' . PHP_EOL . $code);


Kolejny kod, w którym chcę używać zamiast "\n", metody w TemplateFeature, np.

public function htmlUser(
...
$html .= '<img class="dbm-img-profile rounded-circle" src="' . $this->path() . 'images/avatar/' . $avatar . '">' . "\n"; // PHP_EOL powinno być tu lepsze, ponieważ wykona to samo w każdym systemie
...
)

i podobne metody z htmlem.

Faktycznie <?= trans('charset') ?> nie powinno tak być.

Najszybciej co przyszło mi na myśl:

Kod
class Translation implements TranslationInterface
{
    private $translation;

    public function __construct()
    {
        $this->translation = json_encode($this->translation());
    }

    /* Language translation */
    public function trans(string $key, array $data = null, array $sprint = null): string
    {
        $trans = json_decode($this->translation, true);
    }
}


Czy ten kod rozwiązuje problem, czy można lepiej?

Pewnie tak jest, że piszę trochę z "automatu", zwykle dopiero przy drugim i kolejnym podejściu do metody zastanawiam się nad nią pod względem optymalizacji.
Tak z miejsca optymalizować kod to chyba jeszcze nie na tym poziomie, ale fajnie byłoby od razu to widzieć.

Przy okazji będąc w class Translation poprawiłem else itp. o czym wcześniej pisałeś, chociaż czy klasa jest już optymalna?
Pewnie można lepiej, ale niestety może przy trzecim podejściu zobaczę więcej i będzie super optymalnie.


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 1.03.2024, 09:40:08
Post #84





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




Cytat
$this->translation = json_encode($this->translation());
$trans = json_decode($this->translation, true);

Czyli robisz json_encode raz, tylko po to, by potem za kazdym razem w metodzie trans petryliard razy robic json_decode. I teraz wytlumacz mi prosze, bo naprawde nie kumam, czemu nie mozesz tej tablicy przechowywac jako tablce, tylko musisz ja kodowac a potem dekodowac za kazdym razem. Jaka logika temu przyswiecala? Bo jakas na pewno musiala prawda?

Cytat
$html .= '<img class="dbm-img-profile rounded-circle" src="' . $this->path() . 'images/avatar/' . $avatar . '">' . "\n"; // PHP_EOL powinno być tu lepsze, ponieważ wykona to samo w każdym systemie

Przeciez tu generujesz kod html... tu w ogole nie trzeba nowej linii od tego zacznijmy. A nawet jesli by byla to co z tego ze serwer ci wygeneruje nowa linie wg systemu serwera, skoro klient ktory dostanie kod html moze byc na milionie innych systemow. wal \n i sobie glowy nie zawracaj

Cytat
file_put_contents($cachedFile, '<?php class_exists(\'' . __CLASS__ . '\') or exit; ?>' . PHP_EOL . $code);

To samo tutaj, to sa pliki cache, co ci zalezy czy bedzie tam \n czy PHP_EOL? TO nic nie zalatwia

Cytat
Przy okazji będąc w class Translation poprawiłem else itp. o czym wcześniej pisałeś, chociaż czy klasa jest już optymalna?

Nie wiem gdzie to poprawiles, na githubie zmian nie widze


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

"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 1.03.2024, 10:53:30
Post #85





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

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


Chyba spanikowałem, na szybkości dodałem json_encode() kombinując z obiektem (kolejna kombinacja pod górkę, bo logiki w tym nie widzę).
Napisałeś "dane trzymaj w obiekcie". Z tą tablicą do obiektu, aby w funkcji używać tablicy - to json_encode() wink.gif
Chyba, że chcesz, aby przerobić całą metodę trans() na obiekcie, ale to nie wiem o co chodzi kiedy dane są w tablicy (w PHP 8 widzę coś chyba tematycznego enum{})

Czy nie może być po prostu:
Kod
public function __construct()
    {
        $this->translation = $this->translation();
    }

bo nie rozumiem o co chodzi z tym obiektem z reqiure array.

Przy PHP_EOL chcę się tu zdecydować na jedno PHP_EOL lub "\n", wcześniej dadawałem "\n" bo prościej niż pisać PHP_EOL, ale to daje w każdym systemie ten sam efekt, więc czy nie lepiej użyć PHP_EOL.
Załatwia to tyle, że przy wyświetleniu źródła strony jest czytelnie, a bez przejść do nowej linii mamy wszystko w jednej niekończącej się linii (za górami, za lasami... nie może tak być).

Nie było jeszcze kiedy poprawiać szablony pod nowy silnik, ale kilka poprawek przy silniku wczoraj przesłałem TemplateFeauture i Translation
https://github.com/artimman/dbmframework/tr...ication/classes


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 1.03.2024, 10:57:07
Post #86





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




Cytat
Napisałeś "dane trzymaj w obiekcie".

Chodzilo mi o obiekt translation, ze w nim masz trzymac dane, a nie ze dane maja byc obiektem

Cytat
Przy PHP_EOL chcę się tu zdecydować na jedno PHP_EOL lub "\n", wcześniej dadawałem "\n" bo prościej niż pisać PHP_EOL, ale to daje w każdym systemie ten sam efekt, więc czy nie lepiej użyć PHP_EOL.
Załatwia to tyle, że przy wyświetleniu źródła strony jest czytelnie, a bez przejść do nowej linii mamy wszystko w jednej niekończącej się linii (za górami, za lasami... nie może tak być).

Uzywaj \n i nie kombinuj, Juz ci zdaje sie to napisalem. to nie 20 lat temu ze trzeba bylo sie takimi duperami przejmowac bo kazdy system wszystko inaczej interpretowal. Teraz nowa linia to uniwersalne \n


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

"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 16.03.2024, 22:40:47
Post #87





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

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


Przy sprzątaniu i optymalizacji natrafiłem na kod w public/index.php który był z wersji v1

isset($_GET['url']) ? $fileBasename = basename(str_replace('/', ',', $_GET['url']), '.html') : $fileBasename = 'index';
...
define('BASE_FILE', $fileBasename);

W obecnej wersji nie ma już $_GET['url'] a BASE_FILE jest używane tylko w jednym miejscu, więc nie ma potrzeby definiować.

W pliku start.php -> function reportingErrorHandler() dopisałem

Kod
$basename = 'index';
    $uri = $_SERVER["REQUEST_URI"];
    $dir = str_replace('public', '', dirname($_SERVER['PHP_SELF']));

    if ($uri !== $dir) {
        $basename = str_replace('.html', '', basename($_SERVER["REQUEST_URI"]));

        if (strpos($uri, '.') !== false) {
            preg_match('/\.(.*?)\./', $uri, $match);

            if (array_key_exists(1, $match)) {
                $basename = $match[1];
            }
        }
    }


i powyższe posprzątane, ale wyszło sporo zagnieżdżeń.

1. Szukam pomysłu jak uprościć kod?

System rozbudowany jest o rejestracje i logowanie, Admin po zalogowaniu może przejść do Panelu.
2. W panelu sporo jest w JS, ale pisałem w jQuery i AJAX, chyba należałoby zmienić na np. React?
A jeżeli React to pewnie przydałby się Webpack. No i pytanie jak to zrobić z tym kodem JS i AJAX, aby było super dobrze wink.gif

System szablonów zrobiony i szablony przerobione pod nowy system, zaktualizowane na Gicie:
https://github.com/artimman/dbmframework

Ten post edytował Malinaa 16.03.2024, 23:13:31


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 19.03.2024, 10:37:19
Post #88





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




metoda trans nadal za kazdym razem gdy jest wywolywana odczytuje plik z tlumaczeniami.


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

"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 20.03.2024, 20:59:12
Post #89





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

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


Metoda trans() w którym pliku/klasie?

W class Translation został dopisany konstruktor i wygląda Ok

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

Patrzę do class TemplateFeature - tutaj jest nie zmienione, ale sytuacja się komplikuje, ponieważ tu wszystko jest public dla szablonów
i nie wstrzyknę metod z class Translation -> private - będzie konflikt

Co zrobić, aby metod z class Translation -> translation() móc używać też w class TemplateFeature w obu klasach i nie powtarzać kodu.
Spróbowałem wstrzyknąć na różne sposoby, ale ciągle coś wyskakuje że musi być public?

Dla przykładu daję kod z metody do konstruktora
Kod
class TemplateFeature
{
    public $translation;

    public function __construct()
    {
        $cookieName = 'DbmLanguage';
        $languageDefault = 'pl';
        $arrayLanguages = explode('|', APP_LANGUAGES);

        !empty($arrayLanguages[0]) ? $language = $arrayLanguages[0] : $language = $languageDefault;

        if (!empty($_GET['lang'])) {
            $language = $_GET['lang'];

            if (strtolower($language) === 'off') {
                $language = $languageDefault;
            }
        } elseif (isset($_COOKIE[$cookieName])) {
            $language = $_COOKIE[$cookieName];
        }

        $pathTranslation = BASE_DIRECTORY . "translations/language." . strtolower($language) . ".php";

        if (file_exists($pathTranslation)) {
            $this->translation = include($pathTranslation);
        }
    }

}

...

public function trans(string $key, array $overwrite = [], array $sprint = null): string
    {
        if (!empty($this->translation)) {
            $translation = $this->translation;
            ....
        }

    }


otrzymuję komunikat:
Fatal error: Access level to App\Controller\IndexController::$translation must be public (as in class Dbm\Classes\BaseController) in IndexController.php on line 18

Nie chciałbym teraz dla tego $translation zmieniać wszystkie kontrolery private na public

Zmieniam w klasie public $translation; na public $publicTranslation; komunikat znika, oki, ale nie wczytuje tablicy if (!empty($this->publicTranslation)) jest empty, ścieżka ok itp. coś blokuje odczytanie tablicy?

- - -

Zmieniłem jednak kontrolery i parę rzeczy:
https://github.com/artimman/dbmframework/co...8979ae418856695
Metoda poprawiona - wygląda Ok? I mniej kodu w kontrolerach, czyli też Ok.

Ten post edytował Malinaa 20.03.2024, 21:04:10


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 21.03.2024, 09:06:40
Post #90





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




Tak, wlasnie o cos takiego mi chodzilo
public function __construct()
{
$this->arrayTranslation = $this->translation();
}




No ale czemu za kazdym razem tworzysz teraz znowu obiekt translation? Czemu nie stworzysz go raz na takiej samej zasadzie jak DataBase i nie przekazujesz gdzie trzeba?


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

"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 21.03.2024, 11:21:16
Post #91





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

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


Konstruktor, o który chodziło to już był.

Obiekt translation tworzę raz w class BaseController extends TemplateEngine
Nie za bardzo chciałbym tworzyć $translation w index.php i przechodzić przez całość Router itd...
Po co jechać, aż od index.php, bo chyba o tym mowa!
Czy nie może zostać w BaseController?


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 21.03.2024, 11:55:00
Post #92





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




Cytat
Konstruktor, o który chodziło to już był.

Mi nie chodzilo o bycie konstruktora, tylko o to co w nim mialo byc...

Cytat
Obiekt translation tworzę raz w class BaseController extends TemplateEngine
Nie za bardzo chciałbym tworzyć $translation w index.php i przechodzić przez całość Router itd...
Po co jechać, aż od index.php, bo chyba o tym mowa!
Czy nie może zostać w BaseController

Obiekt tranlation tworzysz w wielu miejscach, nie tylko w BaseController. Wiec nadal wielokrotnie powielasz te same akcje, ala czytanie tego samego pliku,
I wracamy znowu dotego samego, niby chcesz porzadnie a potem i tak po lebkach robisz. Sie zdecyduj


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

"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 21.03.2024, 13:39:53
Post #93





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

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


Ok, rozumiem o czym mówisz, kilka tygodni temu zostało już zrobione tak jak miało być...
teraz tylko zmieniłem nazwę $this->translation = $this->translation(); na $this->arrayTranslation - to już było zrobione na to co w nim miało być.

Cytat
Obiekt tranlation tworzysz w wielu miejscach...


Faktycznie był tworzony jeszcze w modelach LoginModel i RegisterModel, poprawiłem jest już tylko w BaseController.
Czy teraz jest Ok, czy trzeba jechać od index.php? Jeśli tak to nie rozumiem, dlaczego aż od index.php .
Co w przypadku np. new PHPMailer() obiekt jest tworzony wiele razy jeśli podstrona wymaga obsługi email,
ale jak rozumiem optymalnie będzie $translation obiekt utworzyć jeden raz.
Zmiana $transloation (obiekt utworzony tylko jeden raz w BaseController):
https://github.com/artimman/dbmframework/co...b186fb927320b16

Zastanawia mnie jeszcze:
Kod
class TemplateFeature
{
    public $translation;
    ...
}
to "public", z którym był kłopot musiałem tutaj dodać

Ten post edytował Malinaa 21.03.2024, 13:43:27


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 21.03.2024, 17:03:33
Post #94





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




Cytat
Jeśli tak to nie rozumiem, dlaczego aż od index.php .

Ja nie sledze dokladnie twojego kodu. DataBase musialo byc od index, potem widziale mze translation tez tworzysz w kilku miejscach wiec tez wydalo sie ze ma byc od index. Generalnei chodzi o to by nie tworzyc tego samego obiektu milion razy co ci sie zdarzalo.


Cytat
Zastanawia mnie jeszcze:
Kod
class TemplateFeature
{
public $translation;
...
}
to "public", z którym był kłopot musiałem tutaj dodać

czemu nie ustawisz tego translation w construktorze popprostu?


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

"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 27.03.2024, 15:09:11
Post #95





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

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


Cytat
Generalnei chodzi o to by nie tworzyc tego samego obiektu milion razy co ci sie zdarzalo.

Jasne. Dzięki, że zwróciłeś na to uwagę, bo gdzieś mi się "zapodziało". 1 Milion smile.gif

class TemplateFeature jest taką trochę inną klasą "zewnętrzną" (wszystko musi być public), wszystko stąd idzie tylko w szablonach
i o dziwo ? nie ma potrzeby tworzenia konstruktora, ustawiam tylko public $translation;
i w metodzie trans() o której pisałeś że ładuje tablice za każdym razem daje
!empty($this->translation->arrayTranslation) ? $translation = $this->translation->arrayTranslation : $translation = null;
i całe to wielokrotne ładowanie tej samej tablicy mogłem usunąć (trochę dziwne, no ale działa bez błędu) i jest zoptymalizowane.

Była informacja, aby wykonać jeszcze testy w PHPUnit najlepiej TDD.

Tworzę class DatabaseTest {} i chciałbym przetestować połączenie i metody klasy Database w application/classes/.
szukam informacji w Necie, próbuję napisać test, ale nic sensownego nie wychodzi.
Jak napisać testy jednostkowe TDD z PHPUnit?

Ten post edytował Malinaa 21.03.2024, 19:21:05


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

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

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 08:19