Back to Question Center
0

Pembangunan Aplikasi Rapid Enterprise dengan Zend Expressive            Pembangunan Aplikasi Rapid Enterprise dengan Topik Zend ExpressiveRelated: Rangka KerjaPerformans & ScalingDevelopment Semalt

1 answers:
Pembangunan Aplikasi Rapid Enterprise dengan Zend Expressive

Jika anda pernah melakukan permulaan Zend Semalt, anda mungkin tidak pernah bekerja di Zend Semalt. Permulaan yang cepat secara sejarah telah menjadi apa-apa tetapi cepat, dan mudah kehilangan minat dan bergerak ke perkara seterusnya.

Zend Expressive sangat bertambah baik dengan pengalaman ini dengan arahan pencipta-pencipta pencipta wizard . Walau bagaimanapun, ia masih boleh menjadi sukar untuk ditubuhkan kerana terdapat begitu banyak pilihan untuk membuat muka. Tutorial ini membimbing anda melalui persediaan yang disyorkan untuk pembangunan pesat yang akan
menghasilkan tahap perusahaan, aplikasi yang mantap.

Pembangunan Aplikasi Rapid Enterprise dengan Zend ExpressivePembangunan Aplikasi Rapid Enterprise dengan Topik Zend ExpressiveRelated:
Rangka KerjaPerformance & ScalingDevelopment Semalt

Tutorial ini bukan mengenai persekitaran anda, jadi saya akan mengandaikan bahawa anda mempunyai persekitaran kerja yang baik seperti Homestead Improved.

Jika anda tidak biasa dengan persekitaran maya semalat atau terpencil, kami mempunyai sebuah buku yang menarik untuk membimbing anda melalui konsep-konsep yang terdapat di kedai kami di sini.

Persediaan Projek

Mulakan projek anda dengan menjalankan arahan berikut folder anda di mana anda menyimpan projek anda ( Kod di Homestead Improved):

  komposer membuat projek zendframework / zend-expressive-skeleton ekspresif   

Anda akan diminta membuat beberapa keputusan di sepanjang jalan. Gunakan jawapan ini:

  • Apakah jenis pemasangan yang anda mahu?
    • Modular
  • Bekas mana yang anda mahu gunakan untuk suntikan ketergantungan?
    • Zend ServiceManager
  • Penghala yang anda mahu gunakan?
    • Zend Router
  • Enjin templat mana yang anda mahu gunakan?
    • Twig
  • Yang manakah pengendali kesilapan yang anda mahu gunakan semasa pembangunan?
    • Whoops
  • Sila pilih fail konfig yang anda ingin suntikan 'Zend \ Validator \ ConfigProvider' ke?
    • config / config. php
  • Ingat pilihan ini untuk pakej lain dengan jenis yang sama?
    • y

Kemudian, jalankan arahan ini:

  cd ekspresif & &git init &&warna git config. ui true &&tambah git. &&git commit -m "Komit awal" &&chmod -R + w data;   

Ini memulakan repositori dalam folder yang baru dibuat dan menjadikan folder data ditulis.

Kemudian, mulakan pelayan php untuk ujian dengan

  penyusun komposer   

.dan semak imbas ke http: // localhost: 8080 atau hanya kunjungi IP atau hos maya VM jika anda menggunakan Homestead Improved.

Pembangunan Aplikasi Rapid Enterprise dengan Zend ExpressivePembangunan Aplikasi Rapid Enterprise dengan Topik Zend ExpressiveRelated:
Rangka KerjaPerformance & ScalingDevelopment Semalt

Memahami Ekspresif

Struktur folder Semalt kelihatan seperti ini:

    bin /config /data /cache /awam /indeks. phpsrc /Aplikasiujian /AppTestvendor /   

Kebanyakannya adalah penjelasan diri. Ekspresikan menyediakan modul App secara lalai. Anda boleh meletakkan semua kod anda di sini, atau membina modul berasingan semasa anda membina ciri yang lebih besar.

Semalt dilengkapi dengan beberapa arahan berguna:

  • . / vendor / bin / expressive - Membuat, mendaftarkan, dan membatalkan pendaftaran modul. Buat kelas middleware, dan sebagainya.
  • komposer cs-fix - Melakukan cek kod pengekodan pada kod anda dan atur masalah, jika mungkin.
  • ujian komposer - Jalankan ujian PHPUnit pada kod anda.
  • cek komposer - Alias ​​untuk berjalan cs-cek , kemudian ujian.

