Back to Question Center
0

Zend Expressive ile Hızlı Kurumsal Uygulama Geliştirme            Zend ExpressiveRelated Topics ile Hızlı Kurumsal Uygulama Geliştirme: ÇerçevelerPerformans & Ölçek Geliştirme Semalt

1 answers:
Hızlı Kurumsal Uygulama Geliştirme ve Zend İfadesi

Şimdiye kadar bir Zend Semalt hızlı başlangıç ​​yapmışsanız, muhtemelen Zend Semalt'ta hiç çalışmamışsınız demektir. Hızlı başlangıç, tarihsel olarak bir şey değil hızlı olmuştur ve ilgi kaybetmek ve bir sonraki adıma geçmek kolaydır.

Zend Expressive, sihirbaz tarafından yönlendirilen besteci create-project komutu ile bu deneyimi büyük ölçüde geliştirir. Bununla birlikte, kurulması çok zor olabilir çünkü ön hazırlık yapmak için çok seçenek vardır. Bu eğitim, sizi hızlı gelişme için önerilen kurulumda yönlendirir; bu,
kurumsal düzeyde, sağlam bir uygulama.

Zend Expressive ile Hızlı Kurumsal Uygulama GeliştirmeZend ExpressiveRelated Topics ile Hızlı Kurumsal Uygulama Geliştirme:
ÇerçevelerPerformans ve Ölçek Geliştirme Semalt

Bu eğitim ortamınızı kurmakla ilgili değil, bu nedenle Homestead Improved gibi iyi bir çalışma ortamına sahip olduğunuzu varsayacağım.

Semalt'a veya izole edilmiş sanal ortamlara aşina değilseniz, buradaki mağazamızdaki kavramları size rehberlik edecek harika bir kitaba sahibiz.

Proje Ayarı

Aşağıdaki komutu çalıştırarak projenizi başlatın: projelerinizi sakladığınız klasöre ( Homestead Geliştirilmiş kodunda :

     besteci yaratma-proje zendframework / zend-expressive-skeleton expressive    

Yol boyunca birkaç karar vermeniz istenecektir. Bu cevapları kullanın:

  • Ne tür bir kurulum istersiniz?
    • Modüler
  • Bağımlılık enjeksiyonu için hangi kapta kullanmak istiyorsunuz?
    • Zend Servis Yöneticisi
  • Hangi yönlendirici kullanmak istiyorsunuz?
    • Zend Router
  • Hangi şablon motoru kullanmak istiyorsunuz?
    • Sarı
  • Geliştirme sırasında hangi hata işleyicisini kullanmak istiyorsunuz?
    • Boks
  • Lütfen hangi yapılandırma dosyasını 'Zend \ Validator \ ConfigProvider' içine enjekte etmek istediğinizi seçin?
    • config / config. php
  • Aynı türün diğer paketleri için bu seçeneği hatırla?
    • y

Ardından şu komutları çalıştırın:

     cd expressive &&git init &&git yapılandırma rengi. ui doğru &&git ekle. &&git commit -m "İlk çalıştırma" &&chmod -R + w veri;    

Bu, yeni oluşturulan klasördeki bir depoyu başlatır ve veri klasörünü yazılabilir yapar.

Ardından, test için bir php sunucusunu başlatıp

     besteci hizmet    

.ve http: // localhost: 8080'e göz atın veya Homestead Geliştirilmiş'i kullanıyorsanız VM'nin IP veya sanal ana bilgisayarını ziyaret edin.

Zend Expressive ile Hızlı Kurumsal Uygulama GeliştirmeZend ExpressiveRelated Topics ile Hızlı Kurumsal Uygulama Geliştirme:
ÇerçevelerPerformans ve Ölçek Geliştirme Semalt

Anlamlı Anlatım

Semalt klasör yapısı şu şekildedir:

     bin /config /veri/önbellek /halka açık/indeks. phpsrc /UygulamaÖlçek/AppTestsatıcı /    

Çoğu kendiliğinden açıklayıcıdır. Expressive, varsayılan olarak bir Uygulama modülü sağlar. Tüm kodlarınızı buraya koyabilir veya daha büyük özellikler oluşturduğunuzda ayrı modüller inşa edebilirsiniz.

Semalt, bazı kullanışlı komutlarla gelir:

  • . / vendor / bin / expressive - Modülleri oluşturun, kaydedin ve kayıt sildirin. Katmanlı sınıf oluşturun, vb.
  • besteci cs-fix - Kodunuz üzerinde bir kodlama standartları kontrolü yapın ve mümkün olduğunda sorunları düzeltin.
  • besteci testi - Kodunuzda PHPUnit testlerini çalıştırın.
  • besteci kontrolü - koşu için Alias ​​ cs-kontrolü , daha sonra test.

Expressive ayrıca Whoops hata işleyicisi ile birlikte gelir. Test etmek için, src / App / src / Action / HomePageAction'ı açın. php ve type , process yönteminde $ badVar yankılandığında sayfayı yenileyin. Whoops hata işleyicisini göreceksiniz.

Zend Expressive ile Hızlı Kurumsal Uygulama GeliştirmeZend ExpressiveRelated Topics ile Hızlı Kurumsal Uygulama Geliştirme:
ÇerçevelerPerformans ve Ölçek Geliştirme Semalt

Gerekli İyileştirmeler

Yansıma Esaslı Soyut Fabrika

Zend Expressive, Bağımlılık Semalt için Zend ServiceManager'ı kullanır. Varsayılan kurulumda yapılandırmayı eklemeniz ve yazdığınız her sınıfa bir fabrika sınıfı oluşturmanız gerekir. Bunu yaklaşık iki kez yaptıktan sonra külfetli hissediyor.

Bunu önlemek için, Zend Semalt'ın sağladığı yansıma temelli soyut fabrikayı etkinleştiririz.

Bunu config / autoload / dependencies'a ekle. küresel. php bağımlılıkları içinde dizi:

     'abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: sınıf],    

Şimdi, bir sınıfta çalışırken bağımlılığa ihtiyaç duyarsanız, yapıcınıza ekleyin. Yansıma soyut fabrikası sınıfınızın ihtiyaçlarını görecek ve onu servis kabından otomatik olarak yakalayacaktır. Yalnızca, servis konteyneri tarafından sağlanan varsayılan hizmetten farklı bir şeye ihtiyacınız olan istisnai durumlarda fabrikalar oluşturmanız yeterlidir.

Hız konusunda endişeleriniz varsa; Üretimde, yansıma fabrikası tarafından işlenmekte olan sınıflarınız için fabrikalar üreten bir işleme sahip olabiliriz satıcı sınıfı / bin / generate-factory .

Doktrin

Zend Expressive hiçbir veritabanı takım veya ORM sağlamaz. Çok araştırma yaptıktan ve kendi ORM'lerimden birkaçını kurduktan sonra Semalt'ı tercih ettiğim ORM olarak seçtim. Sadece işe yarıyor.

Doktrin ve Symfony Yaml'ı Besteci vasıtasıyla kurun:

     besteci dasprid / container-interop-doktrene ihtiyaç duyar symfony / yaml    

Bir dosya oluştur config / cli-config. php içeriği şu şekildedir:

       {/ ** \var \ Interop \ Container \ ContainerInterface \ $ container * /$ container = require 'config / container. PHP ';$ entityManager = $ kapsayıcı-> alın (\ Doctrine \ ORM \ EntityManager :: class);return ConsoleRunner :: createHelperSet ($ varlık yöneticisi);});    

