dDs
Lukáš Bělaška authored
d59090d2

Symfony Logo

// C:\Program Files\Git\bin\bash.exe

Symfony template

Tento template je vhodné si naklonovat rovnou už v GitLabu, protože projekt už bude mít pojmenování podle vašeho přání. Součástí template je i konfigurace DOCKERU.

Import do nového projektu krok 1

Zde vybereme "Import projekt".

Path mapping

Import do nového projektu krok 2

Zde vybereme "Repo by URL.

Path mapping

Import do nového projektu krok 3

Vyplnění údajů pro import template do vašeho nového projektu:

1, Git repository URL - URL zdrojového repozitáře (můj template)
2, Username (optional) - vaše přihlašovací jméno
3, Password (optional) - vaše přihlašovací heslo
4, Project name - jméno nového projektu
5, Visibility Level - viditelnost projektu

Path mapping

Nastavení xdebug

Nastavení debug a portů:

Nastavení cesty k projektu a uvnitř kontejneru:

Základní příkazy pro konfiguraci kontejneru

Build image - new

Vendor zůstavá v kontejneru, ale je zamezena synchronizace. Po spusteni app_build.sh se na lokální disk udelá kopie aby vendor byl viděn editorem.

app_build.sh


na mac a linux budete muset na sh script nastavit prava chmod 755 app_build.sh a post_build.sh

Build image

docker-compose build

Toto by melo stahnout a nastavit vše potřebné

Sestaveni a spustení kontejneru

docker-compose up  -d nebo
docker-compose up -d --build

V tuto chvili by mel byt docker projekt ready na http://localhost:82 viz soubor docker-compose.yml, kde to jde i změnit. --build používáme pro přegenerování image kontejneru.

http://localhost:82

ukončení kontejneru

docker-compose down  

Potom je možné i na stejný port spustit jiný kontejner.

SQL databáze a adminer

Součásti konfigurace je SQL databáze a phpmyadmin a adminer. Najdeme jí na url:

Phpmyadmin

http://localhost:822  

Adminer

http://localhost:823  

Databáze mezi kontejnery je na portu 3306 viz soubor docker-compose.yml. Není potřeba psát do připojení k databázi IP a port. Stačí název service ze souboru docker-compose.yml vč. jména root a hesla.

mysql

Neukládejte na Gitlab soubory DB, pouze sql dump. Jedná se o adresář ./data/database, který musí zůstat git ignore.

Konfigurace routování

