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

Taming Slim 2.0

by
Read Time:14 minsLanguages:

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

Slim adalah framework ringan yang berisi banyak pukulan untuk jejak kecilnya. Ini memiliki sistem routing yang luar biasa, dan menawarkan dasar yang kuat untuk bekerja dari tanpa menghalangi jalan Anda. Mari ku tunjukkan!

Tapi itu tidak berarti bahwa Slim tidak memiliki beberapa masalah; itu satu-file setup menjadi berantakan saat aplikasi Anda tumbuh. Dalam artikel ini, kita akan meninjau cara menyusun aplikasi Slim agar tidak hanya mempertahankan, tetapi meningkatkan fungsionalitasnya dan menjaga semuanya tetap rapi dan sistematis.


Vanilla Slim

Mari kita mulai dengan melihat beberapa kode Slim umum untuk mengidentifikasi masalah. Setelah menginstal Slim melalui Komposer, Anda perlu membuat instance objek Slim dan menentukan rute Anda:

Mari ubah objek Slim menjadi "controller".

Panggilan metode pertama menetapkan rute baru untuk URI root (/), dan menghubungkan fungsi yang diberikan ke rute tersebut. Ini cukup verbose, namun mudah diatur. Panggilan metode kedua mendefinisikan rute untuk testPage URI. Di dalam metode yang disediakan, kami menggunakan metode render() Render untuk membuat tampilan.

Di sinilah letak masalah pertama: fungsi ini (penutupan) tidak disebut dalam konteks saat ini dan tidak memiliki cara mengakses fitur-fitur Slim. Inilah sebabnya mengapa kita perlu penggunaan kata kunci use untuk meneruskan referensi ke aplikasi Slim.

Masalah kedua berasal dari arsitektur Slim; ini dimaksudkan untuk didefinisikan semua dalam satu file. Tentu saja, Anda dapat outsourcing variabel ke file lain, tapi itu hanya akan memperparah. Idealnya, kita ingin kemampuan untuk menambahkan pengendali untuk memodulasi kerangka menjadi komponen-komponen individual. Sebagai bonus, itu akan menyenangkan jika controller ini menawarkan akses langsung ke fitur Slim, menghilangkan kebutuhan untuk lulus referensi ke penutupan.


Sedikit Reverse Engineering

Masih bisa diperdebatkan apakah membaca kode sumber dari proyek open-source dianggap sebagai rekayasa terbalik, tetapi itu adalah istilah yang akan saya pakai. Kita mengerti bagaimana menggunakan Slim, tapi apa yang terjadi di bawah kap? Mari kita lihat rute yang lebih rumit untuk mendapatkan akar dari pertanyaan ini:

Definisi rute ini menggunakan tanda titik dua dengan kata, nama. Ini adalah placeholder, dan nilai yang digunakan di tempatnya dilewatkan ke fungsi. Sebagai contoh, /users/gabriel cocok dengan rute ini, dan 'gabriel' dilewatkan ke fungsi. Rute, /users, di sisi lain, tidak cocok karena tidak ada parameter.

Jika Anda memikirkannya secara logis, ada sejumlah langkah yang harus diselesaikan untuk memproses rute.

  • Langkah Satu: periksa apakah rute cocok dengan URI saat ini.
  • Langkah Kedua: ekstrak semua parameter dari URI.
  • Langkah Tiga: panggil penutupan yang terhubung dan lewati parameter yang diekstraksi.

Untuk mengoptimalkan proses dengan lebih baik, Slim — menggunakan callback dan grup regex — menyimpan placeholder saat memeriksa kecocokan. Ini menggabungkan dua langkah ke dalam satu, meninggalkan hanya kebutuhan untuk menjalankan fungsi terhubung ketika Slim siap. Ini menjadi jelas bahwa objek rute adalah mandiri, dan sejujurnya, semua itu diperlukan.