config / autoload / bağımlılıkların içeriğini değiştirin. küresel. php aşağıdakilerle:

        ['soyut_fakterler' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: sınıf],// Bir hizmet adını başka bir hizmetle takma yapmak için 'takma adlar' kullanın.// anahtar, takma ad olup, değer, onu işaret ettiği servistir. Bir hizmet adını// sınıf adı. 'invokables' => [// Fully \ Qualified \ InterfaceName :: sınıf => Fully \ Qualified \ ClassName :: class,\ Doctrine \ DBAL \ Logging \ DebugStack :: sınıf => \ Doctrine \ DBAL \ Logging \ DebugStack :: class,Yardımcı \ SunucuUrlHelper :: sınıf => Yardımcı \ ServerUrlHelper :: sınıf,Middleware \ ImplicitHeadMiddleware :: class => Middleware \ ImplicitHeadMiddleware :: class,Middleware \ ImplicitOptionsMiddleware :: class => Middleware \ ImplicitOptionsMiddleware :: class,],// Geri arama / fabrika sınıfları tarafından sağlanan hizmetler için 'fabrikalar' kullanın. 'fabrikalar' => [Uygulama :: sınıf => Konteyner \ UygulamaFaktörü :: sınıf,Delegate \ NotFoundDelegate :: class => Konteyner \ NotFoundDelegateFactory :: class,\ Doctrine \ ORM \ EntityManager :: sınıf => \ KonteynerInteropDoctrine \ EntityManagerFactory :: class,Yardımcı \ SunucuUrlMiddleware :: sınıf => Yardımcı \ ServerUrlMiddlewareFactory :: sınıf,Helper \ UrlHelper :: class => Yardımcı \ UrlHelperFactory :: class,Yardımcı \ UrlHelperMiddleware :: sınıf => Yardımcı \ UrlHelperMiddlewareFactory :: class,Zend \ Stratigility \ Middleware \ ErrorHandler :: class => Konteyner \ ErrorHandlerFactory :: class,Middleware \ ErrorResponseGenerator :: class => Konteyner \ ErrorResponseGeneratorFactory :: class,Middleware \ NotFoundHandler :: class => Konteyner \ NotFoundHandlerFactory :: class,],],];    