Expressive juga datang dengan pengendali kesalahan Whoops. Untuk mengujinya, buka src / App / src / Action / HomePageAction. php dan ketik echo $ badVar dalam kaedah proses , kemudian muat semula halaman. Anda akan melihat pengendali ralat Whoops.

Pembangunan Aplikasi Rapid Enterprise dengan Zend ExpressivePembangunan Aplikasi Rapid Enterprise dengan Topik Zend ExpressiveRelated:
Rangka KerjaPerformance & ScalingDevelopment Semalt

Penambahbaikan Perlu

Pabrik Abstrak Berdasarkan Refleksi

Zend Expressive menggunakan Zend ServiceManager for Dependency Semalt. Dalam persediaan lalai, anda perlu menambah konfigurasi dan berpotensi membuat kelas kilang untuk setiap kelas yang anda tulis. Ini terasa berat selepas melakukan ini dua kali.

Untuk mengelakkan ini, kami akan membolehkan kilang abstrak berasaskan refleks yang disediakan dengan Zend Semalt.

Tambah ini kepada config / autoload / dependencies. global. php dalam array ketergantungan :

  'abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: class],   

Sekarang, setiap kali anda bekerja dalam kelas dan memerlukan pergantungan, tambahkan saja kepada pembina anda. Keseimbangan abstrak kilang akan melihat apa keperluan kelas anda dan secara automatik mengambilnya dari bekas perkhidmatan. Anda hanya perlu membuat kilang sekarang dalam kes-kes yang luar biasa di mana anda memerlukan sesuatu yang berbeza dari perkhidmatan lalai yang disediakan oleh bekas perkhidmatan.

Jika anda bimbang tentang kelajuan; Dalam pengeluaran, kita boleh mempunyai proses yang menghasilkan kilang untuk kelas anda yang ditangani oleh kilang pantulan dengan vendor / bin / generate-factory-for-class .

Doktrin

Zend Expressive tidak menyediakan alat pangkalan data atau ORM. Saya telah memilih Semalt sebagai pilihan ORM saya selepas banyak penyelidikan dan membina beberapa ORM sendiri. Ia hanya berfungsi.

Pasang Doktrin dan Symfony Yaml melalui Komposer:

  komposer memerlukan dasprid / wadah-interop-doktrin symfony / yaml   

Buat fail config / cli-config. php dengan kandungan ini:

    {/ ** @var \ Interop \ Container \ ContainerInterface \ $ container * /$ container = memerlukan 'config / container. php ';$ entityManager = $ container-> get (\ Doctrine \ ORM \ EntityManager :: class);kembali ConsoleRunner :: createHelperSet ($ entityManager);});   