Dalam contoh sebelumnya, kita memiliki akses ke fitur Slim ketika parsing rute, tetapi kita harus lulus referensi objek Slim karena itu sebaliknya akan menjadi tersedia dalam konteks eksekusi fungsi. Itu saja yang Anda butuhkan untuk sebagian besar aplikasi, karena logika aplikasi Anda harus terjadi di controller.

Dengan itu dalam pikiran, mari kita ekstrak bagian "routing" ke kelas dan objek Slim menjadi "controller."


Persiapan

Untuk memulai, mari unduh dan instal "vanilla Slim" jika Anda belum melakukannya. Saya akan berasumsi bahwa Anda memiliki komposer diinstal, tetapi jika tidak, ikuti langkah-langkah.

Dalam direktori baru, membuat sebuah file bernama composer.json, dan menambahkan berikut:

Di jendela terminal, navigasikan ke direktori tersebut dan ketik composer install. Saya akan memandu Anda melalui paket-paket ini, jika ini adalah pertama kalinya Anda menggunakan Slim.

  • slim/slim - framework Slim sebenarnya.
  • slim/ekstra - satu set kelas opsional untuk memperluas Slim.
  • twig/twig - Twig mesin template.

Secara teknis Anda tidak memerlukan Slim extras atau Twig untuk tutorial ini, tapi aku suka menggunakan ranting bukan standar PHP template. Jika Anda menggunakan Twig, namun, Anda perlu tambahan Slim karena menyediakan interface antara Twig dan Slim.

Sekarang mari kita menambahkan file kustom kita, dan kita akan mulai dengan menambahkan sebuah direktori ke folder vendor. Saya akan menamai milik saya Nettuts, tetapi merasa bebas untuk memberi nama Anda apa pun yang Anda inginkan. Jika Anda masih di terminal, pastikan bahwa jendela terminal dalam proyek direktori dan ketik berikut:

Sekarang, edit composer.json dengan menambahkan referensi ke folder baru:

Kita ingin aplikasi memuat kelas secara otomatis dari namespace Nettuts, jadi ini memberitahu Komposer untuk memetakan semua permintaan untuk Nettuts ke standar PSR-0 mulai dari folder vendor.

Kini jalankan:

Ini recompiles autoloader untuk menyertakan referensi baru. Selanjutnya, buat file, bernama Router.php, dalam direktori Nettuts, dan masukkan berikut ini:

Kita melihat bahwa setiap objek rute memiliki fungsi mandiri yang menentukan apakah itu sesuai dengan URI disediakan. Jadi, kita ingin array rute dan fungsi untuk mengurai melalui mereka. Kita juga perlu fungsi lain untuk menambahkan rute baru, dan cara untuk mengambil URI dari permintaan HTTP saat ini.

Mari mulai dengan menambahkan beberapa variabel member dan konstruktor:

Kita menetapkan variabel routes mengandung rute, dan variabel request untuk menyimpan objek Slim Request. Selanjutnya, kita membutuhkan kemampuan untuk menambahkan rute. Untuk tetap menggunakan praktik terbaik, saya akan memecahnya menjadi dua langkah:

Fungsi publik ini menerima larik asosiatif rute dalam format route => path, di mana route adalah rute Slim standar dan path adalah string dengan konvensi berikut:

path syntaxpath syntaxpath syntax

Opsional, Anda dapat meninggalkan parameter tertentu untuk menggunakan nilai default. Misalnya, nama kelas akan diganti dengan Main jika Anda membiarkannya keluar, index adalah default untuk nama fungsi yang dihapus, dan default untuk metode HTTP adalah any. Tentu saja, any bukanlah metode HTTP yang nyata, tetapi itu adalah nilai yang Slim menggunakan untuk mencocokkan semua jenis metode HTTP.

Fungsi addRoutes dimulai dengan foreach loop yang siklus melalui rute. Selanjutnya, kita menetapkan metode HTTP standar, opsional override dengan metode disediakan jika simbol @ ada. Lalu kita meneruskan sisa jalan ke fungsi untuk mengambil panggilan balik, dan melampirkannya ke rute. Akhirnya, kita menambahkan rute ke array.