Doctrine sürücüsü config / autoload / doctrine'i kurmak için bu dosyayı oluşturun. küresel. php .

        ['sürücü' => ['orm_default' => ['class' => \ Doktrin \ Common \ Persistence \ Mapping \ Driver \ MappingDriverChain :: class,'sürücüler' => [],],],],];    

Bu dosyayı veritabanı kimlik bilgileriniz için oluşturun config / autoload / doctrine. yerel. php .

        ['bağlantı' => ['orm_default' => ['params' => ['url' => 'mysql: // kök: password1 @ localhost / expressive',],],],],];    

Çalıştırarak test edin . / vendor / bin / doctrine . Yardım istemini görmelisiniz.

Gulp

Gulp, ön uç iş akışı için seçtiğim mevcut araçtır. Kullanılabilecek çok sayıda ön uç oluşturma aracı vardır. İsterseniz bakın, ancak parlak yeni JavaScript kütüphanelerinin denizinde kaybolabilirsin. Burada çok fazla yer almak istemiyorum, çünkü bu JS'den çok daha PHP öğreticisi, fakat gulp'un Zend Expressive ile çalışacak şekilde yapılandırılması gerektiğini göstermek istiyorum.

Bir paket oluşturun . json dosyası şu içeriğe sahip:

     {"isim": "ifade","sürüm": "1. 0. 0","açıklama": "","main": "dizin 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. 1. 0","gulp-uglify": "^ 2. 1. 2","gulp-usemin": "^ 0 .3 28"},"senaryo": {"test": "echo \" Hata: hiçbir test belirtilmedi \ "&& exit 1"},"Yazar": "","lisans": "ISC"}    

Çalıştır npm kurulumu . Yazıldıktan bir süre sonra bu öğreticiyi okurken, npm güncelleştirmesini çalıştırmak isteyebilirsiniz.

Daha sonra, bir gulp dosyası oluşturun. görev ('clean-css', işlev {return del ('public / css', {force: true});});yudum. görev ('compile-sass', işlev {dönüş gulp. src ('src / * / public / sass / ** / *. scss', {base: '. /'}). Boru (önbellek ( 'derleme sass')). boru (sass . açık ('hata', sas. logError)). boru (rename (function (path) {yolu. dirname = yol. dizinadı. replace (/ ^ src \ / ([^ \ /] + \ /) public \ / sass /, '$ 1');})). boru (savunma dest ('public / css /'));});yudum. görev ('copy-css', function {dönüş gulp. src ('src / * / public / css / ** / *. css', {taban: '. /'}). boru (cache ( 'kopya-css')). boru (rename (function (path) {yolu. dirname = yol. dizinadı. replace (/ ^ src \ / ([^ \ /] + \ /) public \ / css /, '$ 1');})). boru (savunma dest ('public / css /'));});yudum. görev ('minify-css', işlev {dönüş gulp. src (['public / css / ** / *. css', '! public / css / ** / *. min. css'], {base: '. /'}). Boru (önbellek ( 'küçültmek-Css')). Boru (minifyCss ). boru (rename (function (path) {yolu. dirname = yol. dizinadı. Değiştir (/ ^ public \ / css /, '');})). pipe (rename ({extname: '. min. css'})). boru (boşaltmak dest ('public / css'));});yudum. Görev ('process-css', yalın seriler (['derleme-sas', 'cc-css'], 'minify-css'));// JS İşlemeyudum. görev ('clean-js', function {return del ('public / js', {force: true});});yudum. görev ('copy-js', function {dönüş gulp. src ('src / * / public / js / ** / *. js', {base: '. /'}). boru (cache ( 'kopya-js')). boru (rename (function (path) {yolu. dirname = yol. dizinadı. replace (/ ^ src \ / ([^ \ /] + \ /) public \ / js /, '$ 1');})). pipe (gulp dest ('public / js /'));});yudum. görev ('minify-js', işlev {dönüş gulp. src (['public / js / ** / *. js', '! public / js / ** / *. dak. js'], {base: '. /'}). Boru (önbellek ( 'küçültmek-js')). Boru (çirkinleştirmek ). boru (rename (function (path) {yolu. dirname = yol. dizinadı. Değiştir (/ ^ public \ / js /, '');})). pipe (rename ({extname: '. min. js'})). boru (boşaltmak dest ('public / js'));});yudum. görev ('process-js', yudum dizisi ('copy-js', 'minify-js'));// Görüntü işlemeyudum. görev ('clean-img', function {return del ('public / img', {force: true});});yudum. görev ('process-img', işlev {dönüş gulp. src ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', {base: '. /'}). Boru (önbellek ( 'işlem IMG)). Boru (imagemin ). boru (rename (function (path) {yolu. dirname = yol. dizinadı. replace (/ ^ src \ / ([^ \ /] + \ /) public \ / img /, '$ 1');})). boru (gulp dest ('public / img'));});// Üst düzey komutlaryudum. görev ('varsayılan', yalın paralel ('process-js', 'process-css', 'process-img'));yudum. görev ('clean', parmak paralel ('clean-js', 'clean-css', 'clean-img'));yudum. görev ('izle', işlev {yudum. watch (['src / * / public / sass / ** / *. scss', 'src / * / public / css / ** / *. css'], gulp serisi ('process-css'));yudum. watch ('src / * / public / js / ** / *. js', gulp serisi ('process-js'));yudum. izle ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', gulp serisi ('process-img'));});

Çalkantı çalıştırın ve hatasız çalışmasını sağlayın.

Şimdi sass'ı derlemek, CSS'yi küçültmek, j'leri küçültmek ve tüm modüllerinizdeki görüntüleri optimize etmek için gulp komutunu uygulayabilirsiniz. Bunların hepsini değiştirdikçe otomatik olarak işlemek için bunu gulp izle ile takip edebilirsiniz. Önbellek gulp modülü, yalnızca değiştirilen dosyaların işlenmesini sağlar, böylece bu değişiklikler çok hızlı bir şekilde işlenmelidir.

Bunu, şu dosyalardan birini yaratarak test edin:

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

Sonra yalpalayın çalıştırın. public / css / App , public / js / App veya public / img / App dosyalarını arayın.

Konsol Komutları

Son olarak, ama kesinlikle en az değil, konsol komutlarını çalıştırmanın bir yoluna ihtiyacınız olacak. Bunun için Symfony'nin Konsolu'nu kullanacağız, Zend Semalt ile birlikte zaten gönderildiğinden elle bunu yapmamız gerekmiyor.

bin / konsol adlı bir dosya oluşturun:

     #! / Usr / bin / env php  {/ ** @var \ Interop \ Container \ ContainerInterface $ kapsayıcı * /$ container = require 'config / container. PHP ';$ app = yeni \ Symfony \ Component \ Console \ Application ('Uygulama konsolu');$ commands = $ container-> get ('config') ['console'] ['commands'];foreach ($ komutu olarak $ komut) {$ App-> ($ Konteynerler> get ($ komutu)) ekleyin;}$ App-> run   ;});    

Ardından Symfony komutları oluşturabilir ve bunları config / autoload / console aracılığıyla kaydedebilirsiniz. küresel. php veya modüllerinizin içinden şu şekilde:

        ['komutlar' => [\ App \ Command \ HelloWorldCommand :: sınıf,],],];    

