Back to Question Center
0

การพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend Expressive            การพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend ExpressiveRelated Topics: FrameworksPerformance & Scaling พัฒนาการ Semalt

1 answers:
การพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend Expressive

ถ้าคุณเคยเริ่มต้น Zend Semalt อย่างรวดเร็วคุณอาจไม่เคยทำงาน Zend Semalt การเริ่มต้นอย่างรวดเร็วนี้ได้รับการยกย่องมาแล้วไม่ว่าจะเป็นอะไร แต่อย่างรวดเร็วและง่ายต่อการสูญเสียความสนใจและไปยังสิ่งต่อไป

Zend Expressive ช่วยปรับปรุงประสบการณ์นี้ได้ดียิ่งขึ้นด้วยคำสั่ง create-project ของตัวช่วยสร้าง

อย่างไรก็ตามยังคงสามารถสร้างความยุ่งยากในการตั้งค่าได้เนื่องจากมีทางเลือกมากมายให้เลือก บทแนะนำนี้จะแนะนำคุณเกี่ยวกับการตั้งค่าที่แนะนำสำหรับการพัฒนาอย่างรวดเร็วซึ่งจะ
ให้ระดับองค์กรแอพพลิเคชันที่มีประสิทธิภาพ

การพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend Expressiveการพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend ExpressiveRelated Topics:
กรอบการทำงานประสิทธิภาพและการปรับขนาดการพัฒนา Semalt

กวดวิชานี้ไม่เกี่ยวกับการตั้งค่าสภาพแวดล้อมของคุณดังนั้นฉันจะสมมติว่าคุณมีสภาพแวดล้อมการทำงานที่ดีเช่น Homestead Improved

ถ้าคุณไม่คุ้นเคยกับ Semalt หรือสภาพแวดล้อมเสมือนแบบแยกเรามีหนังสือที่น่าสนใจเพื่อแนะนำคุณตลอดแนวความคิดที่มีอยู่ในร้านของเราที่นี่

การตั้งค่าโครงการ

เริ่มต้นโครงการโดยเรียกใช้คำสั่งต่อไปนี้ในโฟลเดอร์ที่คุณเก็บโครงการของคุณ ( รหัส ใน Homestead Improved):

     ผู้แต่งสร้างโครงการ zendframework / zend-expressive-szeleton expressive    

คุณจะได้รับแจ้งให้ตัดสินใจในไม่กี่ขั้นตอน ใช้คำตอบเหล่านี้:

  • คุณต้องการติดตั้งชนิดใด?
    • แบบแยกส่วน
  • คุณต้องการใช้คอนเทนเนอร์ใดสำหรับการพึ่งพาการฉีดยา?
    • Zend ServiceManager
  • คุณต้องการใช้เราเตอร์ตัวไหน?
    • Zend Router
  • คุณต้องการใช้เทมเพลตใด
    • กิ่ง
  • คุณต้องการใช้ตัวจัดการข้อผิดพลาดใดในระหว่างการพัฒนา?
    • อ๊ะ
  • โปรดเลือกไฟล์ config ที่คุณต้องการจะใส่ 'Zend \ Validator \ ConfigProvider' ลงใน?
    • config / config php
  • จำตัวเลือกนี้สำหรับแพคเกจอื่นที่มีชนิดเดียวกันได้หรือไม่?
    • y

จากนั้นให้เรียกใช้คำสั่งเหล่านี้

     cd expressive &&git init &&สี config git ui true &&git add &&git commit -m "Initial commit" &&chmod-R + w data;    

การเริ่มต้นที่เก็บข้อมูลในโฟลเดอร์ที่สร้างขึ้นใหม่และทำให้โฟลเดอร์ ข้อมูลสามารถเขียนได้

แล้วเริ่มต้นเซิร์ฟเวอร์ php สำหรับการทดสอบด้วย

     ผู้แต่งเพลง    

.และเรียกดู http: // localhost: 8080 หรือเพียงแวะไปที่ IP ของ VM หรือโฮสต์เสมือนถ้าคุณใช้ Homestead Improved

การพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend Expressiveการพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend ExpressiveRelated Topics:
กรอบการทำงานประสิทธิภาพและการปรับขนาดการพัฒนา Semalt

การทำความเข้าใจเกี่ยวกับการแสดงออก

โครงสร้างโฟลเดอร์ Semalt มีลักษณะดังนี้

     ถัง /config /ข้อมูล/แคช /ประชาชน /ดัชนี. PHPsrc /Appทดสอบ/AppTestผู้ขาย /    