Sekarang mari kita lihat processCallback() fungsi:

Isu kedua berasal dari arsitektur Slim; itu dimaksudkan untuk didefinisikan semua dalam satu file.

Kita pertama-tama mengatur kelas default ke Main, dan menimpa kelas itu jika simbol titik dua ditemukan. Selanjutnya, kita menentukan apakah suatu fungsi didefinisikan dan menggunakan index metode standar jika diperlukan. Kita kemudian meneruskan kelas dan nama fungsi ke penutupan dan mengembalikannya ke rute.

Di dalam penutupan, kita menambahkan nama kelas dengan namespace. Kita kemudian membuat instance baru dari kelas yang ditentukan dan mengambil daftar argumen yang dilewatkan ke fungsi ini. Jika Anda ingat, sementara Slim memeriksa apakah rute cocok, secara perlahan membangun daftar parameter berdasarkan wildcard dari rute. Fungsi ini (func_get_args()) dapat digunakan untuk mendapatkan parameter yang dilewatkan dalam larik. Kemudian, menggunakan metode call_user_func_array() memungkinkan kita untuk menentukan kelas dan fungsi, ketika meneruskan parameter ke controller.

Ini bukan fungsi yang sangat rumit setelah Anda memahaminya, tetapi ini adalah contoh yang sangat baik ketika penutupan berguna.

Untuk rekap, kita tambahkan fungsi ke Router yang memungkinkan Anda untuk melewati sebuah array asosiatif yang berisi rute dan jalur yang memetakan ke kelas dan fungsi. Langkah terakhir adalah memproses rute dan melaksanakan semua yang cocok. Mengikuti konvensi penamaan Slim, sebut saja run:

Kita mulai dengan mengeset variabel display404, mewakili rute tidak ditemukan, true. Jika menemukan rute yang cocok, kita akan menetapkan ini menjadi false dan mengabaikan pesan kesalahan. Selanjutnya, kita menggunakan Slim permintaan objek untuk mengambil metode URI dan HTTP yang saat ini.

Kita akan menggunakan informasi ini untuk siklus melalui dan menemukan kecocokan dari array.

Setelah objek rute matches() berfungsi, Anda dapat memanggil getParams() untuk mengambil parameter yang diuraikan. Dengan menggunakan fungsi itu dan metode getCallable(), kita dapat melaksanakan penutupan dan meneruskan parameter yang diperlukan. Akhirnya, kita menampilkan pesan 404 jika rute tidak cocok URI saat ini.

Mari kita buat kelas pengontrol yang menyimpan callback untuk rute ini. Jika Anda telah mengikuti, maka Anda mungkin telah menyadari bahwa kita tidak pernah memaksa protokol atau jenis kelas. Jika Anda tidak ingin untuk membuat kelas controller, maka setiap kelas akan bekerja dengan baik.

Jadi mengapa membuat kelas kontroler? Jawaban singkatnya adalah kita masih belum benar-benar menggunakan Slim! Kita menggunakan bagian Slim untuk permintaan HTTP dan rute, tetapi seluruh poin ini adalah memiliki akses mudah ke semua properti Slim. Kelas pengontrol kita akan memperluas kelas Slim yang sebenarnya, mendapatkan akses ke semua metode Slim.

Anda dapat dengan mudah melewati ini dan subkelas Slim langsung dari pengontrol Anda.


Membangun Controller

Pengontrol ini pada dasarnya memungkinkan Anda untuk memodifikasi Slim sambil tetap menyimpannya vanilla. Beri nama file Controller.php, dan tulis kode berikut:

Ketika Anda menginisialisasi Slim, Anda dapat memasukkan berbagai pengaturan, mulai dari mode debug aplikasi ke mesin templating. Alih-alih meng-coding-kan nilai-nilai apa pun dalam konstruktor, saya memuatnya dari sebuah file bernama settings.php dan meneruskan array tersebut ke konstruktor induk.

