Back to Question Center
0

سریع برنامه توسعه سازمانی با Zend Expressive            سریع برنامه توسعه سازمانی با Zend ExpressiveRelated Topics: FrameworksPerformance & ؛ ScaleDevelopment Semalt

1 answers:
Rapid Enterprise برنامه توسعه با Zend Expressive

اگر شما تا به حال شروع سریع Zend Semelt را انجام داده اید، احتمالا در Zend Semalt کار نکرده اید. شروع سریع از لحاظ تاریخی چیزی جز سریع نیست، و از بین رفتن علاقه و حرکت به سمت چیز بعدی آسان است.

Zend Expressive این تجربه را با فرمان create-project رانده شده توسط جادوگر بهبود می بخشد. با این حال، هنوز می تواند نا امید کننده برای راه اندازی، زیرا گزینه های زیادی برای جلوگیری از وجود دارد. این آموزش به شما از راه نصب توصیه شده برای توسعه سریع شما هدایت می کند
عملکرد یک سطح سازمانی، برنامه قوی - criador de logos para blog.

سریع برنامه توسعه سازمانی با Zend Expressiveسریع برنامه توسعه سازمانی با Zend ExpressiveRelated Topics:
ساختارهای ساخت و ساز و ScaleDevelopment Semalt

این آموزش درباره تنظیم محیط شما نیست، بنابراین فرض می کنم که شما یک محیط کار خوب مانند Homestead Improved دارید.

اگر شما با Semalt یا محیط مجازی مجازی آشنا نیستید، ما یک کتاب شگفت انگیز برای راهنمایی شما از مفاهیم موجود در فروشگاه ما در اینجا داشته ایم.

راه اندازی پروژه

پروژه خود را با اجرای فرمان زیر خود پوشه ای که پروژه های خود را حفظ می کنید ( Code در حومه بهبود یافته) شروع کنید:

     سازنده ایجاد کننده پروژه zendframework / zend-expressive-skeleton expressive    

از شما خواسته خواهد شد که تصمیمات چندانی در راه ایجاد کنید. از این پاسخ ها استفاده کنید:

  • چه نوع نصب شما می خواهید؟
    • مدولار
  • کدام ظرفیت را برای تزریق وابستگی استفاده می کنید؟
    • Zend ServiceManager
  • کدام روتر شما می خواهید از آن استفاده کنید؟
    • Zend Router
  • کدام قالب موتور را می خواهید استفاده کنید؟
    • Twig
  • کدام پردازنده خطا می خواهید در طول توسعه استفاده کنید؟
    • از دست دادن
  • لطفا انتخاب کنید کد پیکربندی که میخواهید Zend \ Validator \ ConfigProvider را تزریق کنید؟
    • پیکربندی / پیکربندی. php
  • این گزینه را برای بسته های دیگری از همان نوع به یاد داشته باشید؟
    • y

سپس این دستورات را اجرا کنید:

     cd expressive &&git init &&رنگ پیکربندی GIT ui true &&گیت اضافه کنید &&git commit -m "انجام اولیه" &&chmod -R + w data؛    

این یک مخزن را در پوشه تازه ایجاد شده راه اندازی می کند و داده پوشه قابل خواندن می کند.

سپس یک سرور php برای آزمایش با

     آهنگساز خدمت می کنند    

.و به http: // localhost: 8080 بروید و یا اگر از Homestead Improved استفاده می کنید، از IP VM یا میزبان مجازی بازدید کنید.

سریع برنامه توسعه سازمانی با Zend Expressiveسریع برنامه توسعه سازمانی با Zend ExpressiveRelated Topics:
ساختارهای ساخت و ساز و ScaleDevelopment Semalt

درک عرفانی

ساختار پوشه Semalt به نظر می رسد:

     بن /پیکربندی /داده ها/کش /عمومی/فهرست مطالب. پی اچ پیsrc /برنامهتست/AppTestفروشنده /    

اکثر آن خود توضیحی است. Expressive یک برنامه برنامه به طور پیش فرض فراهم می کند. شما می توانید تمام کد خود را در اینجا قرار دهید یا ماژول های جداگانه ای بسازید، همانطور که ویژگی های بزرگتری را ایجاد می کنید.

