Buggy CakePHP Code: 6 Kesalahan Paling Umum Dilakukan Developer CakePHP
Diterbitkan: 2022-03-11CakePHP adalah kerangka kerja PHP yang luar biasa, tetapi memiliki kurva belajar yang curam! Dibutuhkan banyak penelitian dan pelatihan untuk menjadi seorang ahli.
Saya beruntung menggunakan CakePHP selama lebih dari 7 tahun sekarang, dan pada saat itu saya mendapat kehormatan untuk bekerja dengan banyak anggota komunitas CakePHP.
Dalam tutorial CakePHP ini saya ingin menjelaskan beberapa praktik buruk yang telah saya lihat selama bertahun-tahun, dan mengusulkan pendekatan yang benar untuk menghindari kesalahan ini. Ini tidak berarti kode saya sempurna, tetapi sebagai programmer kami selalu belajar, jadi penting untuk mengikuti praktik terbaik dan menyesuaikan saat Anda belajar!
Isi artikel ini terinspirasi dari postingan CakeCoded. Jika Anda ingin mempelajari lebih lanjut tentang CakePHP, silakan kunjungi bagian pembelajaran kami di sini.
Kesalahan Umum #1: Tidak Mengikuti Konvensi Coding CakePHP
Konvensi pengkodean CakePHP dapat dilihat di sini. Saya akan menyoroti beberapa hal yang sering saya perhatikan ketika melihat kode programmer lain.
Struktur kontrol. Sering kali Anda melihat pemrogram melakukan kesalahan ini, dan dalam beberapa kasus membawa praktik dari bahasa pengkodean lain. CakePHP mengharapkan sintaks berikut:
if ((expr_1) || (expr_2)) { // action_1; } elseif (!(expr_3) && (expr_4)) { // action_2; } else { // default_action; }
Harus ada 1 (satu) spasi sebelum kurung pertama dan 1 (satu) spasi di antara kurung terakhir dan kurung buka. Jadi ini berarti bahwa yang berikut ini salah:
if($this->request->data){ }
Perhatikan jarak antara if
dan (
, dan antara )
dan {
Selalu gunakan tanda kurung kurawal dalam struktur kontrol, meskipun tidak diperlukan. Mereka meningkatkan keterbacaan kode, dan mereka memberi Anda lebih sedikit kesalahan logis.
Jadi, misalnya, berikut ini salah:
if ($foo) $bar = true
Ini harus diformat seperti ini:
if ($foo) { $bar = true }
Terakhir, perhatikan di mana Anda meletakkan tanda kurung. Tanda kurung buka tidak boleh memulai baris baru. Dan pastikan semua braket Anda sejajar sehingga setiap braket baru sejajar dengan braket penutup.
Berikut adalah beberapa contoh yang salah:
if ($foo) { $bar = true; }
Ini salah, kurung buka harus di baris pertama:
if ($foo) { $bar = true; if ($action) { $to = false; } }
Lekukan harus berbaris dengan benar.
Saya sering mendengar programmer berkata, “Tapi saya terlalu sibuk untuk membuat kodenya rapi….” Tanggapan saya adalah, "Percayalah, kode yang rapi akan bertahan dalam ujian waktu". Menulis kode CakePHP yang tidak terbaca akan menjadi mimpi buruk untuk kembali jika Anda perlu melakukan perubahan dalam beberapa bulan.
Kesalahan Umum #2: Penggunaan yang Tidak Tepat dari Perilaku yang Dapat Dilindungi dan Level Rekursif di ORM
Saya beruntung baru-baru ini melakukan diskusi informal dengan pengembang basis data dari Facebook. Kami mulai berbicara tentang CakePHP dan dia berkata kepada saya, “Oh, itu menggunakan ORM bukan? Itu bisa menakutkan.” Saya bertanya kepadanya apa maksudnya, dan dia berkomentar bahwa dengan Object-relational mapping (ORM) kueri SQL mudah menjadi terlalu besar.
Dia benar dalam satu hal. Bagian dari keajaiban CakePHP adalah dalam penggunaan ORM dan cara mengelompokkan relasi tabel database yang berbeda menjadi satu. Secara default, CakePHP secara otomatis memilih data 'Milik Ke', 'Memiliki Satu' dan 'Memiliki Banyak' yang terkait, dan ini dapat menyebabkan kueri SQL yang sangat besar. Kueri ini mungkin tidak menjadi perhatian saat Anda awalnya mengembangkan aplikasi, tetapi setelah enam bulan mengumpulkan data langsung, Anda mungkin menemukan aplikasi menjadi sangat lambat, dan dalam beberapa kasus macet jika kueri tidak dioptimalkan.
Saya mencari dua hal saat mengaudit situs web yang ada. Pertama, apakah level rekursif default telah diubah? Secara default, CakePHP menetapkan level rekursif ke 1, yang menurut saya terlalu tinggi. Saya selalu mengaturnya ke -1 dan kemudian menggunakan perilaku yang dapat ditahan untuk mendapatkan model terkait.
Itu mengarah ke hal kedua yang saya cari - apakah perilaku Containable telah digunakan? Saya sering mendapat klien baru yang datang kepada saya dan mengatakan bahwa CakePHP lambat. Alasannya hampir selalu karena Containable belum digunakan! Pemrogram CakePHP yang baik akan mengoptimalkan kueri SQL mereka terlepas dari seberapa banyak "keajaiban otomatis" dilakukan di belakang layar.
Perilaku yang dapat ditahan tidak ditambahkan hingga CakePHP 1.2, tetapi apakah itu membuat perbedaan?! Pastikan untuk menggunakan container sebanyak mungkin, karena ini adalah cara yang efektif untuk mengoptimalkan SQL Anda. Untuk informasi selengkapnya tentang cara menerapkan dan menggunakan perilaku yang Dapat Ditampung, klik di sini.
Kesalahan Umum #3: Menjaga Logika Bisnis di Pengontrol Alih-alih Model
Kode CakePHP yang baik akan memiliki logika dalam file model. Ini membutuhkan sedikit untuk membiasakan diri, tetapi setelah dikuasai tidak ada jalan untuk melihat ke belakang! File pengontrol harus digunakan untuk apa yang dimaksudkan dalam pola MVC - mengendalikan! Jadi gunakan file pengontrol Anda untuk menangani tindakan pengguna, sambil membiarkan logika bisnis masuk ke file model.
Contoh yang baik dari ini adalah CRUD sederhana - tindakan sehari-hari! Mari kita ambil fungsi add posts dari tutorial blog sebagai contoh. Fungsi tambah default adalah sebagai berikut:
public function add() { if ($this->request->is('post')) { $this->Post->create(); if ($this->Post->save($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Unable to add your post.')); } }
Tindakan pengontrol ini baik untuk penambahan sederhana, tetapi apa yang akan terjadi jika Anda ingin melakukan hal-hal seperti mengirim email ke admin saat postingan ditambahkan, atau memperbarui asosiasi model lain saat postingan ditambahkan. Ini adalah logika tambahan, tetapi logika ini tidak boleh masuk ke file pengontrol kami.
Sebagai gantinya kami akan menulis fungsi untuk ini dalam model Post.php
kami. Mungkin sesuatu seperti ini:
public function addPost($data = array(), $emailAdmin = true) { $this->create(); $this->save($data); // update any other tables // send the email to the admin user if ($emailAdmin) { } // if all is successful return true; }
Ini kemudian akan menghasilkan perubahan kecil pada aksi pengontrol sebagai berikut:

public function add() { if ($this->request->is('post')) { if ($this->Post->addPost($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Unable to add your post.')); } }
Seperti yang Anda lihat, tindakan baru sebenarnya kurang satu baris, karena $this->Post->create()
telah dipindahkan ke file model.
Ini adalah contoh sehari-hari yang sempurna di mana memindahkan logika ke file model adalah ide yang bagus - dan ini tentu saja membuat basis kode yang jauh lebih bersih!
Kesalahan Umum #4: Menambahkan Terlalu Banyak Kompleksitas pada Kode, Alih-alih Sering Mengulang dan Lebih Awal
Ini selalu menjadi perdebatan yang sedang berlangsung, tetapi sering kembali, dan kembali lebih awal tentu saja membuat kode tampak lebih bersih. Ini berlaku untuk metode model lebih dari apa pun.
Tapi apa sebenarnya yang saya maksud? Baiklah, mari kita lihat metode yang kami tambahkan di tutorial CakePHP di atas:
public function addPost($data = array(), $emailAdmin = true) { $this->create(); $this->save($data); // update any other tables // send the email to the admin user if ($emailAdmin) { } // if all is successful return true; }
Untuk sering kembali, dan kembali lebih awal berarti bahwa saat kami menjalankan fungsi kami, kami memeriksa untuk memastikan semuanya baik-baik saja secara teratur. Jika tidak, maka kami mengembalikan false, atau mengembalikan kesalahan CakePHP.
Mungkin paling mudah untuk menunjukkan ini dengan sebuah contoh. Ada dua cara fungsi di atas dapat ditulis:
public function addPost($data = array(), $emailAdmin = true) { if ($data) { $this->create(); $result = $this->save($data); if ($result) { // update any other tables // send the email to the admin user if ($emailAdmin) { // send the admin email } } else { // problem saving the data return false; } // if all is successful return true; } else { // no data submitted return false; } }
Lihat bagaimana kode dengan cepat menjadi tidak terbaca? Ada if
s dan else
s di mana-mana, dan fungsinya dengan cepat menjadi satu lekukan besar. Jangan salah paham, saya suka lekukan yang bersih, tetapi perhatikan bagaimana fungsinya jika ditulis dengan sering kembali, prinsip pengembalian awal.
public function addPost($data = array(), $emailAdmin = true) { if (!$data) { // no data submitted return false; } $this->create(); $result = $this->save($data); if (!$result) { // problem saving the data return false; } // update any other tables // send the email to the admin user if ($emailAdmin) { // send the admin email } // if all is successful return true; }
Langsung saja, dalam contoh kecil ini, Anda dapat melihat kode hanya memiliki satu lekukan dan jauh lebih mudah dibaca. Logikanya sebenarnya lebih masuk akal - biarkan logika berjalan melalui baris demi baris, dan jika ada masalah di sepanjang jalan, kembalikan kesalahan dan jangan lanjutkan ke baris berikutnya.
Hal ini memungkinkan programmer CakePHP untuk menulis dengan cara yang sama seperti kita membaca - membaca kode dari kiri ke kanan, atas ke bawah, daripada di blok yang berbeda, yang dapat dengan cepat membingungkan!
Kesalahan Umum #5: Tidak Menggunakan Prinsip KERING
KERING adalah singkatan dari Don't Repeat Yourself, dan ini adalah filosofi yang harus diikuti ketika coding di CakePHP. Dengan kode berorientasi objek, tidak ada alasan untuk mengulangi blok kode yang sama dua kali!
Berikut adalah beberapa tips CakePHP untuk memastikan Anda tidak mengulanginya sendiri:
Seperti disebutkan di atas, bertujuan untuk menempatkan logika dalam file model sehingga Anda dapat berbagi logika.
Dalam file tampilan Anda, jika Anda mengulang tampilan, buat kode tampilan sebagai Elemen, atau bahkan pembantu khusus.
Siapkan beberapa pengaturan konfigurasi - file
app/Config/bootstrap.php
adalah tempat yang tepat untuk ini. Ini membantu memastikan Anda tidak melakukan hard coding hal-hal seperti nama aplikasi dan alamat email utama. Hal terakhir yang ingin Anda lakukan adalah menelusuri ratusan file hanya karena klien telah meminta untuk memperbarui alamat email dalam suatu aplikasi.Selalu tanyakan pada diri sendiri, “Jika saya mengulangi kode, apakah ada cara yang lebih baik untuk menulis kode ini, dan apakah saya meletakkan kode ini di tempat yang tepat?” Kemungkinannya adalah, jika Anda perlu mengulang kode, itu bisa ditulis lebih baik.
Kesalahan Umum #6: Tidak Mengomentari Kode
Poin terakhir yang akan saya buat adalah dalam hal komentar. Pertama, pemblokiran dokumen. Blok dokumen adalah saat Anda mendokumentasikan metode atau tindakan. Hanya perlu satu menit untuk merekam sedikit tentang apa yang dilakukan suatu fungsi, tetapi itu membuat perbedaan dalam hal keterbacaan kode.
Blok CakePHP Doc harus berlawanan dengan margin kiri halaman. Jadi contoh sederhana menggunakan kode dari atas.
/** * Adds & saves a post as well as emails the admin to let them know the post has been added. * Also performs some saving to another table * * @param array $data The post data * @param bool $emailAdmin If set to true, will email the website admin * @return bool Returns true if successful */ public function addPost($data = array(), $emailAdmin = true) {
Seperti yang akan Anda lihat, tidak perlu waktu lama untuk menulis blok dokumen, tetapi itu membuat perbedaan besar dalam hal umur panjang kode. Pada akhirnya, itu berarti kode tersebut dapat hidup di masa lalu Anda sebagai pengembang.
Begitu juga dengan komentar sebaris. Jangan takut untuk menjelaskan apa yang dilakukan kode Anda dan mengapa! Itu membuatnya jauh lebih mudah dalam jangka panjang untuk memahami kode Anda, terutama jika pengembang lain melihatnya!
Bungkus
CakePHP adalah kerangka kerja yang luas dan berfitur lengkap. Mengingat mengikuti konvensi atas konfigurasi, CakePHP lebih ketat daripada kerangka kerja berbasis PHP lainnya, dalam arti bahwa pengguna "dipaksa" untuk mengikuti cara tertentu meletakkan kode. Ini bisa menjadi kontroversial, tetapi menurut pengalaman saya ini mengarah ke basis kode yang lebih konsisten, mudah dibaca, dan dimengerti - daripada membiarkan pengembang "memilih" bagaimana kode harus ditulis, tim pengembangan akan menulis kode yang konsisten dengan mengikuti konvensi Cake .
Dengan mengikuti tutorial CakePHP ini dan memastikan kode Anda ditulis dengan baik, aplikasi dapat bertahan dalam ujian waktu. Kode harus selalu ditulis untuk besok - sehingga jika pengembang lain melihat blok kode tertentu bertahun-tahun kemudian, dia akan memahami kode tersebut, dan tetap berpegang pada standar yang diharapkan. CakePHP tidak berbeda dan mudah-mudahan panduan ini akan membantu memperbaiki beberapa kebiasaan buruk.