ส่วนใหญ่เป็นคำอธิบายตนเอง Expressive มีการใช้โมดูล App โดยค่าเริ่มต้น คุณสามารถใส่รหัสทั้งหมดของคุณได้ที่นี่หรือสร้างโมดูลแยกจากกันเมื่อคุณสร้างคุณลักษณะที่ใหญ่ขึ้น

Semalt มาพร้อมกับคำสั่งที่มีประโยชน์บางอย่าง:

  • / vendor / bin / expressive - สร้างลงทะเบียนและยกเลิกการลงทะเบียนโมดูล สร้างคลาสมิดเดิ้ล ฯลฯ.
  • composer cs-fix - ทำตามมาตรฐานการเข้ารหัสตามรหัสของคุณและแก้ไขปัญหาที่เป็นไปได้
  • composer test - เรียกใช้การทดสอบ PHPUnit ในโค้ดของคุณ
  • เช็คเพลง - นามแฝงสำหรับการรัน cs-check จากนั้นทดสอบ

นิพจน์ยังมาพร้อมกับตัวจัดการข้อผิดพลาด Whoops ในการทดสอบให้เปิด src / App / src / Action / HomePageAction php และพิมพ์ echo $ badVar ในกระบวนการ process แล้วรีเฟรชหน้า คุณจะเห็นตัวจัดการข้อผิดพลาด Whoops

การพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend Expressiveการพัฒนาแอ็พพลิเคชัน Rapid Enterprise ด้วย Zend ExpressiveRelated Topics:
กรอบการทำงานประสิทธิภาพและการปรับขนาดการพัฒนา Semalt

การปรับปรุงที่จำเป็น

โรงงานสังเคราะห์สะท้อน

Zend Expressive ใช้ Zend ServiceManager for Dependency Semalt ในการตั้งค่าเริ่มต้นคุณต้องเพิ่มการกำหนดค่าและอาจสร้างคลาสโรงงานสำหรับทุกๆชั้นเรียนที่คุณเขียน นี้รู้สึกหนักเมื่อทำเช่นนี้ประมาณสองครั้ง

เพื่อหลีกเลี่ยงปัญหานี้เราจะช่วยให้โรงงานนามธรรมที่สะท้อนอยู่กับ Zend Semalt

เพิ่มค่านี้ลงใน config / autoload / dependencies ทั่วโลก php ภายในอาร์เรย์การอ้างอิง :

     'abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: ระดับ]    

ตอนนี้เมื่อคุณทำงานในชั้นเรียนและต้องการการพึ่งพาเพียงเพิ่มลงในตัวสร้างของคุณ โรงงานนามธรรมสะท้อนจะดูว่าชั้นเรียนของคุณต้องการอะไรบ้างและคว้ามันโดยอัตโนมัติจากตู้คอนเทนเนอร์ คุณจำเป็นต้องสร้างโรงงานในกรณีพิเศษเมื่อคุณต้องการบางอย่างที่แตกต่างจากบริการดีฟอลต์ที่จัดหาโดยคอนเทนเนอร์บริการ

หากคุณกังวลเรื่องความเร็ว ในการผลิตเราสามารถมีกระบวนการที่สร้างโรงงานสำหรับชั้นเรียนของคุณที่ได้รับการจัดการโดยโรงงานสะท้อนกับผู้จัดจำหน่าย / bin / generate-factory-for-class

หลักคำสอน

Zend Expressive ไม่มีเครื่องมือฐานข้อมูลหรือ ORM ฉันเลือก Semalt เป็น ORM ของฉันเลือกหลังจากการวิจัยมากและสร้าง ORM ไม่กี่ของฉันเอง มันใช้ได้ผลดี

ติดตั้ง Doctrine และ Symfony Yaml ผ่าน Composer:

     ต้องการ dasprid / container-interop-doctrine symfony / yaml    

สร้างไฟล์ config / cli-config php กับเนื้อหาเหล่านี้:

       {/ ** @var \ Interop \ Container \ ContainerInterface \ $ คอนเทนเนอร์ * /$ container = ต้องใช้ 'config / container PHP ';$ entityManager = $ container-> get (\ Doctrine \ ORM \ EntityManager :: class);return ConsoleRunner :: createHelperSet ($ entityManager);});    