Semalt با برخی از دستورات دستی همراه است:

  • . / vendor / bin / expressive - ماژولهای ایجاد، ثبت نام و لغو عضویت. ایجاد یک کلاس middleware و غیره.
  • cs-fix آهنگساز - انجام یک استانداردهای کدگذاری در کد خود و رفع مشکلات، در صورت امکان.
  • تست آهنگساز - اجرای آزمون PHPUnit بر روی کد شما.
  • چک آهنگساز - نام مستعار برای اجرا cs-check ، سپس آزمون.

بیانگر همچنین با Handler خطا Whoops همراه است. برای آزمایش آن، باز src / App / src / Action / HomePageAction. php و type echo $ badVar در روش ، سپس صفحه را تازه سازی کنید. شما خطای روبرو Whoops را ببینید.

سریع برنامه توسعه سازمانی با Zend Expressiveسریع برنامه توسعه سازمانی با Zend ExpressiveRelated Topics:
ساختارهای ساخت و ساز و ScaleDevelopment Semalt

ارتقاء ضروری

بازتاب کارخانه خلاصه

Zend Expressive از Zend ServiceManager برای Dependency Semalt استفاده می کند. در تنظیمات پیش فرض، شما باید پیکربندی را اضافه کنید و به طور بالقوه یک کلاس کارخانه برای هر کلاس ای که می نویسید ایجاد کنید. بعد از انجام این دو بار، این کار دشوار است.

برای جلوگیری از این کار، کارخانه انتزاعی مبتنی بر انعکاس را با Zend Semalt تأمین می کنیم.

این را به config / autoload / dependencies اضافه کنید. جهانی است php در وابستگی آرایه:

     'abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: کلاس]،    

در حال حاضر، هر زمان که شما در یک کلاس کار می کنید و به وابستگی نیاز دارید، فقط آن را به سازنده اضافه کنید. کارخانه انتزاعی انعکاسی، آنچه را که نیاز شما را به خود اختصاص می دهد، می بیند و به طور خودکار آن را از ظرف سرویس می گیرد. شما فقط باید در حال حاضر در موارد استثنایی کارخانهای ایجاد کنید که در آن شما نیاز به چیزی متفاوت از سرویس پیش فرض ارائه شده توسط ظرف سرویس دارد.

اگر شما در مورد سرعت نگران هستید؛ در تولید، ما می توانیم یک فرایند را ایجاد کنیم که کارخانه های شما را برای کلاس های خود که توسط کارخانه انعکاس با فروشنده / bin / generate-factory-for-class کار می کنند، تولید کند.

دکترین

Zend Expressive هیچ ابزار پایگاه داده یا ORM را فراهم نمی کند. من بعد از تحقيقات زياد و ساختن چند ORM از خود، سمالت را به عنوان ORM انتخاب کردم. این فقط کار می کند

نصب Doctrine و Symfony Yaml از طریق آهنگساز:

     آهنگ ساز نیاز به dasprid / container-interop-doctrine symfony / yaml    

ایجاد یک فایل config / cli-config. php با این مطالب:

     <؟ phpاستفاده از Doctrine \ ORM \ Tools \ Console \ ConsoleRunner؛chdir (dirname (__ DIR__))؛نیاز به فروشنده / autoload. php '؛/ *** تابع ناشناس به نام خود که محدوده خاص خود را ایجاد می کند و فضای نامی جهان را تمیز نگه می دارد. * /بازگشت call_user_func (function    {/ **var \ Interop \ Container \ ContainerInterface \ $ container * /$ container = require 'config / container. php '؛$ entityManager = $ container-> دریافت (\ Doctrine \ ORM \ EntityManager :: class)؛بازگشت ConsoleRunner :: createHelperSet ($ entityManager)؛})؛    