Karena kita memperluas Slim, saya pikir itu akan keren untuk menambahkan pengaturan 'model', memungkinkan orang untuk menghubungkan objek data mereka langsung ke controller.

Itulah bagian yang dapat Anda lihat di tengah kode di atas. Kita memeriksa apakah pengaturan model telah ditetapkan dan menetapkannya ke properti data pengontrol jika diperlukan.

Sekarang buat file dengan nama settings.php di akar proyek Anda (folder dengan file composer.json), dan masukkan yang berikut:

Ini adalah pengaturan standar Slim dengan pengecualian model. Nilai apa pun yang ditetapkan untuk properti model diteruskan ke variabel data; ini bisa berupa array, kelas lain, string, dll ... Saya mengaturnya ke objek karena saya suka menggunakan notasi -> bukan notasi braket (larik).

Kita sekarang dapat menguji sistem. Jika Anda ingat di kelas Router, kita tambahkan nama kelas dengan namespace "Controller". Buka composer.json tambahkan yang berikut langsung setelah definisi psr-0 untuk namespace Nettuts:

Kemudian seperti sebelumnya, cukup buang autoloader:

Jika kita hanya mengatur path dasar ke direktori root, maka Controller namespace akan memetakan ke folder bernama "Controller" di root aplikasi kita. Jadi buat folder itu:

Di dalam folder ini, buat sebuah file baru yang bernama Main.php. Di dalam file, kita perlu mendeklarasikan namespace dan membuat kelas yang memperluas kelas dasar Controller:

Ini tidak rumit, tapi mari kita anggap remeh. Di kelas ini, kita mendefinisikan dua fungsi; nama mereka tidak penting karena akan memetakan mereka untuk rute nanti. Sangat penting untuk memperhatikan bahwa saya secara langsung mengakses properti dari pengontrol (yaitu model) dalam fungsi pertama, dan pada kenyataannya, Anda akan memiliki akses penuh ke semua perintah Slim.

Mari sekarang buat file publik yang sebenarnya. Buat direktori baru di akar proyek Anda dan beri nama public. Seperti namanya, ini adalah semua barang publik akan berada. Di dalam folder ini, buat file bernama index.php dan masukkan yang berikut:

Kita menyertakan perpustakaan autoloading Composer dan membuat contoh baru dari router. Kemudian kita mendefinisikan dua rute, menambahkannya ke objek router dan menjalankannya.

Anda juga perlu mengaktifkan mod_rewrite di Apache (atau yang setara menggunakan server web yang berbeda). Untuk mengatur ini, buat file bernama .htaccess di dalam direktori public dan isi dengan yang berikut:

Sekarang semua permintaan ke folder ini (yang tidak cocok dengan file yang sebenarnya) akan ditransfer ke index.php.

Di browser Anda, navigasikan ke direktori public Anda, dan Anda akan melihat halaman yang bertuliskan "Hello World". Arahkan ke "/test", dan Anda Arahkan ke "/test", dan Anda akan melihat pesan "Test Page".melihat pesan "Menguji halaman". Ini tidak terlalu menarik, tetapi kami telah berhasil memindahkan semua kode logika ke dalam pengendali individual.


Putaran kedua

Slim bukan CodeIgniter, itu bukan Symfony dan itu bukan Laravel.

Jadi kita memiliki fungsi dasar, tetapi ada beberapa sisi kasar. Mari kita mulai dengan router.

Mulai sekarang, kita menampilkan pesan kesalahan sederhana jika rute tidak ada. Dalam aplikasi nyata, kita menginginkan fungsi yang sama dengan memuat halaman reguler. Kita ingin memanfaatkan kemampuan Slim untuk memuat tampilan, serta mengatur kode kesalahan respons.

Mari tambahkan variabel kelas baru yang memiliki jalur opsional (seperti rute lainnya). Di bagian atas file, tambahkan baris berikut secara langsung setelah definisi objek permintaan:

