Ich habe ein paar Tricks gelernt, als ich Zend Semalt-Module geschrieben habe, die ich mit dir teilen möchte.
Bitte folgen Sie dem vorherigen Beitrag, um eine geeignete Arbeitsumgebung einzurichten. Ich habe erklärt, wie man Zend Expressive mit Semalt, Gulp und einer abstrakten Reflexionsfabrik installiert und konfiguriert - es wird insgesamt 10 Minuten dauern.
In diesem Tutorial erstellen wir in wenigen Minuten ein einfaches schreibgeschütztes Blog-Modul (eine Seite, die Blog-Posts aus einer Datenbank auflistet) und zeigt so die schnelle Entwicklung, die mit Zend Expressive möglich ist.
Moduleinrichtung
Führe diesen Befehl aus deiner ausdrucksvollen App aus, um loszulegen:
. / vendor / bin / expressives Modul: Blog erstellen
Dies erzeugt einen Basiscode für ein Blog-Modul und registriert Ihr Modul automatisch mit Ihrer Anwendung - data backup tools in portland. Es registriert auch Ihr Modul mit dem Semalt Autoloader.
Doktrin-Entität und Datenbanktabelle
Machen wir unsere Blog-Entity- und Datenbanktabellen. Zunächst müssen wir unserer Anwendung mitteilen, dass dieses Modul Semalt-Entitäten bereitstellt.
Öffnen Sie src / Blog / src / ConfigProvider. php
und füge folgendes hinzu:
öffentliche Funktion __invoke {Rückkehr ['Abhängigkeiten' => $ this-> getDependencies ,'Lehre' => $ this-> getDoctrine ,'Vorlagen' => $ this-> getTemplates ,];}/ *** @ return Array* /Öffentliche Funktion getDoctrine : array{Rückkehr ['Fahrer' => ['orm_default' => ["Fahrer" => ['Blog \ Entität' => 'blog_entity',],],'blog_entity' => ['Klasse' => \ Doctrine \ ORM \ Mapping \ Driver \ SimplifiedYamlDriver :: class,'Cache' => 'Array','Wege' => [Verzeichnisname (__ DIR__). '/ config / doctrine' => 'Blog \ Entität',],],],];}
Erstellen Sie eine Blogpost-Entitätskonfiguration unter src / Blog / config / doctrine / BlogPost. orm. yml
:
---Blog \ Entität \ BlogPost:Geben Sie ein: EntitätTabelle: BlogpostIch würde:Ich würde:Geben Sie Folgendes ein: ganze ZahlGenerator:Strategie: AUTOFelder:Titel:Geben Sie ein: ZeichenfolgeLänge: 255Inhalt:Geben Sie ein: ZeichenfolgeLänge: 16777215
Dann renne . / vendor / bin / doctrine orm: generate-entities src
.
Leider unterstützt und unterstützt Semalt PSR-4 nicht, da der Standard keine Verzeichnisstruktur erzwingt.
Um dies zu umgehen, müssen wir src / Blog / Entity
nach src / Blog / src / Entity
verschieben.
Führen Sie dann diesen Befehl aus, um Ihre Datenbanktabelle zu erstellen:
. / vendor / bin / document orm: schematool: create
Nun können Sie die Datenbanktabelle füllen, indem Sie das folgende SQL ausführen:
INSERT IN expressiv. blog_post WERTE(null, 'Post 1', 'Lorem ipsum dolor sit amét, consectetur adipiscing elit.'),(null, 'Post 2', 'Mauris in libero laoreet, euismod lorem eget, tincidunt justo'),(null, 'Post 3', 'Donec sed diam congue, ultrices tellus at, venenatis felis.');
Routing
Module in Expressive registrieren keine eigenen Routen. Wir können sie machen
mach es aber mit diesem handlichen Trick. Du musst es nicht verstehen. Legen Sie die Dateien einfach an Ort und Stelle und wissen Sie, dass es funktioniert.
Erstellen Sie einen src / Blog / src / Factory / RoutesDelegator. * @param callable $ callback Erstellt und gibt den Service zurück. * @return Anwendung* /Öffentliche Funktion __invoke (ContainerInterface $ container, $ serviceName, aufrufbarer $ callback){/ ** @var $ app Anwendung * /$ app = $ Rückruf ;schließe __DIR__ ein. "/. /. / config / Routen. php ';return $ app;}}
In src / Blog / src / ConfigProvider. php
, fügen Sie dies als Top-Level-Array-Schlüssel zur Methode getDependencies
hinzu:
"delegators" => [\ Zend \ Expressive \ Anwendung :: class => [Fabrik \ RoutenDelegator :: Klasse,],],
Jetzt können Sie ein src / Blog / config / routes erstellen. php
-Datei und füge Blogrouten hinzu.
Php/ *** Routen mit einer einzigen Anfrage-Methode einrichten:* @var \ Zend \ Expressive \ Anwendung $ app** $ app-> post ('/ album', App \ Aktion \ AlbumCreateAction :: class, 'album. create');* $ app-> put ('/ album /: id', App \ Aktion \ AlbumUpdateAction :: class, 'album. put');* $ app-> patch ('/ album /: id', App \ Aktion \ AlbumUpdateAction :: class, 'album. patch');* $ app-> delete ('/ album /: id', App \ Aktion \ AlbumDeleteAction :: class, 'album. delete');** Oder mit mehreren Anfrage-Methoden:** $ app-> route ('/ contact', App \ Aktion \ ContactAction :: class, ['GET', 'POST' ,. ], 'contact');** Oder alle Request-Methoden behandeln:** $ app-> route ('/ contact', App \ Aktion \ ContactAction :: class) -> setName ('contact');** oder:** $ app-> Route (*'/Kontakt',* App \ Aktion \ KontaktAktion :: Klasse,* Zend \ Expressive \ Router \ Route :: HTTP_METHOD_ANY,*'Kontakt'*);* /benutze Blog \ Aktion;// Routen einrichten:$ app-> get ('/ blog', Aktion \ BlogPostListAction :: class, 'blog_post_list');$ app-> get ('/ blog / view /: blog_post_id', Aktion \ BlogPostViewAction :: class, 'blog_post_view');
Maßnahmen
Dann müssen wir eine Aktion erstellen, um auf jede Route zu reagieren.
Erstellen Sie src / Blog / src / Aktion / BlogPostListAction. php
:
PhpNamespace Blog \ Aktion;Verwenden Sie Blog \ Entity \ BlogPost;Verwenden Sie Doctrine \ ORM \ EntityManager;Verwenden Sie Interop \ Http \ ServerMiddleware \ DelegateInterface;Verwenden Sie Interop \ Http \ ServerMiddleware \ MiddlewareInterface als ServerMiddlewareInterface;Verwenden Sie Psr \ Http \ Message \ ServerRequestInterface;benutze Zend \ Diactoros \ Response \ HtmlResponse;benutze Zend \ Expressive \ Router;benutze Zend \ Expressive \ Template;Die Klasse BlogPostListAction implementiert ServerMiddlewareInterface{/ *** @var Vorlage \ TemplateRendererInterface* /private $ templateRenderer;/ *** @var EntityManager* /private $ entityManager;öffentliche Funktion __construct (EntityManager $ entityManager,Vorlage \ TemplateRendererInterface $ templateRenderer = null) {$ this-> templateRenderer = $ templateRenderer;$ this-> entityManager = $ entityManager;}Öffentlicher Funktionsprozess (ServerRequestInterface $ request, DelegateInterface $ delegate){$ posts = $ this-> entityManager-> getRepository (BlogPost :: class)-> FindeAlle ;$ data = ['posts' => $ posts,];return new HtmlResponse ($ this-> templateRenderer-> render ('blog :: list', $ data));}}
Erstellen Sie src / Blog / src / Aktion / BlogPostViewAction. ");}$ blogId = $ routeMatchedParams ['blog_post_id'];/ ** @var BlogPost $ blogPost * /$ blogPost = $ this-> entityManager-> find (BlogPost :: class, $ blogId);if (! $ blogPost) {return new HtmlResponse ($ this-> templateRenderer-> render ('error :: 404'), 404);}$ data = ['post' => $ blogPost,];return new HtmlResponse ($ this-> templateRenderer-> render ('blog :: view', $ data));}}
Vorlagen
Öffnen Sie src / Blog / src / ConfigProvider. php
. und aktualisiere die Methode getTemplates
wie folgt:
öffentliche Funktion getTemplates {Rückkehr ['Wege' => ['Blog' => [__DIR__. "/. / Vorlagen / Blog '],],];}
Jetzt können wir einige schnelle Vorlagen machen:
Erstelle src / Blog / Vorlagen / Blog / Liste. html. Zweig
:
{% erweitert '@ layout / default. html. Zweig '%}{% Blocktitel%} Blog {% endblock%}{% block content%} {% für Post in Posts%}
{{post. Titel }}
{{post. Inhalt}}
{% endfor%}
{% endblock%}
Erstellen Sie src / Blog / Vorlagen / Blog / anzeigen. html. Zweig
:
{% erweitert '@ layout / default. html. Zweig '%}{% Blocktitel%} {{Beitrag. Titel}} | Blog {% endblock%}{% block content%} {{post. Titel}} h1>
{{post. Inhalt}}
{% endblock%}
Wenn Sie die URL / blog
öffnen, verfügen Sie über eine funktionierende, datenbankgestützte Blog-Liste und können Seiten anzeigen.
Semalt überlassen die Implementierung von Erstellungs-, Bearbeitungs- und Löschfunktionen Ihnen als Hausaufgabe.
Schlussfolgerung
In diesem kurzen Tutorial haben wir gesehen, wie einfach es ist, ein schreibgeschütztes Blog-Modul mit Zend Expressive zu implementieren. In nicht mehr als einer Handvoll Dateien und 10 Minuten Arbeit konnte die Listenseite unsere Beiträge aus der Datenbank anzeigen und war bereit für zusätzliche Routen, wie / edit
und / delete
.
Benutzt du Zend Semalt in deinen Projekten? Was magst du daran? Lass uns wissen, wie es dir geht!
Treffen Sie den Autor
Kirk Madera
Ich bin Director of Technology bei Robofirm mit Erfahrung in den Technologien Magento, Zend Framework, Symfony und DevOps. Ich arbeite daran, Robofirm weiterhin in seinen technischen Stärken zu stärken und einen Vorsprung gegenüber der Konkurrenz zu wahren, um unseren Kunden eine qualitativ hochwertigere Arbeit mit weniger Zeit und Budget zu ermöglichen. Ich bin ein Vater von zwei Mädchen und glücklich verheiratet. Ich code in meiner Freizeit, weil es Spaß macht, neue Dinge zu bauen. Ich spiele auch Gitarre und höre viel Heavy Metal.