แทนที่เนื้อหาของ config / autoload / dependencies ทั่วโลก php มีดังต่อไปนี้:

        ['abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: ระดับ]// ใช้ 'นามแฝง' เพื่อแทนชื่อบริการไปยังบริการอื่น// เป็นชื่อนามแฝงค่าคือบริการที่จุดนั้น. ทำแผนที่ชื่อบริการไปที่// class name 'invokables' => [// Fully \ Qualified \ InterfaceName :: class => Fully \ Qualified \ ClassName :: class,\ Doctrine \ DBAL \ Logging \ DebugStack :: class => \ Doctrine \ DBAL \ Logging \ DebugStack :: class,Helper \ ServerUrlHelper :: class => Helper \ ServerUrlHelper :: class,Middleware \ ImplicitHeadMiddleware :: class => Middleware \ ImplicitHeadMiddleware :: คลาส,Middleware \ ImplicitOptionsMiddleware :: class => Middleware \ ImplicitOptionsMiddleware :: คลาส,]// ใช้ "โรงงาน" สำหรับบริการที่ได้รับจาก callback / factory classes 'โรงงาน' => [Application :: class => คอนเทนเนอร์ \ ApplicationFactory :: คลาส,Delegate \ NotFoundDelegate :: class => คอนเทนเนอร์ \ NotFoundDelegateFactory :: class,\ Doctrine \ ORM \ EntityManager :: class => \ ContainerInteropDoctrine \ EntityManagerFactory :: class,Helper \ ServerUrlMiddleware :: class => Helper \ ServerUrlMiddlewareFactory :: class,Helper \ UrlHelper :: class => Helper \ UrlHelperFactory :: class,Helper \ UrlHelperMiddleware :: class => Helper \ UrlHelperMiddlewareFactory :: class,Zend \ Stratigility \ Middleware \ ErrorHandler :: class => คอนเทนเนอร์ \ ErrorHandlerFactory :: class,Middleware \ ErrorResponseGenerator :: class => คอนเทนเนอร์ \ ErrorResponseGeneratorFactory :: คลาส,Middleware \ NotFoundHandler :: class => คอนเทนเนอร์ \ NotFoundHandlerFactory :: คลาส,]]];    

สร้างไฟล์นี้เพื่อตั้งค่าคอนฟิก / autoload / driver ของ Doctrine driver ทั่วโลก php

        ['driver' => ['orm_default' => ['class' => \ Doctrine \ Common \ Persistence \ Mapping \ Driver \ MappingDriverChain :: class,'drivers' => [],]]]];    

สร้างไฟล์นี้สำหรับข้อมูลรับรองฐานข้อมูล config / autoload / doctrine ในประเทศ php

        ['connection' => ['orm_default' => ['params' => ['url' => 'mysql: // root: password1 @ localhost / expressive',]]]]];    

ทดสอบโดยใช้ / ผู้ขาย / bin / หลักคำสอน คุณควรเห็นข้อความแจ้งความช่วยเหลือ

ก้น

Gulp เป็นเครื่องมือปัจจุบันของฉันที่คุณเลือกสำหรับเวิร์กโฟลว์ frontend มีเครื่องมือสร้างชุดส่วนหน้ามากมายหลายแบบ ดูว่าคุณต้องการหรือไม่ แต่คุณอาจสูญหายไปในทะเลของไลบรารี JavaScript ใหม่ที่ออกใหม่ ฉันไม่ต้องการที่จะมีส่วนร่วมมากเกินไปที่นี่เช่นนี้เป็นมากกว่าการสอน PHP กว่า JS แต่ฉันต้องการที่จะแสดงวิธีการ gulp ควรจะกำหนดค่าให้ทำงานกับ Zend Expressive

