Halaman, kerangka kerja PHP MVC ultra-simplistik
Lihat proyek anak dari proyek ini: https://github.com/h3rb/papi dan https://github.com/h3rb/pagemin
Mendemonstrasikan pengaturan aplikasi kerangka kerja "halaman" baru di domain APACHE2 yang telah dikonfigurasi sebelumnya http://indiedev.space klik di sini untuk demo: https://asciinema.org/a/dbaycbfxgbyh4jqmbj1vnxumr
Demonstrasi di atas menunjukkan cara:
Hak Cipta (C) 2015-2017, H. Elwood Gilliland III Semua hak dilindungi undang-undang.
Redistribusi dan penggunaan dalam bentuk sumber dan biner, dengan atau tanpa modifikasi, diizinkan dengan ketentuan bahwa kondisi berikut dipenuhi:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
Perangkat lunak ini disediakan oleh pemegang hak cipta dan kontributor "sebagaimana adanya" dan setiap jaminan tersirat atau tersirat, termasuk, tetapi tidak terbatas pada, jaminan tersirat dari dapat diperjualbelikan dan kebugaran untuk tujuan tertentu ditolak. Dalam hal apa pun pemegang atau kontributor hak cipta tidak akan bertanggung jawab atas kerusakan langsung, tidak langsung, insidental, khusus, teladan, atau konsekuensial (termasuk, tetapi tidak terbatas pada, pengadaan barang atau layanan pengganti; hilang Disarankan tentang kemungkinan kerusakan tersebut.
Kerangka kerja halaman sangat mudah tetapi memiliki sedikit dokumen. Baca saja index.php dan gali dari sana untuk melihat cara kerja login. Halaman pendaftaran belum dibuat, tetapi login tersedia untuk akun admin default.
Dari titik ini Anda dapat melakukan apa saja. Halaman secara khusus bagus untuk mengembangkan aplikasi web berbasis PHP-> PDO minimal. Yang Anda butuhkan untuk menginstal halaman adalah memasukkannya ke dalam folder dan memeriksa ulang .htaccess dan satu pengaturan jalur, dan Anda keemasan. Penyebaran beberapa halaman dapat berbagi database otentikasi yang sama. Mengapa menggunakan beberapa kerangka kerja raksasa? Semua yang Anda butuhkan ada di sini untuk mulai membangun alat kolaboratif untuk tim, atau layanan web publik seperti blog, situs media sosial khusus, apa pun!
Harap dicatat bahwa semua yang benar -benar Anda butuhkan muncul di folder "Core", yang lainnya hanyalah implementasi di atas inti itu. Semua inti yang disediakan adalah objek halaman, pembungkus PDO dan beberapa fitur yang sangat berguna secara mendasar, yang lainnya diimplementasikan di folder utama atau salah satu sub-folder lainnya. Jika Anda memahami semuanya di /inti /, yang lainnya dapat dihapus (kecuali mungkin folder cache). Untuk kembali ke minimum, cukup potong "inti" dengan pemotong kue. Ada versi yang tersedia ini sekarang disebut pagemin http://github.com/h3rb/pagemin
Halaman ditulis untuk PHP5 tetapi berfungsi dengan baik di PHP7 karena menggunakan serangkaian fitur bahasa PHP yang minimal. Satu hal yang harus Anda waspadai adalah penggunaan ampersand (&) karena beberapa robek dan halaman demo dapat menggunakannya dalam bentuk & $ p tetapi Anda dapat menggantinya dengan $ p. Proyek ini dimulai pada 2008, tetapi tidak memiliki nama "halaman" saat itu. Itu dihidupkan kembali, dipulihkan dan diganti namanya pada tahun 2014, ketika menjadi "benih" untuk sistem intranet internal startup pencetakan 3D. Saya menggunakannya untuk membuat alat untuk lostastronaut.com, dan sebagai "agar" dasar untuk situs web lampu lainnya di mana saya ingin banyak fungsi back-end khusus. Itu juga telah digunakan di Wamp.
Penggunaan:
Dengan kerangka kerja ini sejauh ini saya telah membuat beberapa sistem perusahaan yang berfungsi penuh dan digunakan. Saya membuat intranet perusahaan yang aman, sistem manajemen konten bersama berbasis database dan alat pengeditan untuk departemen desain, situs web metrik produk terintegrasi lengkap dengan pemrosesan data, dan beberapa aplikasi utilitas. Sangat mudah untuk digunakan dan kemudian mulai berkembang segera setelah Anda tahu dasar -dasarnya. Bekerja paling andal hanya pada tumpukan lampu. Implementasi Wamp dapat bekerja dengan beberapa modifikasi, tetapi tidak ada orang Gaurante. Telah digunakan ke contoh AWS dan dapat dikurangi menjadi jejak minimal jika Anda menghapus fungsionalitas sampel yang dikemas dengannya.
Anda bisa menempel halaman di folder dan melampirkannya ke database. Anda dapat mengulangi proses itu jika Anda ingin membuat beberapa set fungsionalitas.
Memberikan dasar -dasarnya:
Filsafat:
Contoh file PHP "halaman" controller-view yang khas:
include " core/Page.php " ;
$ p = new Page ;
$ p -> title = " My wickid page " ;
if ( Session:: is_logged_in () ) // Checks to see if user is logged in or not...
$ p -> HTML ( " Hey I'm logged in!!!! YAY! " );
else $ p -> HTML ( " not logged in.. :( " );
$ p -> Render (); // Puts page to screen.Contoh file PHP "otomatis dari skrip" khas:
include " core/automation.php " ; // Does everything Page does except create the Page class.. no Auth either.
//... load models and do stuff to db ...Untuk mengatur penebangan granular penuh (disimpan dalam cache/log/log.txt.txt):
global $ plog_level ; $ plog_level = 1 ; // must appear before Page.php is included
include ' core/Page.php ' ;Contoh cara membuat model baru:
Cara melampirkan ke tabel database menggunakan model:
global $ database ;
$ my_model = new tableName ( $ database );Lihat File di Core/ PDO/ Untuk mempelajari cara kerja semuanya.
Menginstal dan Menggunakan JQuery
Halaman mendukung versi jQuery apa pun, dan memiliki beberapa fitur dasar yang memungkinkan Anda menggunakan jQuery secara terprogram. Tidak seperti kerangka kerja lain atau kode organisasi organisasi, Anda ingin memecah plugin jQuery Anda ke dalam CSS/ dan JS/ folder, menempatkan CSS dan gambar di CSS/ dan file JavaScript di JS/ sehingga Anda dapat menggunakan $ Page-> JS () $ Page-> CSS () untuk memuatnya. Gunakan $ page-> jq () untuk menempelkan baris di area dokumen siap () dan gunakan $ page-> js () untuk ditambahkan ke javascript global halaman.
include ' core/Page.php ' ;
$ p = new Page ();
$ p -> JS ( ' somejsfile.js ' );
$ p -> JS ( ' http://cdn.url.com ' );
$ p -> JQuery (); // Loads Jquery automatically
$ p -> JQ ( '
$("#docisready").on("click" ... );
' );
$ p -> JS ( ' var myGlobal=1; setInterval(function(){alert( ' foo');}, 1000 );');Selain itu, Anda ingin menyadari bahwa jika Anda memuat jQuery khusus Anda sendiri, baik memodifikasi urutan pemuatan di inti/halaman.php ke versi pilihan Anda di lokasi pilihan Anda, atau memuatnya melalui metode lain dan menginformasikan halaman bahwa sudah diinstal agar tidak menginstalnya dua kali, dengan melakukan:
$page->jq_loaded=TRUE;
Widget data umum "pengeditan langsung" bawaan
(Metode di kelas inti halaman, tetapi bagian dari fungsi non-inti)
Halaman telah digunakan untuk mengedit data basis data-sebagai front-end database untuk intranet perusahaan-dan memungkinkan Anda dan orang lain mengedit data dengan cepat. Anda bahkan dapat menggunakan fitur bawaan seperti penguncian otomatis dan penguncian baris untuk melindungi data dari sniping edit. Dukungan penguncian baris ada di shreds/autolocks.php
Semua widget ini terikat pada Ajax.*. File PHP dan memiliki beberapa kelemahan kecil. Mereka ditulis untuk bekerja, tetapi dengan mengorbankan jaringan (itu tidak menemui atau menunda pesan keluar). Juga, jika Anda dengan cepat meninggalkan halaman setelah mengubah sesuatu, permintaan mungkin tidak selesai. Jadi, jika Anda akan meninggalkan halaman, tunggu setidaknya 1-2 detik tergantung pada latensi jaringan Anda saat ini.
Juga, Anda perlu menggunakan ACLS untuk mengamankan pengguna basis data Anda dari mengedit hal -hal yang tidak diizinkan. Anda dapat menggunakan ACL dengan level granularitas tabel atau lapangan, dalam bentuk edit-tableName atau edit-tableName-fieldname. Kelas ACL didefinisikan dalam shreds/acl.php dan "tag" ACL ini diperiksa di beberapa file AJAX.*. File PHP. Mereka harus disimpan di profil pengguna. "Admin" ACLS khusus dan "Su" membiarkan Anda melewati keamanan ini! Hati -hati di luar sana.
Anda harus menggunakan jQuery dan plug-in dukungan yang mereka butuhkan, dan Anda harus mengaktifkan fitur-fitur ini menggunakan $ page-> bind_loadplugins ();
Setelah diaktifkan, Anda menggunakan opsi $ Page-> Bind* untuk memodifikasi database global $ Anda. Anda harus membacanya di Core/Page.php
$ p = new Page ();
$ p -> Bind_LoadPlugins (); // Automatically loads jQuery and the required jQuery plugins.
$ p -> BindString (...);melihat/
Berisi apa pun yang ingin Anda sebut secara tegas "tampilan" - tidak termasuk secara otomatis, memohon dengan: Sertakan "view/myview.php"
otomatisasi/
Berisi apa pun yang tidak Anda keberatan di folder web (jika tidak, gunakan folder yang disebut/offline) biasanya dalam bentuk skrip bash dan/atau php yang menggunakan titik masuk inti/otomasi.php.
cache/
Berisi file log (dari fungsi plog) dan caching untuk plugin apa pun yang mungkin Anda gunakan, atau apa pun yang ingin Anda cache.
Pastikan ini bisa ditulis dan semua sub-foldernya ...
inti/
Berisi inti dari kerangka halaman. Core/Page.php adalah yang ingin Anda sertakan sepanjang waktu. Core/Automation.php adalah untuk skrip offline yang perlu mengakses model Anda. Core/Utility.php adalah tempat saya menjaga semua fungsi pembantu yang bermanfaat.
Core/PDO/
Berisi fungsionalitas terkait PDO. Yang perlu Anda perluas adalah model. Anda harus membacanya untuk merasakan opsi dan antarmuka.
CSS/
Berisi file Main.CSS dan CSS lainnya untuk plugin atau area khusus situs Anda. Anda dapat memasukkan file -file ini seperti ini:
$ p -> CSS ( ' main.css ' ); // Includes css/main.css
$ p -> CSS ( ' myplugin/plugin.css ' ); // Includes css/myplugin/plugin.css. mesin/
Folder ini berisi apa pun yang lebih "seperti mesin", dan file secara otomatis disertakan sehingga mereka harus, dengan pengecualian .htaccess, berakhir di .php dan menjadi kode yang valid (tidak ada kesalahan sintaks).
bentuk/
Berisi file khusus untuk kelas DataForm, biasanya dinamai seperti form_name.txt, yang digunakan untuk secara langsung memetakan formulir web klasik ke bidang dalam database untuk entri dan pengeditan data.
contoh/
Berisi beberapa contoh dan catatan.
global/
Folder ini berisi apa pun yang "seperti global", dan file-file tersebut dimasukkan secara otomatis sehingga mereka harus, dengan pengecualian .htaccess, berakhir di .php dan menjadi kode yang valid (tidak ada kesalahan sintaks). Secara umum Anda hanya memohon arahan global dan menyiapkan default, meskipun Anda bisa membuatnya "lebih pintar" dengan cara apa pun yang Anda inginkan.
html/
Berisi cuplikan html yang dapat dimuat ke dalam halaman -> html dengan referensi file, contoh $ p-> html ('myfile.html') secara otomatis ditemukan dalam html/
JS/
Letakkan file JavaScript Anda di sini. Ketika Anda $p->JS('somefile.js') itu akan terlihat di sini, dan juga mengenali URL CDN.
PHTML/
Apa pun yang ingin Anda evaluasi dan termasuk HTML mode campuran di sini. Bukan fitur yang disarankan, tetapi saya menambahkannya jika Anda ingin melakukan hal semacam ini.
skema/
Skema basis data apa pun yang Anda gunakan untuk membuat situs Anda dapat disimpan di sini, tetapi tidak aman. Hapus folder ini jika Anda mau.
Pengaturan/
Berisi file konfigurasi. Semua file dalam folder ini dimuat secara otomatis, dan harus berakhir di .php dan berisi kode PHP yang valid.
ui/
Berisi file cuplikan UI yang memanfaatkan kelas dasar UI di core/ui.php - Saya akhirnya membuat milik saya di shreds/ sebagai gantinya, tetapi Anda dapat menggunakan ini jika Anda mau. Semua file dalam folder ini dimuat secara otomatis, dan harus berakhir di .php dan berisi kode PHP yang valid.
model/
Berisi file konfigurasi. Semua file dalam folder ini dimuat secara otomatis, dan harus berakhir di .php dan berisi kode PHP yang valid.
Rebus/
Berisi modul yang dimuat secara otomatis, cuplikan, fungsi, apa pun. Saya menggunakannya untuk membungkus plug-in jQuery (atau potongan JavaScript lainnya) di PHP untuk pra-pemrosesan ketika saya tidak ingin menanganinya dengan cara lain. Misalnya saya menerapkan fungsionalitas terkait Muuri.js dengan cara ini, sehingga Anda dapat menggunakannya di titik akhir daripada dalam fragmen halaman inklusi html/ folder, atau file JS yang disertakan.
modul/
File yang ingin Anda sertakan secara manual. Mirip dengan vendor/ folder dalam kue. include 'module/whatever.php'
Saya/
Gambar Anda! Ini semua dirujuk dalam file .html misalnya. Atau Anda dapat merujuk mereka dengan i/
Docs/
Dokumentasi yang ingin Anda sediakan di situs Anda atau untuk orang lain. Jika ada .sql di sini, hapus setelah Anda menggunakannya.
Anda harus kedaluwarsa A2Enmod termasuk menulis ulang McRypt dan mungkin beberapa lainnya.
Untuk kenyamanan, saya sudah memasukkan pedoman di sini untuk memandu Anda melalui pengaturan Ubuntu/PHP/APACHE2. Ini bekerja dengan baik pada contoh AWS EC2. Setelah itu, mungkin memerlukan reboot mesin.
Jika Anda memasang php7.1 dengan FPM, di Ubuntu 16.04 LTS, Anda akan melakukan ini sebelum salah satu di atas:
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y unzip apache2 php7.1 php7.1-cli php7.1-common libapache2-mod-php7.1 php7.1-mysql php7.1-fpm php7.1-curl php7.1-gd php7.1-bz2 php7.1-mcrypt php7.1-json php7.1-tidy php7.1-imagick php7.1-mbstring php-redis php-memcached
sudo a2enmod expires include rewrite mcrypt
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.1-fpm
sudo service apache2 restart
Nama Pengguna Admin Default: Kata Sandi Admin untuk Admin: Satu Ruang '' (Ubah Setelah Anda Masuk)
Fatal error: Call to a member function Select() on a non-object in /var/www/core/PDO/model.php on line 104
Ini berarti basis data Anda tidak diatur dengan benar. Entah itu tidak ada, atau tidak tersedia.
Halaman Skeleton Situs Sampel hadir, termasuk auth bawaan, ditulis dalam versi MySQL yang kurang ketat daripada yang diinstal secara default. Anda akan melihat kesalahan saat menulis ke database jika ini masalahnya.
Untuk mematikan beberapa pembatasan ini, SSH masuk ke server Anda sebagai root dan membuat file ini: /etc/mysql/conf.d/disable_strict_mode.cnf
Buka file dan masukkan dua baris ini:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Lengkapi operasi dengan memulai kembali MySQL.
sudo service mysql restart
Untuk memulai proyek sepenuhnya dari awal menggunakan hanya fungsi inti
Kinerja dan penebangan
Anda tidak boleh mengizinkan $ PLOG_LEVEL = 1 pengaturan di server produksi.
Anda tidak boleh menyimpan skema Anda di folder web publik Anda, ini termasuk page_authdb.sql yang sudah dikemas sebelumnya, untuk alasan yang jelas.
Kepemilikan atas data
Perhatikan bahwa Anda harus memeriksa semua permintaan yang terkait dengan database untuk kepemilikan dan kemampuan dipandang. Akhirnya, begitu saya punya waktu untuk mengimplementasikan Porm Modul Inti, halaman akan menangani sebagian dari ini untuk Anda mengenai kepemilikan atas data, tetapi terserah Anda untuk melakukan pengerasan dan validasi data yang diperlukan untuk diambil dan disimpan dari database. Mengetahui hal ini, banyak ajax.?.php mungkin tidak memeriksa kepemilikan atas data karena halaman awalnya ditulis untuk alat yang transparan dan digunakan secara internal. Anda harus mengimplementasikan sistem kepemilikan database Anda sendiri (izin individu dan individu, publik dan swasta).
Menyembunyikan kode sumber pribadi
Halaman bergantung pada fitur file .htaccess apache2 (atau spesifisitas konfigurasi umum di dalam vhost atau httpd atau port atau. Mana pun yang Anda gunakan) untuk mengatur izin khusus dan parameter dari setiap folder web dan subfoldernya. Ini dilakukan untuk memungkinkan halaman dimasukkan ke dalam proyek lain, atau untuk ditempatkan di banyak tempat di server web yang sama. Halaman out-of-the-box, dapat ditempatkan di folder dan hampir semua file akan disembunyikan kecuali di folder utama. Bahkan subfolder baru yang Anda buat tidak akan dapat diakses secara publik kecuali Anda membuat file .htaccess yang mengizinkannya.
Jika Anda menggunakan Nginx atau apa pun selain Apache, Anda dapat melewatkan dua paragraf berikutnya dan mengikuti instruksi.
Namun, beberapa orang tampaknya berpikir bahwa ini adalah ide yang buruk. Selama Anda berhati -hati kode apa yang Anda tambahkan ke halaman, Anda harus dapat membuat situs web yang aman. Di masa lalu, ini dilakukan untuk PHP dengan menguji di bagian atas masing -masing file yang disertakan apakah sumber daya sedang dimuat oleh browser jarak jauh, atau dimasukkan dalam file (Codeigniter, Zend, misalnya). Halaman tidak melakukan ini, karena seluruh folder tidak dapat diakses, dan juga jika mereka berhasil menjalankan salah satu file "kelas", tidak ada yang akan terjadi dengan signifikansi apa pun. Terlepas dari itu, beberapa orang tampaknya percaya bahwa peretas entah bagaimana dapat membodohi Apache2 untuk mengabaikan file .htaccess. Halaman, dan kemampuan unggahannya, jangan mengizinkan ini. Juga, halaman tidak memerlukan eval() untuk digunakan untuk apa pun, karena tidak menggunakan metode yang sama untuk mengimplementasikan MVC sebagai kerangka kerja lainnya (Codeigniter, Zend, misalnya).
Jika Anda yakin alasan bahwa memasukkan kode ke dalam folder yang terbuka tetapi tidak dapat diakses secara publik adalah ide yang buruk, maka untuk halaman Anda dapat dibuat lebih aman dengan memindahkannya ke folder offline, dan hanya mengekspos titik akhir publik PHP (file yang Anda inginkan untuk dicekal) di folder server web Anda. Saya pribadi tidak melihat manfaatnya, kecuali bahwa itu tidak mungkin bagi Anda untuk mengacaukan dan tidak memiliki file .htaccess di tempat yang Anda butuhkan. Salah satu efek samping dari melakukan ini adalah bahwa jika Anda memiliki beberapa situs yang dibangun di halaman, dan ingin mempertahankan satu inti, Anda dapat menggunakan metode yang sama ini untuk melakukannya.
Untuk menjaga halaman di luar ruang lingkup dan di folder web offline:
Anda mungkin harus menyesuaikan beberapa baris pertama dari inti/halaman.php Anda yang sebenarnya untuk mencerminkan perbedaan jalur ini, di mana Anda melihat include_all dan include_once terkait dengan inti, tetapi harus baik -baik saja karena pada titik ini relatif terhadap file core/Page.php yang disertakan.
Jika Anda secara manual menyertakan modul apa pun, Anda harus menambahkan /path/to/page/folder/
Suatu hari saya akan lebih lanjut mengimplementasikan pown, yang akan memfasilitasi penyemaian database dan fitur migrasi skema untuk membuat hidup lebih mudah. Anda akan dapat membuat seluruh deskripsi database dalam file teks khusus (akan terlihat seperti deklarasi kelas dalam C ++ / Java), dan mengonversinya menjadi pohon JSON (yang juga dapat Anda baca dari file) dan kemudian memberi makan itu ke konstruktor kelas, dan berupaya untuk mengerahkan database, atau migrasi menggunakan $orm->Deploy() yang hilang (di mana migasi, atau migrasi menggunakan $ orm-> deploy (). tipe lama pertama)
Pikiran
Saat saya menggunakan halaman semakin banyak saya menemukan itu membuat ketagihan. Halaman memiliki yang setara di dunia NodeJs: ExpressJS. Apapun, tangan -tangan tua ini masih mengetik PHP lebih cepat. Saya menggunakan PHP untuk alat internal di LostAstronaut.com cukup efektif karena relatif mirip dengan C ++ yang saya tulis mesin game Windows saya. Saya juga sedang mengerjakan beberapa situs web lain yang akan menggunakannya. Masih tidak ada yang terasa lebih kuat daripada bisa membuat JavaScript khusus menggunakan PHP, bahkan jika itu adalah mimpi buruk sintaksis.