Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Pemrograman berorientasi aspek di PHP

by
Read Time:13 minsLanguages:

Indonesian (Bahasa Indonesia) translation by Fodal Fadul (you can also view the original English article)

Ada pemain baru di kota, dan ia membawa mainan baru: PHP dunia menyambut FLOW3, kerangka aplikasi enterprise ditulis dan didukung oleh komunitas TYPO3 CMS. FLOW3 dapat digunakan sebagai standalone penuh-tumpukan kerangka untuk aplikasi Anda. Hal ini menarik, karena ini memperkenalkan beberapa konsep pengembangan perangkat lunak yang belum disesuaikan untuk PHP sebelum.

Di antara konsep-konsep baru ini adalah "Pemrograman berorientasi aspek". Kita akan melihat pada teori pola, dan akan mengatur aplikasi FLOW3 dasar dan menenun dalam aspek kita sendiri!


Mengapa harus peduli?

Jika sebuah kerangka kerja baru hits stabil, pertanyaan yang sangat bagus untuk bangkit mungkin: apa yang bisa ia lakukan bahwa alat-alat yang aku cinta tidak bisa?

PHP sudah memiliki armada kerangka kerja yang sangat baik dan sebagian besar dari mereka mengaku ditulis dengan pemisahan keprihatinan dalam pikiran. Jadi tidak FLOW3.

Dalam hal pengembangan perangkat lunak ini berarti, bahwa kelas yang menerapkan logika aplikasi Anda hanya harus peduli tentang satu hal. Sebagai contoh, sebuah kelas mailer harus mengirim mail. Itu tidak harus mengambil receiver potensial dari database.

Semua kerangka modern (termasuk FLOW3) mendorong banyak pola ke dalam tumpukan perangkat lunak yang melakukan pekerjaan yang besar pada memisahkan keprihatinan Anda logika bisnis; diantaranya MVC terkenal yang adalah memisahkan logika Anda menjadi lapisan yang berbeda.

Namun, aplikasi tidak hanya dibangun pada logika bisnis sendiri. Seperti tumbuh, Anda mungkin ingin menerapkan layanan tambahan, fitur, plugin atau plugin plugin. Anda pasti tidak ingin hal ini dalam logika bisnis Anda! Tapi apa pilihan Anda?

Katakanlah Anda ingin menerapkan penebangan layanan yang menulis beberapa hal ke file teks setiap kali tertentu dihapus dari database. Tentu saja, layanan pengelogan bukan merupakan bagian dari lapisan database Anda. Tetapi untuk membuatnya bekerja, Anda perlu menempatkan beberapa kode di sana, seperti ini:

Mengerikan, bukan? Mari kita hadapi itu: layanan pengelogan menambah kotoran kode Anda. Anda harus menyentuh kode asli untuk melaksanakan hal ini dan Anda menambahkan ketergantungan tambahan, dalam hal ini suatu contoh LoggingService.

Oleh karena itu, Anda menambahkan kompleksitas. Dan Anda mungkin akan harus menambahkan seluruh aplikasi Anda (tergantung pada apa yang Anda ingin login).

Anda bisa datang dengan pola seperti acara operator atau sistem hook seperti itu dilaksanakan di Drupal dan Wordpress dan kemudian memiliki logger Anda mendengarkan peristiwa-peristiwa:

Hal ini lebih baik, tapi masih tidak keren. Anda kode masih ketergantungan sadar: memiliki beberapa kode dengan tujuan tunggal menginformasikan pihak lain bahwa sesuatu terjadi.

Ini memiliki beberapa efek samping buruk: Bagaimana jika Anda ingin login sesuatu, tetapi ada bukanlah suatu peristiwa yang dikirim pada waktu itu? Bagaimana jika Anda tidak menulis kode karena Anda menulis sebuah plugin? Anda harus mengubah kode asli-tidak sekali, tetapi setiap kali update tersedia.

Mari kita sebut layanan pengelogan aspek dan melihat bagaimana FLOW3 mengurus masalah.


Aspek tenun

Layanan pengelogan kami hanya tertarik pada satu hal mengenai kode yang sudah ada: ingin mencegat itu di kelas-kelas di berbagai titik (e. g. ketika sesuatu yang dihapus). Dengan implementasi yang dibahas di atas, kode yang sudah ada kontrol poin eksekusi.

Bukankah menyenangkan jika Layanan dapat menetapkan satu set aturan di mana titik itu akan ingin menyuntikkan sendiri ke kelas?

Ini adalah konsep pengembangan perangkat lunak yang bernama inversi kontrol. Itu decouples kelas dari yang lain, karena ada tidak perlu untuk mengubah kode yang ada ketika Anda mengubah layanan. Layanan mengurus ini sendiri.

Katakanlah kita hanya ingin menjalankan log on setiap metode di setiap kelas yang dimulai dengan menghapus, seperti deleteUser(), deleteEntry() atau apa pun. Cara mudah akan menulis aturan ke layanan pengelogan dan membiarkan kerangka mengurus pelaksanaan benar kode. Hal ini sangat mudah dalam FLOW3:

FLOW3 melakukan beberapa benar-benar canggih teknik PHP di bawah tenda.

Aturan ini dinamai pointcut di AOP dan ada beberapa cara yang mudah-untuk-belajar untuk menentukan nasib mereka. Di atas mengatakan kepada FLOW3 untuk menyuntikkan kode penebangan di setiap kelas sebelum setiap metode yang dimulai dengan menghapus.

Ia melakukannya dengan menggunakan metode kata kunci dan menambahkan wildcard (*) untuk kelas dan untuk bagian dari nama metode. Jika Anda menambahkan kode ini di kelas aspek (seperti yang kita lakukan kemudian), Anda baik untuk pergi. Anda akan dapat mengakses properti dari kelas yang Anda targetkan serta. Kelas target itu sendiri tetap tak tersentuh. Mungkin tidak belum ditulis-jika itu ditambahkan ke aplikasi Anda di masa depan, maka akan cocok dengan aturan dan kode akan disuntikkan.

Mungkin Anda telah membaca paragraf di atas dua kali dan bertanya pada diri sendiri: Apakah ini sihir? Apakah trik sialan? -Saya yakin lakukan, ketika saya pertama kali diperkenalkan kepada AOP!

Yah, AOP telah sekitar selama beberapa waktu di dunia Jawa. FLOW3 sangat terinspirasi oleh AOP pelaksanaan musim semi, kerangka Jawa. Firman di jalan, bahwa pola tidak ditransfer ke bahasa diinterpretasikan, karena memerlukan kompilasi.

Kuncinya adalah, bahwa kerangka- atau beberapa alat seperti JAspect-penyadapan proses kompilasi (dari kode Java bytecode, yang dapat dijalankan oleh Java runtime) dan melakukan analisis aspek didefinisikan. Setiap kali seperangkat aturan (alias pointcut) sesuai dengan metode, itu adalah berkelok-kelok langsung ke kode dikompilasi. Oleh karena itu, kerangka mengurus menggabungkan bagian-bagian kode bersama-sama:

FLOW3 Apakah mengadaptasi konsep itu kepada dunia php dengan memperkenalkan cache lanjutan. Sementara kebanyakan kerangka menawarkan caching untuk meningkatkan performa, FLOW3 Selain itu menggunakan cache untuk menenun aspek ke kelas yang asli.

Jika Anda menjalankan aplikasi Anda, FLOW3 memberikan kelas cache sebaliknya orang-orang yang telah Anda tulis. Oleh karena itu, kode awal tetap tak tersentuh.

Ini terdengar kompleks- dan itu adalah: FLOW3 melakukan beberapa benar-benar canggih teknik PHP di bawah tenda, yang layak untuk dieksplorasi! Tetapi: Kepada Anda sebagai sebuah pengembang aplikasi, itu tidak rumit sekali. Anda tidak perlu peduli, jika Anda tidak ingin: FLOW3 monitor file Anda untuk perubahan dan jika Anda membuat beberapa, FLOW3 auto-commit mereka ke cache atas permintaan Anda berikutnya. Jika aspek cocok untuk metode, itu telah secara otomatis berkelok-kelok di-tidak ada konfigurasi tambahan yang diperlukan.

Ini adalah pola yang kompleks nyaman di layanan Anda!


Beberapa kata tentang Cache

Setiap fitur keren datang dengan sisi negatifnya-jadi tidak FLOW3. Saat ini, kita hanya menggores permukaan dari apa FLOW3 caching mekanisme mampu, tetapi saya ingin memberi Anda gambaran.

Lihatlah kode berikut:

Konsekuensinya adalah bahwa PHP adalah atasmu tidak lagi diinterpretasikan bahasa.

Ini mungkin tampak seperti beberapa kode yang sama baik didokumentasikan. Tapi itu jauh lebih.

Anotasi properti pertama (FLOW3\Inject) mengatakan kepada FLOW3 untuk mencari beberapa kelas di aplikasi yang mengimplementasikan MailerServiceInterface dan menyuntikkan di sini (dan mungkin mengkonfigurasinya sebelum). Pola ini dikenal sebagai ketergantungan injeksi.

Kelas kedua mendefinisikan beberapa definisi jenis anotasi yang komentar - dan FLOW3 menggunakan mereka. Jika Anda memberikan metode beberapa data yang dapat digunakan untuk membangun objek pengguna model (misalnya sebuah array dengan string murni dari bentuk HTML), FLOW3 auto-mengubah data dengan selamat ke objek pengguna dan menerapkan beberapa aturan keamanan dan validasi paramet kedua eh (dalam hal ini kasus string).

Ini (di antara beberapa trik lainnya) yang dilakukan oleh tenun di beberapa kode ke dalam cache.

Konsekuensinya adalah bahwa PHP adalah atasmu tidak lagi diinterpretasikan bahasa. Proses caching agak mirip kompilasi dan memiliki kerugian sama: Anda tidak dapat menyimpan & refresh browser, Anda harus menunggu untuk cache menghangat selama pengembangan. Jika Anda melakukan kode untuk lingkungan produksi Anda, Anda memiliki untuk flush cache untuk melihat perubahan.

Di atas itu, FLOW3 menambahkan beberapa jenis tipe-validasi pada saat runtime: Anda tidak dapat mengirimkan integer sebagai argumen kedua dalam contoh di atas-itu akan melempar kesalahan. Aku benar-benar seperti ini, karena saya memiliki latar belakang dalam ketat diketik seperti bahasa Jawa dan ActionScript. Ia juga menambahkan banyak keamanan aplikasi Anda. Tapi jika Anda PHP murni, ini mungkin sesuatu yang Anda inginkan.


Pengaturan Flow3

Alright, cukup dengan teori. Mari kita mendapatkan tangan kami yang kotor.

Menyiapkan FLOW3 cukup sederhana, jika Anda sudah memiliki sebuah server PHP-mampu seperti XAMP atau MAMP diinstal. Hanya ambil salinan kerangka dari FLOW3's situs download (atau tiruan dari git) dan membongkar itu ke htdocs direktori.

Anda harus sudah dilakukan sekarang pada mesin Windows. Sistem berbasis Unix seperti MAC atau Linux perlu memberikan hak-hak yang diperlukan untuk membangun cache. FLOW3 kapal dengan alat baris perintah yang kuat, itu paket tugas ini menjadi satu-kapal:

Harap ganti chris dengan nama pengguna Anda! Ini harus cukup. Namun, saya telah menginstal FLOW3 pada
berbagai mesin dan telah mengalami beberapa masalah. Yang paling umum adalah:

  • Jika Anda pada MAC dan FLOW3 mengeluh "index.php tidak ditemukan", membuka .htaccess di webdir dan menambahkan # sebelum baris dasar menulis ulang / "-
  • Jika Anda berada di Windows dan piranti baris perintah tidak bekerja, buka Settings.yaml.example di FLOW3 di konfigurasi direktori, tanda komentar dan menyesuaikan variabel phpBinaryPathAndFilename ke jalan yang benar (misalnya C:\xampp\php\php.exe) dan simpan file tersebut sebagai Settings.yaml
  • Pada beberapa mesin, jika FLOW3 sangat lambat, Anda harus meningkatkan batas memori php dalam php.ini

Jika Anda mengalami masalah, yang tidak tercantum di sini, silahkan posting di komentar!

Sekarang jalankan browser favorit dan menavigasi ke https://localhost/flow3/Web! FLOW3 harus menyambut Anda dengan layar pengenalan:

The first run may take a while, as FLOW3 has to index your code and build all caches.The first run may take a while, as FLOW3 has to index your code and build all caches.The first run may take a while, as FLOW3 has to index your code and build all caches.

Ini adalah paket Selamat datang. Setiap aplikasi di FLOW3 (dan FLOW3 itu sendiri) adalah paket dan paket dapat berbagi kode dengan satu sama lain. Sebagai contoh, setelah versi TYPO3 baru selesai, Anda dapat menambahkannya sebagai paket dan aplikasi Anda kemudian akan memiliki CMS perusahaan-siap di atas!

Mari kita mulai paket kami sendiri. Ini adalah tugas yang mudah, karena piranti baris perintah FLOW3 yang akan menangani sebagian besar pekerjaan! Ketik perintah berikut:

Ini akan membuat sebuah paket siap-to-go yang bernama Nettuts.AspectDemo di FLOW3's paket aplikasi folder. Jika Anda meninjau struktur file, Anda akan menemukan banyak folder yang mengikuti konvensi tertentu.

Yang penting adalah:

  • Kelas: Rumah kode PHP, kontroler pertama sudah dibuat di Folder kelas Controller: StandardController!
  • Sumber daya/swasta: Rumah dari semua template yang ditembakkan ke cairan, FLOW3's kuat mesin template. Itu host beberapa hal lain seperti file lokalisasi juga.
  • Sumber daya/publik: Ini belum dibuat belum, tetapi setiap file dalam folder sumber daya umum akan langsung dapat diakses dari web. Ini adalah tempat yang baik untuk gambar, CSS, Javascript dll.

Membangun aplikasi berfitur lengkap yang berada di luar cakupan tutorial ini, jadi kami akan pergi dengan default. Silahkan buka URL berikut: http://localhost/flow3/Web/index.php/Nettuts.AspectDemo

Hal ini tidak banyak, tetapi itu adalah awal. Kami ingin menulis sesuatu ke logfile, setiap kali situs ini disebut. Kita melakukan ini dengan tenun dalam aspek ke StandardController!


Menulis aspek pertama

Lihatlah StandardController di theClasses/Controller Folder dalam paket Nettuts.AspectDemo Anda.

Menerapkan metode, bernama indexAction(). FLOW3 telah secara otomatis mengkonfigurasi aplikasi kami dengan cara, bahwa metode ini dalam StandardController akan dipanggil ketika kita memasukkan URL di atas.

Untuk saat ini, kita melihat bahwa metode ini menetapkan beberapa string ke tampilan:

Jika Anda membuka file index.html pandangan ini dalam sumber daya/pribadi/template/standar dalam paket kami, Anda akan melihat bagaimana string ini diproses oleh mesin template.

Namun, tujuan kami adalah untuk mencegat eksekusi kode sebelum metode ini akan dipanggil.

Pada pertama, membuat file kosong bernama Access.log dalam FLOW3's Log map di flow3, Data dan kayu. Anda dapat menyimpan file ini di mana pun Anda inginkan, tapi ini adalah tempat yang bagus untuk file log.

Selanjutnya, Buat folder dengan nama layanan dalam Nettuts.AspectDemo/Classes Folder dan dalamnya, Buat folder lain, dan nama itu penebangan. Kemudian buat sebuah file bernama LoggingAspect.php itu. Ini harus memiliki konten berikut:

Ini adalah kelas sangat dasar, dan jika Anda ingin memiliki logger maju, Anda mungkin ingin memisahkan penebangan dari aspek intersepsi.

Apa yang terjadi sini? Pada awalnya, kita mendefinisikan sebuah namespace, yang merupakan nama paket dan path ke kelas yang sebenarnya (tanpa kelas folder itu sendiri). Selanjutnya, kita mengimpor namespace anotasi FLOW3's. Dengan demikian, kita dapat menggunakan FLOW3's kuat anotasi parser untuk mengkonfigurasi kelas kami.

Itulah apa yang kita lakukan di kelas komentar. Kita mendefinisikan kelas sebagai aspek dengan anotasi berikut:

Sekarang FLOW3 menyadari bahwa kelas ini dapat mendefinisikan aturan untuk pencegatan kode aliran dan jam tangan kami basis kode untuk pertandingan.

Ini adalah aturan:

Kita dapat menggunakan ekspresi reguler atau beberapa teknik untuk mencocokkan beberapa metode atau kelas, tetapi kita tahu persis di mana kita ingin pergi: sebelum indexAction() metode dalam StandardController – dan itulah apa yang kita sedang mengatakan FLOW3.

Catatan $jointInterface Parameter logSiteAccess() metode, yang diberikan kepada kita oleh FLOW3. Kami tidak menggunakannya di sini, tapi ini berisi beberapa data yang berguna tentang konteks yang sebenarnya. Misalnya, jika metode disadap akan memiliki argumen, yang kita mungkin ingin menggunakan, kita bisa mengaksesnya seperti ini:

Kode dalam metode logSiteAccess() kami, itu sendiri, cukup sederhana. Hanya menyesuaikan path ke Access.log lingkungan Anda dan Anda baik untuk pergi!

Sekarang, sekali lagi, buka http://localhost/flow3/Web/index.php/Nettuts.AspectDemo-tidak ada yang harus berubah. Tapi ketika Anda membuka Access.log file, Anda akan melihat entri berikut:

Jika Anda dapat membaca ini, aspek telah menenun ke dalam cache. Mari kita lihat keajaiban!

FLOW3 toko cache di flow3/Data/sementara/pembangunan/Cache/kode/FLOW3_Object_Classes.

Anda akan menemukan kelas bernama Nettuts_AspectDemo_Controller_StandardController_Original.php. Ini adalah kelas asli dari basis kode kami.

Tapi ada kelas lain: Nettuts_AspectDemo_Controller_StandardController.php. Kelas ini meluas kelas asli kami dan itu terserah membangun murni oleh kode yang dihasilkan. Di antara banyak baris Anda akan menemukan sesuatu seperti ini:

Ini adalah FLOW3 memulai aspek dan itu telah berkelok-kelok di langsung ke kelas Anda. Aspek yang dijalankan di mana kami ingin hal itu-tanpa menyentuh controller asli.

Snipet kode memulai instance kelas BeforeAdvice, dengan aspek kami, masing-masing metode dan $objectManager sebagai argumen. Manajer objek berisi informasi yang dibutuhkan untuk membangun jointInterface, yang dilewatkan ke aspek.

Jika Anda tertarik dalam rincian, memiliki sekilas AOP Folder dalam paket FLOW3!


Kesimpulan

Aspek yang berorientasi pada pendekatan memiliki banyak keuntungan, menunggu untuk ditemukan.

Aspek yang berorientasi pada pendekatan memiliki banyak keuntungan, menunggu untuk ditemukan. Sebagai contoh, FLOW3 menggunakan AOP untuk mencegat bootstrap sendiri untuk membangun firewall jika Anda memilih untuk menggunakan FLOW3's kerangka keamanan. Selain itu, kami belum belum membahas terminologi khusus yang umumnya digunakan dalam AOP.

Namun, FLOW3 kapal dengan beberapa konsep unik lainnya seperti Domain-Driven-Design. Memiliki integrasi doktrin yang kuat dan cerdas mesin template. Kita hanya melihat puncak gunung es!

Apakah pendapat Anda? Apakah Anda ingin mempelajari lebih lanjut tentang filosofi di balik FLOW3? Apa itu kesan Anda AOP? Apakah Anda tertarik untuk memiliki pelabuhan kuat bagi dunia PHP atau apakah Anda pikir itu terlalu banyak overhead untuk bahasa yang ditafsirkan?

Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.