Konfigurace routování, směrování je aktuálně v template nastaveno přes anotace u jednotlivých method Controlleru, kde se nastavuje obsluhovaná URL a pojmenovává routa.

     /**
     * @param Request $request
     * @param ManagerRegistry $doctrine
     * @return Response
     */
         #[Route('/form-add/{id}', defaults={"id" = null}, name="homepage_default")]
         public function formAdd(string $id = null, Request $request, ManagerRegistry $doctrine): Response
    {

Šablonovací systém "Twig"

Šablony jsou v adresáři templates a pojmenování má formát nazevsablony.html.twig. Když je šablona v podadresáří, voláme nazevadresare.nazevsablony.html.twig.

dědění layoutové šablony:

{% extends 'base.html.twig' %}

označení bloku html contentu, co se includuje podle příslušné akce controlleru do layoutu:

{% block body %}
// nejaké html pro content
{% endblock %}

příklad vložení contentu jednotlivých stránek do layoutu:

    {% block body %}
    {% endblock %}

pro případ vložení nějakého js nebo css konkrétní stránky do layoutu:

    {% block css %}
    {% endblock %}
    {% block js %}
    {% endblock %}

příklad výpisu proměnné v layoutu:

{{ id }}

příklad generování odkazu na pojmenovanou routu, kterou vložíme třeba do href html tagu a pod:

{{ path('homepage_detail') }}

příklad vložení části stránky:

{% include 'navbar.html.twig' %}

vložení js nebo css z příslušné šablony do layoutu:

    {% block css %}
    {% endblock %}
    {% block js %}
    {% endblock %}

příklad podmínky v layoutu:

{% if data is iterable %}
{% endif %}

příklad cyklu v layoutu:

{% for key, value in data %}
{{ value.street }} // přístup v poli v cyklu

      {% if loop.last %} // v cyklu můžeme použít i iterátor.
          <hr style="border: 1px solid red">
      {% endif %}

{% endfor %}

Vypsání formuláře v šabloně

 {{ form(form) }}

Nastavení přístupu k DB přes doctrine

Nastavujeme v souboru env na root webu

DATABASE_URL="mysql://pokus:pokus@mysqldb:3306/pokus?serverVersion=mariadb-10.7.3&charset=utf8mb4"

Základní příkazy pro doctrine

Příkazy zadáváme v docker containeru

vypiše seznam příkazů

php bin/console list make

vytvoreni entity

php bin/console make:entity

Pro relaci v průvodci vytvoříme "type relation"

php bin/console make:migration

Připraví sql k migraci

php bin/console doctrine:migrations:migrate

Vytvoří tabulky v DB

vytvoření entit z existující tabulky

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity

Prvním krokem k vytvoření tříd entit z existující databáze je požádat Doctrine, aby si databázi prohlédla a vygenerovala odpovídající soubory metadat. Soubory metadat popisují třídu entity, která se má generovat na základě polí tabulky.

Tento nástroj příkazového řádku žádá Doctrinu, aby prozkoumala databázi a vygenerovala nové třídy PHP s metadaty anotací do src/Entity. Tím se vygenerují dva soubory: BlogPost.phpa BlogComment.php.

úpravy existujících entit

php bin/console make:entity --regenerate

Regeneruje entity

php bin/console make:migration

Připraví sql k migraci

php bin/console doctrine:migrations:migrate

Vytvoří/upraví tabulky v DB

bin/console doctrine:migrations:sync-metadata-storage

Synchronizuje metadata

všechny příkazy

doctrine:migrations:current [aktuální] Vypíše aktuální verzi.
doctrine:migrations:diff [diff] Vygenerujte migraci porovnáním vaší aktuální databáze s vašimi mapovacími informacemi.
doctrine:migrations:dump-schema [schéma výpisu] Vypište schéma pro vaši databázi do migrace.
doctrine:migrations:execute [execute] Manuální spuštění jedné verze migrace nahoru nebo dolů.
octrine:migrations:generate [generate] Vygeneruje prázdnou třídu migrace.
doctrine:migrations:latest [latest] Vypíše číslo nejnovější verze
doctrine:migrations:migrate [migrate] Proveďte migraci na zadanou verzi nebo na nejnovější dostupnou verzi.
doctrine:migrations:rollup [souhrnná] Shrňte migrace odstraněním všech sledovaných verzí a vložením jediné verze, která existuje.
doctrine:migrations:status [stav] Zobrazení stavu sady migrací.
doctrine:migrations:up-to-date [up-to-date] Řekne vám, zda je vaše schéma aktuální.
doctrine:migrations:version [verze] Ručně přidat a odstranit verze migrace z tabulky verzí.
doctrine:migrations:sync-metadata-storage [sync-metadata-storage] Zajišťuje, že úložiště metadat je v nejnovější verzi.
doctrine:migrations:list [list-migrations] Zobrazí seznam všech dostupných migrací a jejich stav.

Základní příkazy a metody pro tvorbu formulářu

Příkazy zadáváme v docker containeru

php bin/console make:form

V prvním kroku zadáme název formuláře a ve druhém kroku název entity, ze které bude formulář vygenerován. Vygeneruje nám to formulář, který bude potřeba dále dodělat. Formulář se vygeneruje do adresáře src/Form/NazevFormulareFormType.php V metodě "build" provedeme úprqvy.

Příklad vygenerovaného formulářového elementu:

Můžeme v jednotlivých elementech nastavovat např. required, class pro stylování, validaci elementu a počet znaků, které je možné do elementu vyplnit. Název elementu nebo typ. Náš vzorový element se jmenuje "street", a je typ "Textarea".

->add('street', TextareaType::class, ['required' => true,  
                'row_attr' => ['class' => 'form-group is-invalid'],
                'attr' => ['maxlength' => 4
                    //, 'novalidate' => 'novalidate']
                ]])
Příklad manuální úpravy formulářů:

U formulářů můžeme např. nastavit i třidy css pro html, omezit počet znaků v elementu a vypnout nebo zapnout validaci.

'required' => true  // nutno vyplnit
'row_attr' => ['class' => 'form-group is-invalid'] // príklad nastavení dvou class v html
'novalidate' => 'novalidate' // vypnutí validace
'attr' => ['maxlength' => 4 // maximální počet znaků v elementu
'placeholder' => '--- Vyber mesto ---' // příklad placeholder
'label' => 'Mesto'
'row_attr' => ['class' => 'form-group is-invalid',]
'label_attr' => ['class' => 'mt-4'] // nastavení html class pro popisek formuláře

Příklad nastavení formulářového elementu, název a typ elementu.

>add('street', TextareaType::class  // element se jmenuje "street" a typ je textarea

V případě, že entita ze které byla tabulka generována má relaci do jiné tabulky a je potřeba input select, upravíme element takto. Příklad pro relaci do tabulky Cities

            ->add('cities', EntityType::class, [
                'placeholder' => '--- Vyber mesto ---',
                'class' => Cities::class,
                'choice_label' => 'name',
                'required' => true,
                'label' => 'Mesto',
                'row_attr' => ['class' => 'form-group is-invalid',],
                'label_attr' => ['class' => 'mt-4'],
            //    'attr' => ['maxlength' => 4]
            ])

Vytvoření formuláře v Controleru v příslušné akci

$form = $this->createForm(AddressFormType::class, $Eaddress,
     [
        'action' => $this->generateUrl('homepage_form_add'),
        'method' => 'POST'
      ])->handleRequest($request);

Metody pro kontrolu stavu odeslání a validity formuláře

$form->isSubmitted()
$form->isValid()

Uložení do zprávy flash messages

$this->addFlash("success", 'Data ulozena');

Přesměrování na jinou stránku po uložení dat.

return $this->redirect($this->generateUrl('homepage_default'));

Příklad zpracování po odesláhní formuláře

public function formAgg(string $id = null, Request $request, ManagerRegistry $doctrine): Response

            // ziskani dat z formulare
            $data = $form->getData();

            $em = $doctrine->getManager();
            $em->persist($data);
            $em->flush();

CHYBA - Object of class could not be converted to String

    public function __toString()
    {
        return $this->entreprise_nom;
    }