Gephart 0.6 s novým designem a funkcemi

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Po dlouhých měsících jsem vydal novou verzi svého frameworku s CRUD generátorem. Překopal jsem design a přidal jsem nové funkce. Budu ho zde srovnávat s verzí 0.4, protože 0.5 jsem zde úplně přeskočil.

Novinky

Request a response podle PSR-7

Gephart implementuje PSR-7, ale pracuje nezávisle na vlastní implementaci, lze využít jakoukoli jinou, která PSR-7 dodržuje. Díky tomu lze Gephart snadno použít i jako middleware.

blog.katuscak.cz/php-psr-7-http-messages
www.gephart.cz/dokumentace/master/zaklady/http.html

Fasády

Fasády slouží k jednoduššímu přístupu k nejpožívanějším službám.
Jde o jakýsi obal nad existující službou dostupný přes statickou třídu.

Například službu request dostupnou přes dependency injection kontejner
jako Psr\Http\Message\ServerRequestInterface lze získat snadněji než vytažením z kontejneru:

<?php

class DefaultController()
{
    public function __construct(\Psr\Http\Message\ServerRequestInterface $request)
    {
        $this->request = $request;
    }

    public function index()
    {
        $queryParams = $this->request->getQueryParams();
    }
}

A to použitím fasády Gephart/Framework/Facade/Request:

<?php

use Gephart/Framework/Facade/Request;

class DefaultController()
{
    public function index()
    {
        $queryParams = Request::getQueryParams();
    }
}

www.gephart.cz/dokumentace/master/zaklady/fasady.html

Generátor – Typy položek lze rozšířit

Jednotlivé typy jako třeba „text“, „bool“, „textarea“ jsou reprezentovány samostatnými objekty a lze pomocí eventu „Admin\Generator\Service::HOOK_EVENT“ přidávat další dle osobních potřeb.

Nejprve tedy vytvoříte vlastní typ. Například:

<?php # /src/App/My/MyType.php

namespace App\My;

use Admin\Generator\Type\TypeInterface;

final class MyType implements TypeInterface
{
    public function getName(): string
    {
        return "my-custom-type";
    }

    public function getEntityProperty(): string
    {
        return <<<EOL
    /**
     * @var string
     *
     * @ORM\Type TEXT
     * @ORM\Column {{ item.slug }}
     * @ORM\Translatable
     */
    private \${{ item.slug }} = "";
    
EOL;

    }

    public function getEntityMethods(): string
    {
        return <<<EOL
    /**
     * @return string
     */
    public function get{{ item.slugInCamel }}(): string
    {
        return \$this->{{ item.slug }};
    }

    /**
     * @param string \${{ item.slug }}
     */
    public function set{{ item.slugInCamel }}(string \${{ item.slug }})
    {
        \$this->{{ item.slug }} = \${{ item.slug }};
    }
    
EOL;
    }

    public function getSet(): string
    {
        return <<<EOL
        \${{ module.slugSingular }}->set{{ item.slugInCamel }}(\$data["{{ item.slug }}"]);
EOL;
    }

    public function getForm(): string
    {
        return <<<EOL
            <div class="form-group">
                <label for="form_edit_{{ item.slug }}">{{ item.name }}</label>
                <textarea class="form-control" name="{{ item.slug }}" rows="10" id="form_edit_{{ item.slug }}">{{ "{{" }} {{ module.slugSingular }}.{{ item.slugInCamel }} {{ "}}" }}</textarea>
            </div>
EOL;

    }

    public function getShow(): string
    {
        return <<<EOL
                        {{ "{{" }} {{ module.slugSingular }}.{{ item.slugInCamel }} {{ "}}" }}
EOL;

    }

    public function getPriority(): int
    {
        return 500;
    }
}

Následně odchytit event a vlastní typ zaregistrovat:

<?php # /src/App/My/MyListener.php

namespace App\My;

use Admin\Generator\Service\Types;
use Gephart\EventManager\Event;
use Gephart\EventManager\EventManager;

class MyListener
{

    public function __construct(EventManager $event_manager)
    {
        $event_manager->attach(Types::HOOK_EVENT, [$this, "registerMyType"]);
    }

    public function registerMyType(Event $event)
    {
        $types = $event->getParam("types");
        $types[] = MyType::class;
        $event->setParams(["types" => $types]);
    }
}

V poslední řadě nelze zapomenout listener odchytávají funkci zaregistrovat:

<?php # /web/index.php

use Gephart\Framework\Kernel;
use Gephart\Http\RequestFactory;

include_once __DIR__ . "/../vendor/autoload.php";

$request = (new RequestFactory())->createFromGlobals();

$kernel = new Kernel($request);

$kernel->registerServices([
    \App\My\MyListener::class
]);

$response = $kernel->run();
echo $kernel->render($response);

Generátor – Položky jako povinné a zobrazené v záhlaví tabulek

Význam je jednoduchý. Ve formuláři bude položka jako „required“ pokud bude povinná. Při zvolení zobrazení v záhlaví tabulek se ve výpisu tata položka zobrazí hned bez rozkliku do editace přímo v tabulce s daty.

Design

Z původní verze:

Na tento vzhled:

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře