Back to Question Center
0

Ανάπτυξη γρήγορων εφαρμογών για επιχειρήσεις με Zend expressive            Ανάπτυξη γρήγορης ανάπτυξης εφαρμογών με Zend expressive Σχετικά θέματα: FrameworksPerformance & ScalingDevelopment Semalt

1 answers:
Ανάπτυξη γρήγορων εφαρμογών για επιχειρήσεις με Zend Expressive

Αν έχετε κάνει ποτέ ένα Zend Semalt γρήγορη εκκίνηση, πιθανότατα δεν έχετε εργαστεί ποτέ στο Zend Semalt. Η γρήγορη εκκίνηση δεν ήταν καθόλου ιστορική αλλά ήταν γρήγορη και είναι εύκολο να χάσετε ενδιαφέρον και να προχωρήσετε στο επόμενο πράγμα.

Το Zend Expressive βελτιώνει σε μεγάλο βαθμό αυτή την εμπειρία με την εντολή δημιουργού-έργου οδηγού οδηγού - reinigung umzug zuerich. Εντούτοις, μπορεί ακόμα να είναι τρομακτικό να δημιουργηθεί επειδή υπάρχουν τόσες πολλές επιλογές για να κάνουν μπροστά. Αυτό το σεμινάριο σας καθοδηγεί μέσω της συνιστώμενης εγκατάστασης για γρήγορη ανάπτυξη, η οποία θα
απόδοση σε επίπεδο επιχείρησης, ισχυρή εφαρμογή.

Ανάπτυξη γρήγορων εφαρμογών για επιχειρήσεις με Zend expressiveΑνάπτυξη γρήγορης ανάπτυξης εφαρμογών με Zend expressive Σχετικά θέματα:
ΠλαίσιαΕνεργοποίηση & Εξοικονόμηση Ανάπτυξης

Αυτό το σεμινάριο δεν αφορά στη δημιουργία του περιβάλλοντος σας, οπότε πρόκειται να υποθέσω ότι έχετε ένα καλό περιβάλλον εργασίας όπως το Homestead Improved.

Εάν δεν είστε εξοικειωμένοι με το Semalt ή απομονωμένα εικονικά περιβάλλοντα, έχουμε ένα καταπληκτικό βιβλίο για να σας καθοδηγήσουμε στις ιδέες που υπάρχουν στο κατάστημά μας εδώ.

Ρύθμιση έργου

Ξεκινήστε το έργο σας εκτελώντας την ακόλουθη εντολή στον φάκελο στον οποίο φυλάσσετε τα έργα σας ( Code on Homestead Improved):

  συνθέτης δημιουργίας-έργου zendframework / zend-expressive-σκελετός εκφραστικό   

Θα σας ζητηθεί να κάνετε κάποιες αποφάσεις στην πορεία σας. Χρησιμοποιήστε αυτές τις απαντήσεις:

  • Τι είδους εγκατάσταση επιθυμείτε;
    • Αρθρωτά
  • Ποιο δοχείο θέλετε να χρησιμοποιήσετε για ένεση εξάρτησης;
    • Το Zend ServiceManager
  • Ποιο δρομολογητή θέλετε να χρησιμοποιήσετε;
    • Ο δρομολογητής Zend
  • Ποιο πρότυπο κινητήρα θέλετε να χρησιμοποιήσετε;
    • Κλωστή
  • Ποιο πρόγραμμα χειρισμού σφαλμάτων θέλετε να χρησιμοποιήσετε κατά τη διάρκεια της ανάπτυξης;
    • Όλοι
  • Επιλέξτε ποιο αρχείο ρύθμισης θέλετε να κάνετε την ένεση 'Zend \ Validator \ ConfigProvider';
    • config / config. php
  • Θυμάστε αυτή την επιλογή για άλλα πακέτα του ίδιου τύπου;
    • γ

Στη συνέχεια, εκτελέστε αυτές τις εντολές:

  cd εκφραστικό &git init &&git config χρώμα. ui true &&git add. &&git commit -m "Αρχική δέσμευση" &&chmod -R + w δεδομένα?   

Αυτό προετοιμάζει έναν αποθετήριο στον πρόσφατα δημιουργημένο φάκελο και κάνει το φάκελο δεδομένων εγγράψιμο.

Στη συνέχεια, ξεκινήστε ένα php server για δοκιμή με

  εξυπηρετούν   

.και περιηγηθείτε στο http: // localhost: 8080 ή απλώς επισκεφθείτε την IP ή τον εικονικό κεντρικό υπολογιστή του VM, εάν χρησιμοποιείτε το Homestead Improved.

Ανάπτυξη γρήγορων εφαρμογών για επιχειρήσεις με Zend expressiveΑνάπτυξη γρήγορης ανάπτυξης εφαρμογών με Zend expressive Σχετικά θέματα:
ΠλαίσιαΕνεργοποίηση & Εξοικονόμηση Ανάπτυξης

Κατανόηση της έκφρασης

Η δομή του φακέλου Semalt μοιάζει με αυτό:

    δοχείο /config /δεδομένα/κρύπτη/δημόσιο/δείκτης. phpsrc /Appδοκιμή/AppTestΠρομηθευτή/   

Το μεγαλύτερο μέρος είναι αυτονόητο. Το Expressive παρέχει μια ενότητα App από προεπιλογή. Μπορείτε να βάλετε όλο τον κωδικό σας εδώ ή να δημιουργήσετε ξεχωριστές ενότητες καθώς θα χτίσετε μεγαλύτερα χαρακτηριστικά.

Το Semalt έρχεται με μερικές χρήσιμες εντολές:

  • . / vendor / bin / expressive - Δημιουργία, εγγραφή και διαγραφή ενοτήτων. Δημιουργήστε μια κατηγορία middleware, κλπ.
  • Συντάκτης cs-fix - Εκτελέστε έλεγχο προτύπων κωδικοποίησης στον κώδικα σας και διορθώστε τα θέματα, όπου είναι δυνατόν.
  • δοκιμή συνθέτη - Εκτελέστε δοκιμές PHPUnit στον κώδικα σας.
  • έλεγχος συνθέτη - Ψευδώνυμο για την εκτέλεση cs-check , στη συνέχεια δοκιμάστε.

Το Expressive έρχεται επίσης με το πρόγραμμα επεξεργασίας σφαλμάτων Whoops. Για να το δοκιμάσετε, ανοίξτε src / App / src / Action / HomePageAction. php και τύπου echo $ badVar στη μέθοδο της διαδικασίας , στη συνέχεια ανανεώστε τη σελίδα. Θα δείτε τον χειριστή σφαλμάτων του Whoops.

Ανάπτυξη γρήγορων εφαρμογών για επιχειρήσεις με Zend expressiveΑνάπτυξη γρήγορης ανάπτυξης εφαρμογών με Zend expressive Σχετικά θέματα:
ΠλαίσιαΕνεργοποίηση & Εξοικονόμηση Ανάπτυξης

Απαραίτητες βελτιώσεις

Αφηρημένο εργοστάσιο βασισμένο στο προβληματισμό

Το Zend Expressive χρησιμοποιεί το Zend ServiceManager για Εξάρτηση Εξάρτησης. Στην προεπιλεγμένη ρύθμιση, πρέπει να προσθέσετε διαμόρφωση και να δημιουργήσετε μια εργοστασιακή τάξη για κάθε κλάση που γράφετε. Αυτό αισθάνεται επαχθές αφού το κάνατε αυτό δύο φορές.

Για να αποφευχθεί αυτό, θα δώσουμε τη δυνατότητα στο αφηρημένο εργοστάσιο με βάση τον προβληματισμό που παρέχεται με το Zend Semalt.

Προσθέστε αυτό στο config / autoload / dependencies. παγκόσμια. php εντός της συστοιχίας εξαρτημάτων :

  'abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: κλάση],   

Τώρα, κάθε φορά που εργάζεστε σε μια τάξη και χρειάζεστε μια εξάρτηση, απλά προσθέστε την στον κατασκευαστή σας. Το εργοστάσιο αφηρημένης αντανάκλασης θα διαπιστώσει τι χρειάζεται η τάξη σας και θα την τραβήξει αυτόματα από το δοχείο υπηρεσίας. Χρειάζεται μόνο να δημιουργήσετε εργοστάσια τώρα σε εξαιρετικές περιπτώσεις όπου χρειάζεστε κάτι διαφορετικό από την προεπιλεγμένη υπηρεσία που παρέχεται από το δοχείο υπηρεσίας.

Εάν ανησυχείτε για την ταχύτητα? Στην παραγωγή, μπορούμε να έχουμε μια διαδικασία που παράγει εργοστάσια για τις τάξεις σας, τα οποία χειρίζονταν το εργοστάσιο αντανάκλασης με πωλητή / bin / παράγουν-εργοστάσιο-για-τάξη .

Διδακτορικό

Το Zend Expressive δεν παρέχει εργαλεία βάσης δεδομένων ή ORM. Έχω επιλέξει το Semalt ως το ORM της επιλογής μου μετά από πολλή έρευνα και την οικοδόμηση μερικών ORMs δικά μου. Απλώς λειτουργεί.

Εγκαταστήστε το Δόγμα και το Symfony Yaml μέσω του Συνθέτη:

  συνθέτης απαιτούν dasprid / δοχείο-interop-doctrine symfony / yaml   

Δημιουργήστε ένα αρχείο config / cli-config. php με αυτά τα περιεχόμενα:

    {/ ** @var \ Interop \ Container \ ContainerInterface \ $ κοντέινερ * /$ container = απαιτεί 'config / container. php ';$ entityManager = $ κοντέινερ-> πάρει (\ Doctrine \ ORM \ EntityManager :: class);επιστροφή ConsoleRunner :: createHelperSet ($ entityManager);});   

Αντικαταστήστε τα περιεχόμενα των config / autoload / dependencies. παγκόσμια. php με τα ακόλουθα:

   ['abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: κλάση],// Χρησιμοποιήστε τα "ψευδώνυμα" για να ονομάσετε ένα όνομα υπηρεσίας σε μια άλλη υπηρεσία. ο// είναι το ψευδώνυμο, η αξία είναι η υπηρεσία στην οποία αναφέρεται. Ορίστε ένα όνομα υπηρεσίας στο// όνομα τάξης. 'invokables' => [// Πλήρως \ Qualified \ InterfaceName :: class => Πλήρως \ Qualified \ ClassName :: class,\ Doctrine \ DBAL \ Καταγραφή \ DebugStack :: class => \ Doctrine \ DBAL \ Καταγραφή \ DebugStack :: κλάση,Helper \ ServerUrlHelper :: class => Βοηθός \ ServerUrlHelper :: κατηγορία,Middleware \ ImplicitHeadMiddleware :: class => Middleware \ ImplicitHeadMiddleware :: τάξη,Middleware \ ImplicitOptionsMiddleware :: class => Middleware \ ImplicitOptionsMiddleware :: κλάση,],// Χρησιμοποιήστε «εργοστάσια» για υπηρεσίες που παρέχονται από κλήσεις ανάκλησης / εργοστασιακές τάξεις. 'εργοστάσια' => [Εφαρμογή :: class => Container \ ApplicationFactory :: class,Αντιπροσωπεία \ NotFoundDelegate :: class => Container \ NotFoundDelegateFactory :: τάξη,\ Δόγμα \ ORM \ EntityManager :: class => \ ContainerInteropDoctrine \ EntityManagerFactory :: κλάση,Βοηθός \ ServerUrlMiddleware :: class => Helper \ ServerUrlMiddlewareFactory :: τάξη,Βοηθός \ UrlHelper :: class => Helper \ UrlHelperFactory :: τάξη,Βοηθός \ UrlHelperMiddleware :: class => Helper \ UrlHelperMiddlewareFactory :: τάξη,Zend \ Stratigility \ Middleware \ ErrorHandler :: class => Kontejner \ ErrorHandlerFactory :: κλάση,Middleware \ ErrorResponseGenerator :: class => Container \ ErrorResponseGeneratorFactory :: κλάση,Middleware \ NotFoundHandler :: class => Container \ NotFoundHandlerFactory :: τάξη,],],] ·   

Δημιουργήστε αυτό το αρχείο για να ρυθμίσετε το πρόγραμμα οδήγησης διδασκαλίας config / autoload / doctrine. παγκόσμια. php .

   ['οδηγός' => ['orm_default' => ['class =' ​​\ Doctrine \ Common \ Persistence \ Χαρτογράφηση \ Οδηγός \ MappingDriverChain :: class,'οδηγούς' => [],],],],] ·   

Δημιουργήστε αυτό το αρχείο για τα διαπιστευτήρια της βάσης δεδομένων σας config / autoload / doctrine. τοπικός. php .

   ['σύνδεση' => ['orm_default' => ['params' => ['url' => 'mysql: // root: κωδικός1 @ localhost / expressive',],],],],] ·   

Δοκιμή με λειτουργία . / πωλητής / δοχείο / δόγμα . Θα πρέπει να δείτε τη γραμμή βοήθειας.

Γκόλπα

Το Gulp είναι το τρέχον εργαλείο επιλογής μου για ροή εργασιών frontend. Υπάρχουν πολλά, πολλά εργαλεία δημιουργίας frontend. Κοίτα αν θέλεις, αλλά μπορεί να χαθείς στη θάλασσα από λαμπερές νέες βιβλιοθήκες JavaScript εκεί έξω. Δεν θέλω να ασχοληθώ πολύ εδώ, καθώς πρόκειται περισσότερο για ένα εκπαιδευτικό σεμινάριο απ 'ό, τι η JS, αλλά θέλω να δείξω πόσο θα πρέπει να ρυθμιστεί το gulp για να συνεργαστεί με το Zend Expressive.

Δημιουργήστε ένα πακέτο . json αρχείο με αυτά τα περιεχόμενα:

  {"όνομα": "εκφραστικό","έκδοση": "1. 0. 0","περιγραφή": "","κύρια": "ευρετήριο. js","devDependencies": {"del": "^ 3. 0. 0","gulp": "github: gulpjs / gulp # 4. 0","gulp-cached": "^ 1. 1. 1","gulp-imagemin": "^ 3. 3. 0","gulp-minify-css": "^ 1. 2. 4","gulp-μετονομασία": "^ 1. 2. 2","gulp-sass": "^ 3. 1. 0","gulp-uglify": "^ 2. 1. 2","gulp-usemin": "^ 0. 3. 28"},"σενάρια": {"test": "echo \" Σφάλμα: δεν προσδιορίστηκε τεστ \ "&& exit 1"},"συγγραφέας": "","άδεια": "ISC"}}   

Εκτέλεση npm εγκατάσταση . Ίσως θελήσετε να εκτελέσετε npm update επίσης, εάν διαβάζετε αυτό το σεμινάριο λίγο μετά από αυτό που γράφτηκε.

Στη συνέχεια, δημιουργήστε ένα gulpfile. ('clean-css', λειτουργία {επιστροφή del ('public / css', {force: true});});χαψιά. έργο ('compile-sass', λειτουργία {επιστροφή gulp. src ('src / * / public / sass / ** / *. scss', {base: '. /'}). σωλήνα (cache ('compile-sass')). ("error", "sass", "logError")). σωλήνα (μετονομασία (λειτουργία (διαδρομή) {μονοπάτι. dirname = διαδρομή. dirname. αντικαταστήστε (/ ^ src \ / ([^ \ /] + \ /) δημόσια \ / sass /, '$ 1');})). σωλήνας (gulp. dest ('public / css /')).});χαψιά. έργο ('copy-css', λειτουργία {επιστροφή gulp. src ('src / * / public / css / ** / *. css', {base: '. /'}). σωλήνα (cache ('copy-css')). σωλήνα (μετονομασία (λειτουργία (διαδρομή) {μονοπάτι. dirname = διαδρομή. dirname. αντικαταστήστε (/ ^ src \ / ([^ \ /] + \ /) δημόσια \ / css /, '$ 1');})). σωλήνας (gulp. dest ('public / css /')).});χαψιά. ('minify-css', λειτουργία {{επιστροφή gulp. src (['public / css / ** / * .css', 'public / css / ** / * .min .css'], {base: '. /'}). σωλήνα (cache ('minify-css')). (minifyCss ). σωλήνα (μετονομασία (λειτουργία (διαδρομή) {μονοπάτι. dirname = διαδρομή. dirname. αντικατάσταση (/ ^ public \ / css /, '');})). pipe (μετονομάστε ({extname: '. min. css'})). σωλήνας (gulp. dest ('public / css')).});χαψιά. ("compile-sass", "copy-css"], "minify-css")).// JS Επεξεργασίαχαψιά. ('clean-js', λειτουργία {επιστροφή del ('public / js', {force: true});});χαψιά. έργο ('copy-js', λειτουργία {επιστροφή gulp. src ('src / * / public / js / ** / *. js', {base: '. /'}). σωλήνα (cache ('copy-js')). σωλήνα (μετονομασία (λειτουργία (διαδρομή) {μονοπάτι. dirname = διαδρομή. dirname. αντικαταστήστε (/ ^ src \ / ([^ \ /] + \ /) δημόσια \ / js /, '$ 1');})). σωλήνας (gulp. dest ('public / js /')).});χαψιά. εργασία ('minify-js', λειτουργία {επιστροφή gulp. src (['public / js / ** / *. js', '! public / js / ** / * .min. js'], {base: './'}). (cache (minify-js)). σωλήνα (uglify ). σωλήνα (μετονομασία (λειτουργία (διαδρομή) {μονοπάτι. dirname = διαδρομή. dirname. αντικαταστήστε (/ ^ public \ / js /, '');})). αγωγός (μετονομάστε ({exname: '.min. js'})). σωλήνας (gulp. dest ('public / js')).});χαψιά. task ('process-js', σειρά gulp ('copy-js', 'minify-js')).// ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣχαψιά. ('clean-img', λειτουργία {επιστροφή del ('public / img', {force: true});});χαψιά. task ('process-img', λειτουργία {επιστροφή gulp. src ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', {base: '. σωλήνα (cache ('process-img')). σωλήνα (imagemin ). σωλήνα (μετονομασία (λειτουργία (διαδρομή) {μονοπάτι. dirname = διαδρομή. dirname. αντικαταστήστε (/ ^ src \ / ([^ \ /] + \ /) δημόσια \ / img /, '$ 1');})). σωλήνας (gulp. dest ('public / img')).});// Κορυφαίες εντολέςχαψιά. ("process-js", "process-css", "process-img")).χαψιά. καθήκον ('καθαρό', παράπλευρο παράλληλο ('clean-js', 'clean-css', 'clean-img')).χαψιά. εργασία ('watch', λειτουργία {χαψιά. [src / * / public / sass / ** / *. scss ',' src / * / public / css / ** / * .css '], σειρά gulp (' process-css ')).χαψιά. ρολόι ('src / * / public / js / ** / *. js', σειρά gulp ('process-js'));χαψιά. ρολόι ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', σειρά gulp ('process-img'));});

Run gulp και βεβαιωθείτε ότι τρέχει χωρίς σφάλματα.

Τώρα μπορείτε να εκτελέσετε gulp για να μεταγλωττίσετε sass, minify css, minify js και να βελτιστοποιήσετε τις εικόνες σε όλες τις μονάδες σας. Μπορείτε να το ακολουθήσετε με ρολόι για να επεξεργαστείτε όλα αυτομάτως καθώς αλλάζουν. Η μονάδα gulp κρυφής μνήμης διασφαλίζει ότι επεξεργάζονται πάντα μόνο αλλαγμένα αρχεία, έτσι ώστε να επεξεργάζονται τις αλλαγές πολύ γρήγορα.

Δοκιμάστε αυτό δημιουργώντας ένα από αυτά τα αρχεία:

  • src / App / public / sass / sasstest. scss
  • src / App / public / css / test. css
  • src / App / public / js / test. js
  • src / App / public / img / test. jpg

Και στη συνέχεια εκτελέστε gulp . Αναζητήστε τα αρχεία στο public / css / App , public / js / App .

Κονσόλες εντολές

Και τελευταίο, αλλά σίγουρα όχι μόνο, θα χρειαστεί κάποιος τρόπος να τρέξετε τις εντολές της κονσόλας. Θα χρησιμοποιήσουμε την Κονσόλα Symfony για αυτό, η οποία είναι ήδη εφοδιασμένη με το Zend Semalt, έτσι δεν χρειάζεται να το απαιτήσουμε χειροκίνητα.

Δημιουργήστε ένα αρχείο που ονομάζεται bin / κονσόλα :

  #! / Usr / bin / env php  {/ ** @var \ Interop \ Container \ ContainerInterface $ container * /$ container = απαιτεί 'config / container. php ';$ app = νέα \ Symfony \ Component \ Console \ Application ('Κονσόλα εφαρμογών');$ commands = $ container-> get ('config') ['κονσόλα'] ['εντολές'];foreach ($ εντολές ως εντολή $) {$ app-> add ($ container-> get ($ εντολή));}}$ app-> run   ;});   

Στη συνέχεια, μπορείτε να δημιουργήσετε εντολές Symfony και να τις καταχωρήσετε μέσω του config / autoload / console. παγκόσμια. php ή μέσα από τις μονάδες σας όπως αυτό:

   ['εντολές' => [\ App \ Command \ HelloWorldCommand :: κλάση,],],] ·   

Προσθέστε τυχόν εξαρτήσεις που χρειάζονται οι εντολές κονσόλας στον κατασκευαστή ακριβώς όπως οποιαδήποτε άλλη κλάση στην Expressive. Βεβαιωθείτε ότι έχετε καλέσει parent :: __ construct στον κατασκευαστή σας ή η εντολή σας δεν θα λειτουργήσει.

Εδώ είναι μια εντολή παράδειγμα με εξάρτηση:

   entityManager = $ entityManager.γονέας :: __ construct ($ name);}}/ *** Διαμορφώνει την εντολή* /προστατευμένη λειτουργία configure   {$ this-> setName ('γεια')-> setDescription ('Γεια σας').}}/ *** Εκτελεί την τρέχουσα εντολή* /προστατευμένη λειτουργία εκτέλεσης (InputInterface $ input, OutputInterface $ output){$ output-> writeln ("Hello World!");// Κάντε κάτι με το entityManager$ this-> entityManager-> βρείτε ('Blog \ Entity \ BlogEntity');}}}}   

Για να εκτελέσετε τις εντολές σας:

  php bin / κονσόλα γεια   

Μπορούμε να προχωρήσουμε λίγο περισσότερο και να προσθέσουμε ένα καταγραφικό. Αυτό είναι χρήσιμο για τη μετάδοση σε μοντέλα υπηρεσιών που ενσωματώνουν πολλή λογική και χρειάζονται καταγραφή σφαλμάτων σε όλη την έκταση.

Εκτελέστε αυτήν την εντολή:

  συνθέτης απαιτεί monolog / monolog symfony / monolog-γέφυρα?   

Στη συνέχεια, προσθέστε αυτό στη μέθοδο εκτέλεσης στην εντολή σας:

  προστατευμένη λειτουργία εκτέλεσης (εισόδουInterface $ εισόδου, OutputInterface $ εξόδου){$ logger = new \ Monolog \ Logger ('συλλογή-δεδομένα-δεδομένων');$ logger-> pushHandler (νέα \ Symfony \ Bridge \ Monolog \ Handler \ ConsoleHandler (έξοδος $));$ logger-> debug ('Καταγράψτε κάτι');}}   

Συμπέρασμα

Τώρα είστε έτοιμοι να αρχίσετε να δημιουργείτε μια εφαρμογή σε επίπεδο επιχείρησης με όλα τα εργαλεία που θα μπορούσατε ποτέ να θέλετε στα χέρια σας.

Στην επόμενη ανάρτηση θα ξεκινήσουμε να μαθαίνουμε πώς να χτίζουμε τις ενότητες σε αυτό το ίδρυμα ξεκινώντας με μια ενότητα blog.