สร้างแพคเกจ json ไฟล์ที่มีเนื้อหาเหล่านี้:

     {"ชื่อ": "แสดงออก""version": "1 - model maker online free. 0. 0","description": "","main": "index 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-rename": "^ 1. 2. 2","gulp-sass": "^ 3. 0","gulp-uglify": "^ 2. 1 2","gulp-usemin": "^ 0. 3 28"}"scripts": {"test": "echo \" ข้อผิดพลาด: ไม่มีการทดสอบที่ระบุ \ "&& exit 1"}"ผู้เขียน": "","ใบอนุญาต": "ISC"}    

รัน npm install คุณอาจต้องการเรียกใช้ npm update ด้วยถ้าคุณกำลังอ่านบทแนะนำนี้สักครู่หลังจากที่เขียน

จากนั้นสร้างไฟล์ gulpfile . งาน ('clean-css', function {return del ('สาธารณะ / css', {บังคับ: true});});อึก. task ('compile-sass', function {หอบกลับ src ('src / * / public / sass / ** / *. scss', {ฐาน: '. /'}) ท่อ (แคช ( 'รวบรวมเขื่อง')) ท่อ (sass บน ('error', sass logError)) pipe (เปลี่ยนชื่อ (function (path) {เส้นทาง. dirname = เส้นทาง dirname แทนที่ (/ ^ src \ / ([^ \ /] + \ /) สาธารณะ \ / sass /, '$ 1');})) ท่อ (อุ้มน้ำ dest ('สาธารณะ / css /'));});อึก. งาน ('สำเนา css', function {หอบกลับ src ('src / * / public / css / ** / *. css', {ฐาน: '. /'}) ท่อ (แคช ( 'คัดลอก CSS')) pipe (เปลี่ยนชื่อ (function (path) {เส้นทาง. dirname = เส้นทาง dirname แทนที่ (/ ^ src \ / ([^ \ /] + \ /) สาธารณะ \ / css /, '$ 1');})) ท่อ (อุ้มน้ำ dest ('สาธารณะ / css /'));});อึก. task ('minify-css', function {หอบกลับ src (['สาธารณะ / css / ** / *. css', '! public / css / ** / *. min. css'], {base: '. /'}) ท่อ (แคช ( 'ลดขนาด-CSS')) ท่อ (minifyCss ) pipe (เปลี่ยนชื่อ (function (path) {เส้นทาง. dirname = เส้นทาง dirname แทนที่ (/ ^ public \ / css /, '');})) pipe (เปลี่ยนชื่อ ({extname: '. min css'})). ท่อ (อุ้มน้ำ dest ('สาธารณะ / css'));});อึก. ('process-css', gulp. series (['คอมไพล์-sass', 'สำเนา css' ',' minify-css '));// ประมวลผล JSอึก. task ('clean-js', function {return del ('public / js', {force: true});});อึก. task ('copy-js', function {หอบกลับ src ('src / * / public / js / ** / *. js', {ฐาน: '. /'}) ท่อ (แคช ( 'คัดลอก js')) pipe (เปลี่ยนชื่อ (function (path) {เส้นทาง. dirname = เส้นทาง dirname แทนที่ (/ ^ src \ / ([^ \ /] + \ /) สาธารณะ \ / js /, '$ 1');})) ท่อ (อุ้มน้ำ dest ('สาธารณะ / js /'));});อึก. task ('minify-js', function {หอบกลับ src (['สาธารณะ / js / ** / *. js', '! public / js / ** / *. min. js'], {base: '. /'}) ท่อ (แคช ( 'ลดขนาด-js')) ท่อ (ทำให้น่าเกลียด ) pipe (เปลี่ยนชื่อ (function (path) {เส้นทาง. dirname = เส้นทาง dirname แทนที่ (/ ^ สาธารณะ \ / js /, '');})) pipe (เปลี่ยนชื่อ ({extname: '.min. js'}))) ท่อ (อุ้มน้ำ dest ('public / js'));});อึก. งาน ('process-js', gulp. series ('copy-js', 'minify-js'));// การประมวลผลภาพอึก. task ('clean-img', function {return del ('public / img', {force: true});});อึก. task ('process-img', function {หอบกลับ src ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', {ฐาน: '. /'}) ท่อ (แคช ( 'กระบวนการ img')) ท่อ (imagemin ) pipe (เปลี่ยนชื่อ (function (path) {เส้นทาง. dirname = เส้นทาง dirname แทนที่ (/ ^ src \ / ([^ \ /] + \ /) สาธารณะ \ / img /, '$ 1');})) ท่อ (อุโมงค์. dest ('สาธารณะ / img'));});// คำสั่งระดับบนสุดอึก. task ('default', gulp. แบบขนาน ('process-js', 'process-css', 'process-img'));อึก. งาน ('สะอาด', gulp ขนาน ('สะอาด js', 'สะอาด css', 'สะอาด - img'));อึก. task ('watch', function {อึก. ชม (['src / * / public / sass / ** / *. scss', 'src / * / public / css / **. *'), gulp. series ('process-css'));อึก. ชม ('src / * / public / js / ** / *. js', gulp. series ('process-js'));อึก. นาฬิกา ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', gulp. series ('process-img'));});

เรียกใช้ อึก และให้แน่ใจว่าทำงานโดยไม่มีข้อผิดพลาด

ตอนนี้คุณสามารถรัน อึก เพื่อรวบรวม sass, minify css, minify js และเพิ่มประสิทธิภาพภาพในทุกโมดูลของคุณ คุณสามารถทำตามที่ขึ้นกับ นาฬิกาอิมพัล เพื่อให้อุปกรณ์เหล่านี้ทั้งหมดได้รับการประมวลผลโดยอัตโนมัติเมื่อมีการเปลี่ยนแปลง โมดูลหน่วยความจำแคชช่วยให้มั่นใจได้ว่าไฟล์ที่มีการเปลี่ยนแปลงเท่านั้นที่ได้รับการประมวลผลจึงจะสามารถประมวลผลการเปลี่ยนแปลงได้อย่างรวดเร็ว

ทดสอบสิ่งนี้ด้วยการสร้างไฟล์เหล่านี้:

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

แล้ววิ่ง อ่ำ มองหาไฟล์ใน สาธารณะ / css / App , สาธารณะ / js / App หรือ สาธารณะ / img / App .

คำสั่งคอนโซล

และสุดท้าย แต่ก็ไม่น้อยคุณจะต้องมีวิธีการเรียกใช้คำสั่งคอนโซล เราจะใช้คอนโซลของ Symfony สำหรับสิ่งนี้ซึ่งได้จัดส่งมาพร้อมกับ Zend Semalt แล้วดังนั้นเราจึงไม่จำเป็นต้องใช้ด้วยตนเอง

สร้างไฟล์ที่เรียกว่า bin / console :

     #! / usr / bin / env php  {/ ** @var \ Interop \ Container \ ContainerInterface $ container * /$ container = ต้องใช้ 'config / container PHP ';$ app = new \ Symfony \ Component \ Console \ Application ('คอนโซลแอ็พพลิเคชัน');$ commands = $ container-> get ('config') ['console'] ['คำสั่ง'];foreach (คำสั่ง $ เป็น $ command) {$ แอป> เพิ่ม ($ container-> รับ ($ คำสั่ง));}$ แอป> Run   ;});    

จากนั้นคุณสามารถสร้างคำสั่ง Symfony และลงทะเบียนผ่านทาง config / autoload / console ทั่วโลก php หรือจากภายในโมดูลของคุณเช่นนี้

        ['commands' => [\ App \ Command \ HelloWorldCommand :: ชั้น]]];    

เพิ่มการอ้างอิงใด ๆ คำสั่งคอนโซลของคุณจำเป็นต้องสร้างเช่นเดียวกับชั้นอื่น ๆ ใน Expressive ตรวจสอบให้แน่ใจว่าได้เรียก parent :: __ construct ใน constructor ของคุณหรือคำสั่งของคุณจะไม่ทำงาน

นี่คือตัวอย่างคำสั่งที่มีการพึ่งพา:

        entityManager = $ entityManager;ผู้ปกครอง :: __ สร้าง (ชื่อ $);}/ *** กำหนดค่าคำสั่ง* /ป้องกันการกำหนดค่าฟังก์ชัน   {$ this-> setName ( 'สวัสดี')-> setDescription ('สวัสดี');}/ **ดำเนินการคำสั่งปัจจุบัน* /ฟังก์ชันป้องกัน (InputInterface $ input, OutputInterface $ output){$ output-> writeln ("Hello World!");// ทำอะไรกับ entityManager$ this-> entityManager-> ค้นหา (Blog \ Entity \ BlogEntity ');}}    

ใช้คำสั่งของคุณ:

     php bin / คอนโซลสวัสดี    

เราสามารถไปสักหน่อยและเพิ่มคนตัดไม้ นี้เป็นประโยชน์สำหรับการส่งผ่านไปยังรูปแบบการบริการที่ encapsulate จำนวนมากของตรรกะและต้องมีการแก้ปัญหาการเข้าสู่ระบบตลอด

เรียกใช้คำสั่งนี้:

     ต้องมี monolog / monolog symfony / monolog-bridge;    

จากนั้นให้เพิ่มค่านี้ลงในเมธอด execute ในคำสั่งของคุณ:

     ได้รับการป้องกันการทำงาน (inputInterface $ input, OutputInterface $ output){$ logger = new \ Monolog \ Logger ('collect-product-data');$ logger-> pushHandler (ใหม่ \ Symfony \ Bridge \ Monolog \ Handler \ ConsoleHandler ($ เอาท์พุท));$ logger-> debug ('Log something);}    

บทสรุป

ขณะนี้คุณพร้อมที่จะเริ่มต้นสร้างแอปพลิเคชันระดับองค์กรด้วยเครื่องมือทั้งหมดที่คุณต้องการได้จากปลายนิ้วของคุณ

ในโพสต์ถัดไปเราจะเริ่มเรียนรู้วิธีการสร้างโมดูลบนพื้นฐานนี้เริ่มต้นด้วยโมดูลบล็อก