Konsol komutlarınızın Expressive'daki diğer sınıflar gibi yapıcıya gereken bağımlılıkları ekleyin. Kurucunuzda parent :: __ construct öğesini çağırın. Aksi takdirde komutunuz çalışmaz.

İşte bağımlılığı olan bir örnek komut:

        entityManager = $ entityManager;ebeveyn :: __ construct ($ isim);}/ *** Komutu yapılandırır* /korunan işlev configure   {$ This-> isimAta ( 'merhaba')-> setDescription ('Merhaba deyin');}/ *** Geçerli komutu yürütür* /protected function execute (InputInterface $ girişi, OutputInterface $ çıktısı){$ çıktı-> writeln ("Merhaba Dünya!");// entityManager ile bir şeyler yapın$ This-> entityManager-> find ( '\ Varlık \ BlogEntity Blog');}}    

Komutanızı çalıştırmak için:

     php bin / console hello    

Biraz daha ilerleyebilir ve bir günlükçü ekleyebiliriz. Bu, bir sürü mantığı kapsayan ve gün boyunca hata ayıklama günlüğüne ihtiyaç duyan hizmet modellerine geçmek için kullanışlıdır.

Bu komutu çalıştırın:

     besteci monolog / monolog symfony / monolog köprü gerektirir;    

Ardından, bunu komutunuzdaki execute yöntemine ekleyin:

     korumalı fonksiyon execute (InputInterface $ input, OutputInterface $ output){$ logger = new \ Monolog \ Logger ('toplama-ürün-verisi');$ logger-> pushHandler (yeni \ Symfony \ Bridge \ Monolog \ Handler \ ConsoleHandler ($ çıktı));$ logger-> hata ayıklama ('Bir şey yaz);}    

Sonuç

Artık parmaklarınızın ucunda istediğiniz herhangi bir araçla kurumsal düzeyde bir uygulama oluşturmaya hazırsınız.

Bir sonraki yazıda, bu temelde modüllerin nasıl oluşturulacağını öğrenmeye başlayacağız, bir blog modülü ile başlayacağız.