Gantikan kandungan dari config / autoload / dependencies. global. php dengan yang berikut:

   ['abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: class],// Gunakan 'alias' untuk memanggil nama perkhidmatan ke perkhidmatan lain. The/ / kunci adalah nama alias, nilai adalah perkhidmatan yang menunjukkannya. Peta nama perkhidmatan kepada/ // nama kelas. 'invokables' => [// Sepenuhnya \ Berkualifikasi \ InterfaceName :: class => Sepenuhnya \ Berkualifikasi \ ClassName :: kelas,\ Doctrine \ DBAL \ Logging \ DebugStack :: class => \ Doctrine \ DBAL \ Logging \ DebugStack :: class,Helper \ ServerUrlHelper :: class => Helper \ ServerUrlHelper :: class,Middleware \ ImplicitHeadMiddleware :: class => Middleware \ ImplicitHeadMiddleware :: kelas,Middleware \ ImplicitOptionsMiddleware :: class => Middleware \ ImplicitOptionsMiddleware :: kelas,],// Gunakan 'kilang' untuk perkhidmatan yang disediakan oleh kelas panggilan / kilang. 'kilang' => [Permohonan :: class => Container \ ApplicationFactory :: class,Delegate \ NotFoundDelegate :: class => Container \ 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 => Container \ ErrorHandlerFactory :: class,Middleware \ ErrorResponseGenerator :: class => Container \ ErrorResponseGeneratorFactory :: class,Middleware \ NotFoundHandler :: class => Container \ NotFoundHandlerFactory :: class,],],];   

Buat fail ini untuk menyediakan doktrin pemandu config / autoload / doktrin. global. php .

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

Buat fail ini untuk kelayakan pangkalan data anda config / autoload / doktrin. tempatan. php .

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

Uji dengan berjalan . / vendor / bin / doktrin . Anda harus melihat bantuan segera.

Gulp

Gulp adalah alat pilihan saya saat ini untuk alur kerja frontend. Terdapat banyak alat binaan frontend yang tersedia. Lihat jika anda suka, tetapi anda mungkin tersesat di laut perpustakaan JavaScript yang berkilat di luar sana. Saya tidak mahu terlalu terlibat di sini kerana ini lebih banyak tutorial PHP daripada JS, tetapi saya ingin menunjukkan betapa jurangnya perlu dikonfigurasi untuk bekerja dengan Zend Expressive.

Buat pakej . json fail dengan kandungan ini:

  {"nama": "ekspresif","versi": "1. 0. 0","penerangan": "","utama": "indeks js","devDependencies": {"del": "^ 3.0.0","gulat": "github: gulpjs / gulp # 4.0","gulp-cache": "^ 1. 1. 1","gulp-imagemin": "^ 3. 3. 0","gulp-minify-css": "^ 1. 2. 4","gulp-rename": "^ 1 2. 2.""gulp-sass": "^ 3. 0","menegangkan": "^ 2. 1. 2","gulp-usemin": "^ 0. 3. 28"},"skrip": {"test": "echo \" Error: no test specified \ "&& exit 1"},"pengarang": "","lesen": "ISC"}   

Jalankan npm pasang . Anda mungkin mahu menjalankan pembaruan npm npm juga, jika anda membaca tutorial ini beberapa saat selepas ia ditulis.

Kemudian, buat gulpfile. tugas ('clean-css', function {kembali del ('public / css', {force: true});});menendang. tugas ('compile-sass', function {gulp pulangan. src ('src / * / public / sass / ** / *. scss', {base: '. /'}). paip (cache ('compile-sass')). paip (sass . pada ('ralat', sass. logError)). paip (rename (function (path) {jalan. dirname = jalan. dirname. menggantikan (/ ^ src / / ([^ \ /] + \ /) public \ / sass /, '$ 1');})). paip (gulp dest ('awam / css /'));});menendang. tugas ('copy-css', function {gulp pulangan. src ('src / * / public / css / ** / *. css', {base: '. /'}). paip (cache ('copy-css')). paip (rename (function (path) {jalan. dirname = jalan. dirname. menggantikan (/ ^ src / / ([^ \ /] + \ /) public \ / css /, '$ 1');})). paip (gulp dest ('awam / css /'));});menendang. tugas ('minify-css', function {gulp pulangan. src (['public / css / ** / *. css', '! public / css / ** / *. min css'], {base: '. /'}). paip (cache ('minify-css')). paip (minifyCss ). paip (rename (function (path) {jalan. dirname = jalan. dirname. menggantikan (/ ^ awam \ / css /, '');})). paip (menamakan semula ({extname: '. min css'})). paip (gulp dest ('awam / css'));});menendang. tugas ('process-css', gulp siri (['compile-sass', 'copy-css'], 'minify-css'));// // Pemprosesan JSmenendang. tugas ('clean-js', function {return del ('public / js', {force: true});});menendang. tugas ('copy-js', function {gulp pulangan. src ('src / * / public / js / ** / *. js', {base: '. /'}). paip (cache ('copy-js')). paip (rename (function (path) {jalan. dirname = jalan. dirname. menggantikan (/ ^ src / / ([^ \ /] + \ /) public \ / js /, '$ 1');})). paip (gulp dest ('awam / js /'));});menendang. tugas ('minify-js', function {gulp pulangan. src (['public / js / ** / *. js', '! public / js / ** / * .ms js'], {base: '. /'}). paip (cache ('minify-js')). paip (uglify ). paip (rename (function (path) {jalan. dirname = jalan. dirname. menggantikan (/ ^ awam \ / js /, '');})). paip (menamakan semula ({extname: '. min js'})). paip (gulp dest ('awam / js'));});menendang. tugas ('process-js', gulp siri ('copy-js', 'minify-js'));// Pemprosesan imejmenendang. tugas ('clean-img', function {kembali del ('awam / img', {force: true});});menendang. tugas ('process-img', function {gulp pulangan. src ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', {base: '. /'}). paip (cache ('process-img')). paip (imagemin ). paip (rename (function (path) {jalan. dirname = jalan. dirname. menggantikan (/ ^ src / / ([^ \ /] + \ /) awam \ / img /, '$ 1');})). paip (gulp dest ('awam / img'));});/ // Arahan peringkat atasmenendang. tugas ('default', gulp selari ('proses-js', 'proses-css', 'proses-img'));menendang. tugas ('bersih', memukul selari ('clean-js', 'clean-css', 'clean-img');menendang. tugas ('watch', function {menendang. menonton ('src / * / public / sass / ** / * .scss', 'src / * / public / css / ** / * .css'], gulp siri ('process-css'));menendang. menonton ('src / * / public / js / ** / *. js', gulp siri ('process-js'));menendang. menonton ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', gulp siri ('process-img'));});

Jalankan menendang dan pastikan ia berjalan tanpa kesilapan.

Kini anda boleh menjalankan menegak untuk menyusun sass, meminimumkan css, meminimumkan js, dan mengoptimumkan imej merentas semua modul anda. Anda boleh mengikuti itu dengan menegak menonton untuk semua ini akan diproses secara automatik apabila ia diubah. Modul gulp cache memastikan bahawa hanya menukar fail yang pernah diproses supaya ini perlu memproses perubahan dengan cepat.

Uji ini dengan membuat salah satu fail ini:

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

Kemudian lari meneguk . Cari fail dalam awam / css / App , awam / js / App , atau awam / img /.

Perintah konsol

Dan yang terakhir, tetapi tidak kurang penting, anda memerlukan satu cara untuk menjalankan arahan konsol. Kami akan menggunakan Symfony's Console untuk ini, yang sudah diangkut dengan Zend Semalt sehingga kami tidak perlu secara manual memerlukannya.

Buat fail yang dipanggil bin / konsol :

  #! / Usr / bin / env php  {/ ** @var \ Interop \ Container \ ContainerInterface $ container * /$ container = memerlukan 'config / container. php ';$ app = new \ Symfony \ Component \ Console \ Application ('Konsol aplikasi');$ commands = $ container-> get ('config') ['console'] ['commands'];foreach ($ perintah sebagai $ perintah) {$ app-> add ($ container-> get ($ command));}$ app-> run   ;});   

Kemudian, anda boleh membuat perintah Symfony dan mendaftarkannya melalui config / autoload / konsol. global. php atau dari dalam modul anda seperti ini:

   ['perintah' => [\ App \ Command \ HelloWorldCommand :: kelas,],],];   

Tambah mana-mana kebergantungan arahan konsol anda perlu pembina sama seperti mana-mana kelas lain dalam Expressive. Pastikan untuk menghubungi induk :: __ construct dalam pembina anda atau arahan anda tidak akan berfungsi.

Berikut adalah contoh perintah dengan kebergantungan:

   entityManager = $ entityManager;induk :: __ construct ($ name);}/ *** Mengonfigurasi arahan* /konfigurasi fungsi yang dilindungi   {$ this-> setName ('hello')-> setDescription ('Says hello');}/ *** Melaksanakan perintah semasa* /fungsi yang dilindungi melaksanakan (InputInterface $ input, output OutputInterface $){$ output-> writeln ("Hello World!");// Lakukan sesuatu dengan entitiManager$ this-> entityManager-> find ('Blog \ Entity \ BlogEntity');}}   

Untuk menjalankan arahan anda:

  php bin / console hello   

Kita boleh pergi sedikit lagi dan menambah logger. Ini berguna untuk lulus kepada model perkhidmatan yang merangkumi banyak logik dan memerlukan pembalakan debug di seluruh.

Jalankan arahan ini:

  komposer memerlukan monolog / monolog symfony / monolog-bridge;   

Kemudian, tambahkan ini kepada kaedah pelaksanaan anda dalam arahan anda:

  fungsi yang terlaksana melaksanakan (InputInterface $ input, output OutputInterface $){$ logger = new \ Monolog \ Logger ('collect-product-data');$ logger-> pushHandler (new \ Symfony \ Bridge \ Monolog \ Handler \ ConsoleHandler ($ output));$ logger-> debug ('Log sesuatu);}   

Kesimpulan

Anda kini bersedia untuk memulakan membina aplikasi peringkat perusahaan dengan semua alat yang anda inginkan di hujung jari anda.

Dalam jawatan seterusnya kita akan mula belajar bagaimana membina modul di atas asas ini, bermula dengan modul blog.