محتویات config / autoload / dependencies را جایگزین کنید. جهانی است php با موارد زیر:

      <؟ phpاستفاده از Zend \ Expressive \ Applicationاز Zend \ Expressive \ Container استفاده کنیداز Zend \ Expressive \ Deleate استفاده کنیداز Zend \ Expressive \ Helper استفاده کنیداز Zend \ Expressive \ Middleware استفاده کنیدبرگشت [// ارائه خدمات گسترده خدمات // ما توصیه می کنیم با استفاده از نام کلاس های کامل که ممکن است به عنوان// نام سرویس 'وابستگی ها' =>  ['abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: کلاس]،// استفاده از aliases برای نام مستعار یک نام سرویس به سرویس دیگری. این// کلید نام مستعار است، ارزش سرویس که به آن اشاره می کند. نام سرویس را به// نام کلاس. 'invokables' => [// کاملا \ Qualified \ InterfaceName :: class => کاملا \ Qualified \ ClassName :: class\ Doctrine \ DBAL \ Logging \ DebugStack :: class => \ Doctrine \ DBAL \ Logging \ DebugStack :: class،Helper \ ServerUrlHelper :: class => Helper \ ServerUrlHelper :: کلاسMiddleware \ ImplicitHeadMiddleware :: class => Middleware / ImplicitHeadMiddleware :: classMiddleware \ ImplicitOptionsMiddleware :: class => Middleware / ImplicitOptionsMiddleware :: class]،// استفاده از "کارخانه ها" برای خدمات ارائه شده توسط callbacks / classes کارخانه. 'کارخانه ها' => [برنامه :: class => Container \ ApplicationFactory :: classنماینده \ NotFoundDelegate :: class => Container \ NotFoundDelegateFactory :: class\ Doctrine \ ORM \ EntityManager :: class => \ ContainerInteropDoctrine \ EntityManagerFactory :: classHelper \ ServerUrlMiddleware :: class => Helper \ ServerUrlMiddlewareFactory :: کلاسHelper \ UrlHelper :: class => Helper \ UrlHelperFactory :: کلاسHelper \ UrlHelperMiddleware :: class => Helper \ UrlHelperMiddlewareFactory :: classZend \ Straatigility \ Middleware \ ErrorHandler :: class => Container \ ErrorHandlerFactory :: classMiddleware / ErrorResponseGenerator :: class => Container / ErrorResponseGeneratorFactory :: classMiddleware \ NotFoundHandler :: class => Container \ NotFoundHandlerFactory :: class،]،]،]    

این فایل را برای راه اندازی درایور Doctrine config / autoload / doctrine ایجاد کنید. جهانی است php .

      <؟ phpبرگشت ['doctrine' =>  ['driver' => ['orm_default' => ['class' => \ Doctrine \ Common \ Persistence \ Mapping \ Driver \ MappingDriverChain :: class،'drivers' => []]،]،]،]    

این فایل را برای مدارک پایگاه داده خود ایجاد کنید config / autoload / doctrine. محلی. php .

      <؟ phpبرگشت ['doctrine' =>  ['connection' => ['orm_default' => ['params' => ['url' => 'mysql: // root: password1 @ localhost / expressive'،]،]،]،]،]    

تست با اجرای . / فروشنده / بن / دکترین . شما باید فورمه راهنمایی را ببینید

گلف

گپ ابزار من در حال حاضر منحصر به فرد برای گردش کار داخلی است. بسیاری از ابزارهای ایجاد ظاهر در دسترس هستند. اگر دوست دارید نگاه کنید، اما ممکن است در دریا از کتابخانه های جدید جاوا اسکریپت براق خارج شوید. من نمی خواهم این موضوع را بیش از پیش درگیر کنم چون این آموزش PHP بیشتر از JS است، اما من می خواهم نشان دهد که چطوری باید چطوری با Zend Expressive پیکربندی شود.

یک بسته ایجاد کنید. json فایل با این مطالب:

     {"نام": "بیانگر""نسخه": "0. 0. 0"،"شرح": ""،"main": "index. js""devDependencies": {"دل": "^ 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 .1 0"،"gulp-uglify": "^ 2 1. 2"،"gulp-usemin": "^ 0 3. 28"}،"اسکریپت ها": {"test": "echo \" خطا: بدون آزمون مشخص شده است "&& exit 1"}،"نویسنده": ""،"مجوز": "ISC"}    

اجرای npm نصب . شما ممکن است بخواهید 13 npm update را نیز اجرا کنید، اگر بعد از نوشتن این آموزش در حال خواندن است.

سپس، ایجاد یک gulpfile. task ('clean-css'، function {return del ('public / css'، {force: true})؛})؛گول زدن task ('compile-sass'، function {بازگشت src ('src / * / public / sass / ** / *. scss'، {base: '. /'}). pipe (cache (compile-sass)) pipe (sass . on ('error'، sass. logError)). لوله (تغییر نام (عملکرد (مسیر) {مسیر. dirname = path dirname جایگزین (/ ^ src \ / ([^ \ /] + \ /) public \ / sass /، '$ 1')؛})) لوله (gulp. dest ('public / css /'))؛})؛گول زدن task ('copy-css'، function {بازگشت src ('src / * / public / css / ** / *. css'، {base: '. /'}). pipe (cache ('copy-css')). لوله (تغییر نام (عملکرد (مسیر) {مسیر. dirname = path dirname جایگزین (/ ^ src \ / ([^ \ /] + \ /) public \ / css /، '$ 1')؛})) لوله (gulp. dest ('public / css /'))؛})؛گول زدن task ('minify-css'، function {بازگشت src (['public / css / ** / *. css'، '! public / css / ** / *. min. css']، {base: '. /'}). pipe (cache ('minify-css')). لوله (minifyCss ). لوله (تغییر نام (عملکرد (مسیر) {مسیر. dirname = path dirname جایگزین (/ ^ public \ / css /، '')؛})) pipe (rename ({extname: '. min css'})) لوله (gulp. dest ('public / css'))؛})؛گول زدن task ('process-css'، gulp series (['compile-sass'، 'copy-css']، 'minify-css'))؛// JS Processingگول زدن task ('clean-js'، function {return del ('public / js'، {force: true})؛})؛گول زدن task ('copy-js'، function {بازگشت src ('src / * / public / js / ** / *. js'، {base: '. /'}). pipe (cache ('copy-js')). لوله (تغییر نام (عملکرد (مسیر) {مسیر. dirname = path dirname جایگزین (/ ^ src \ / ([^ \ /] + \ /) public \ / js /، '$ 1')؛})) لوله (gulp. dest ('public / js /'))؛})؛گول زدن task ('minify-js'، function {بازگشت src (['public / js / ** / *. js'، '! public / js / ** / *. min. js']، {base: '. /'}) pipe (cache ('minify-js')) لوله (uglify ). لوله (تغییر نام (عملکرد (مسیر) {مسیر. dirname = path dirname جایگزین (/ ^ public \ / js /، '')؛})) لوله (تغییر نام ({extname: '. مین جی'})). لوله (gulp. 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}'، {base: '. /'}). pipe (cache ('process-img')) لوله (imagemin ) لوله (تغییر نام (عملکرد (مسیر) {مسیر. dirname = path dirname جایگزین (/ ^ src \ / ([^ \ /] + \ /) public \ / img /، '$ 1')؛})) لوله (gulp. dest ('public / img'))؛})؛// دستورات بالاگول زدن task ('default'، gulp. parallel ('process-js'، 'process-css'، 'process-img'))؛گول زدن وظیفه (پاک کردن، پاک کردن، موازی (clean-js، clean-css، clean-img))؛گول زدن وظیفه ('تماشا'، function {گول زدن watch (['src / * / public / sass / ** / *. scss'، 'src / * / public / css / ** / *. 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'))؛})؛

اجرا gulp و اطمینان حاصل کنید که آن را بدون خطا اجرا می شود.

اکنون می توانید برای جمع کردن sass، minify css، minify js و بهینه سازی تصاویر در همه ی ماژول های خود gulp را اجرا کنید. شما می توانید آن را با تماشای گلف دنبال کنید تا این همه به طور خودکار پردازش شوند به عنوان آنها تغییر یافته است. ماژول cache gulp تضمین می کند که فقط فایل های تغییر یافته همیشه پردازش شده اند، بنابراین این باید تغییرات بسیار سریع انجام دهد.

با ایجاد یکی از این فایلها این را آزمایش کنید:

  • src / برنامه / عمومی / ساس / sasstest. اس اس اس
  • src / app / public / css / test. CSS
  • src / برنامه / عمومی / js / تست. js
  • src / App / public / img / test. jpg

و سپس اجرا کنید gulp . به دنبال فایل ها در public / css / App ، public / js / App یا public / img / App .

دستورات کنسول

و آخرین، اما قطعا نه، شما باید یک راه برای اجرای دستورات کنسول نیاز دارید. ما برای این کنسول سیمفونی استفاده خواهیم کرد که قبلا با Zend Semalt حمل می شود، بنابراین ما نیازی به آنرا به صورت دستی نیاز نداریم.

ایجاد یک فایل با نام bin / console :

     #! / usr / bin / env php<؟ phpchdir (dirname (__ DIR__))؛نیاز به فروشنده / autoload. php '؛/ *** تابع ناشناس به نام خود که محدوده خاص خود را ایجاد می کند و فضای نامی جهان را تمیز نگه می دارد. * /call_user_func (function    {/ **var \ Interop \ Container \ ContainerInterface $ container * /$ container = require 'config / container. php '؛$ app = new \ Symfony \ Component \ Console \ Application ('کنسول برنامه')؛$ commands = $ container-> get ('config') ['console'] ['commands']؛foreach ($ دستورات به عنوان $ دستور) {$ app-> add ($ container-> get ($ command))؛}$ app-> run   ؛})؛    

سپس می توانید دستورات Symfony ایجاد کنید و آنها را از طریق config / autoload / console ثبت کنید. جهانی است php یا از داخل ماژول های شما مانند این:

      <؟ phpبرگشت ['console' =>  ['دستورات' => ​​[\ برنامه \ Command \ HelloWorldCommand :: کلاس]،]،]    

اضافه کردن هر گونه وابستگی دستورات کنسول شما نیاز به سازنده درست مثل هر کلاس دیگر در اکسپتیشن. اطمینان حاصل کنید که parent :: __ construct را در سازنده خود قرار دهید یا دستور شما کار نخواهد کرد.

در اینجا یک فرمان مثال با وابستگی است:

      <؟ phpفضای نام برنامه \ Command؛استفاده از Doctrine / ORM \ EntityManager؛از Monolog \ Logger استفاده کنیداستفاده از Symfony \ Component \ Console \ Command \ Command؛استفاده از Symfony \ Component \ Console \ Input \ InputArgument؛استفاده از Symfony \ Component \ Console \ Input \ InputInterface؛استفاده از Symfony \ Component \ Console \ Input \ InputOption؛استفاده از Symfony \ Component \ Console \ Output \ OutputInterface؛کلاس HellowWorld فرمان را گسترش می دهد{/ ***var EntityManager* /خصوصی $ entityManager؛تابع عمومی __construct (EntityManager $ entityManager، $ name = null){$ this->  entityManager = $ entityManager؛پدر و مادر :: __ ساخت ($ نام)؛}/ *** فرمان را تنظیم می کند* /محافظت شده تابع پیکربندی   {$ this-> setName ('hello')-> setDescription ('می گوید سلام')؛}/ *** فرمان فعلی را اجرا می کند* /اجرای تابع حفاظت شده (ورودی InputInterface $، خروجی OutputInterface $){$ خروجی-> writeln ("سلام جهان!")؛// انجام چیزی با entityManager$ this-> entityManager-> find ('Blog \ Entity \ BlogEntity')؛}}    

برای اجرای دستور:

     php bin / console hello    

ما می توانیم کمی بیشتر برویم و یک logger اضافه کنیم. این برای انتقال به مدل های خدماتی است که منطق زیادی را در بر می گیرد و نیاز به ورود به سیستم را دارد.

اجرای این دستور:

     آهنگساز نیاز به monolog / monolog symfony / monolog-bridge؛    

سپس، این را به روش اجرای خود در فرمان خود اضافه کنید:

     تابع حفاظت شده اجرا (ورودی InputInterface $، OutputInterface $ خروجی){$ logger = new \ Monolog \ Logger ('collect-product-data')؛$ logger-> pushHandler (جدید \ Symfony \ Bridge \ Monolog \ Handler \ ConsoleHandler ($ output))؛$ logger-> debug ('ورود به سیستم)؛}    

نتیجه گیری

اکنون آماده هستیم که یک برنامه کاربردی سطح سازمانی را با تمام ابزارهایی که همیشه می توانید در نوک انگشتان خود بخواهید، شروع کنید.

در پست بعدی ما شروع به یادگیری نحوه ساخت ماژول ها در این بنیاد خواهیم کرد، با شروع از یک ماژول وبلاگ.