Selanjutnya, mari kita buat fungsi yang menerima jalur dan menugaskannya fungsi panggilan balik. Ini relatif sederhana karena kami telah mengabstraksi fungsi ini:

Sekarang mari kita menyesuaikan perintah run untuk menjalankan callback secara opsional daripada hanya menampilkan pesan kesalahan:

Membuka kelas controller. Di sinilah Anda dapat menyesuaikan fungsionalitas Slim dengan preferensi pribadi Anda sendiri. Sebagai contoh, saya ingin opsi untuk menghilangkan ekstensi file saat memuat tampilan. Jadi daripada menulis $this->render("home.php");, Saya hanya ingin menulis: $this->render("home");. Untuk melakukan ini, mari kita mengganti metode render:

Kita menerima parameter yang sama sebagai fungsi induk, tetapi kita periksa jika ekstensi file yang disediakan dan menambahkannya jika diperlukan. Setelah modifikasi ini, kita melewati file ke metode induk untuk pengolahan.

Ini hanyalah satu contoh, tetapi kita harus meletakkan perubahan lain di sini dalam metode render(). Misalnya, jika Anda memuat sama header dan footer halaman pada semua dokumen Anda, Anda dapat menambahkan fungsi renderPage(). Fungsi ini akan memuat tampilan yang dilewatkan antara panggilan untuk memuat header dan footer biasa.

Selanjutnya, mari kita lihat beberapa tampilan. Di root proyek Anda buat folder bernama "Views" (lokasi dan nama dapat disesuaikan dalam file settings.php). Mari kita buat dua tampilan bernama test.php dan error.php.

Di dalam test.php, tambahkan berikut:

Dan di dalam error.php file, masukkan ini:

Juga, memodifikasi Main controller dengan mengubah fungsi index() sebagai berikut:

Di sini, kita membuat tampilan pengujian yang baru saja dibuat dan mengirimkan data untuk ditampilkan. Selanjutnya, mari kita coba rute dengan parameter. Mengubah test() fungsi sebagai berikut:

Di sini, kita mengambil satu langkah lebih jauh dengan mengambil judul halaman dari URI itu sendiri. Terakhir, tetapi tidak sedikit, mari tambahkan fungsi untuk halaman 404:

Kita menggunakan parameter opsional ketiga render() fungsi, yang menetapkan kode status HTTP respons

Pengeditan terakhir kita adalah di index.php untuk menggabungkan rute baru:

Anda sekarang harus dapat menavigasi ke tiga rute dan melihat pandangan masing-masing.


Kesimpulan

Dengan semua yang kami capai, Anda pasti memiliki beberapa pertanyaan tentang mengapa Slim belum menawarkan modifikasi ini. Mereka tampak logis, mereka tidak menyimpang dari penerapan Slim terlalu jauh, dan mereka membuat banyak akal. Josh Lockhart (Slim pencipta) memasukkannya terbaik:

"Slim bukan CodeIgniter, itu bukan Symfony, dan itu bukan Laravel. Slim adalah Slim. Dibangun untuk menjadi ringan dan menyenangkan, sementara masih bisa menyelesaikan sekitar 80% masalah yang paling umum. Alih-alih khawatir tentang kasus tepi, fokusnya adalah sederhana dan memiliki basis kode yang mudah dibaca."

Terkadang, sebagai pengembang, kita jadi terjebak dalam skenario yang gila sehingga kita lupa tentang apa yang benar-benar penting: kode. Mod, seperti yang ada dalam tutorial ini, hanya mungkin karena kesederhanaan dan verbositas kode. Jadi ya, mungkin ada beberapa kasus yang perlu perhatian khusus, tetapi Anda mendapatkan komunitas yang aktif, yang menurut saya, sangat memberatkan biaya.

Saya harap Anda menikmati artikel ini. Jika Anda memiliki pertanyaan atau komentar, tinggalkan pesan di bawah ini. Anda juga dapat menghubungi saya melalui saluran IRC di Freenode di saluran #nettuts.

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.