Untuk pekerjaan saya sehari-hari, saya sering perlu menyiapkan aplikasi PHP super sederhana, hanya beberapa halaman statis ditambah beberapa halaman dinamis dengan panggilan database sederhana, satu atau dua formulir sederhana, dan mungkin sedikit AJAX. Anda tahu, hal-hal khas agensi. Hal ini sering menimbulkan masalah: menggunakan kerangka kerja yang sebenarnya atau Hanya beberapa file .php yang tercampur? Hasilnya adalah MINI, sebuah aplikasi PHP yang sangat sederhana (bahkan mungkin sebuah kerangka kerja), lebih lanjut tentang itu di artikel lain atau langsung di GitHub.
Karena MINI benar-benar mendasar, saya mencoba mengupgrade proyek ini sedikit dengan membangun aplikasi sederhana yang sama dari awal, kali ini di atas microframework Slim yang populer. Hasilnya adalah MINI2, skrip super sederhana yang dapat menjadi fondasi yang sangat sederhana namun sangat kuat untuk aplikasi PHP kecil. Karena logika inti aplikasi sekarang disediakan oleh Slim, skripnya sendiri sangat ringkas dan hanya terdiri dari 2(!) file php bersama dengan beberapa templat tampilan dan hal-hal .js dan .css acak.
Fitur MINI2
- Dibangun pada Slim (Anda dapat dengan mudah memperbarui Slim tanpa merugikan MINI2)
- rute yang tenang
- Sangat sederhana: hanya 2 file .php untuk keseluruhan aplikasi (ditambah dependensi eksternal dan templat tampilan)
- Buatlah URL yang “bagus” dan bersih (mis. contoh.com/car/show/17TIDAK contoh.com/index.php?type=car&action=show&id=17)
- Gunakan Twig sebagai mesin template, yang lain juga dimungkinkan (melalui paket Slim)
- Gunakan PDO murni daripada ORM (lebih mudah ditangani)
- Fungsi dasar CRUD: membuat, membaca, memperbarui/mengedit, dan menghapus konten
- pencarian dasar
- Demo AJAX dasar
- (Opsional) Tampilkan pernyataan SQL PDO yang disimulasikan untuk memfasilitasi proses debug
- (Opsional) Kompilasi SCSS ke CSS secara dinamis
- (Opsional) Perkecil CSS secara dinamis
- (Opsional) Perkecil JS secara dinamis
- (Opsional) Sakelar Pengembangan/Pengujian/Produksi
Persyaratan MINI2
- PHP 5.3+
- MySQL
- mod_rewrite dimulai (saat menggunakan Apache), dan root dokumen dialihkan ke /public (tutorial di bawah)
Tangkapan layar sederhana
Memasang
Panduan instalasi cepat tersedia di GitHub. Jika Anda familiar dengan Vagrant, ada juga instalasi sekali klik (yo, sederhana saja Berkeliaran ke atas perintah), ini akan membangun Ubuntu 14.04 LTS yang dikonfigurasi sepenuhnya berisi MINI2. Lihat readme GitHub untuk informasi lebih lanjut.
Struktur MINI2
Dua folder, kecil Dan rakyat. Dimiliki secara publik indeks.php Ini berisi logika aplikasi serta file JavaScript, file scss (SASS) / CSS, dan tentu saja .htaccess Dengan cara ini Anda dapat membuat URL yang indah. Kompilasi SASS ke CSS sepenuhnya opsional, Anda dapat mematikannya dengan mengomentari sebaris kode nanti.
map kecil Berisi – selain konten instalasi – saja model/model.php Berisi sekumpulan metode manipulasi data (model MVC) dan folder melihat Ini berisi sekumpulan file Twig (hanya HTML dengan kode pendek untuk menggemakan variabel PHP dengan mudah), jadi ini adalah tampilan MVC. Sebelum Anda bertanya: tidak ada folder pengontrol sebagai indeks.php sebagai pengontrol.
Di folder root ada komposer.json Ini berisi dependensi untuk memuat dan aturan untuk memuat file secara otomatis. Ketika Anda mendapatkan dependensi saat menginstal MINI2, Composer akan memuat Slim (router, lebih lanjut tentang itu nanti), Twig (mesin template yang merender HTML dan variabel dalam file .twig), dan beberapa gadget lainnya, dan menempatkannya secara otomatis. Entri telah dibuat penjaja Folder, Anda tahu prosesnya. Jika Anda tidak tahu artinya, MINI2 bukan untuk Anda, maaf.
subfolder modul di dalam publik/scss Hanya berisi .scss dengan variabel (mis. $font-warna: #222222;) untuk rendering SASS yang lebih mudah, yang merupakan cara umum untuk memodulasi scss.
map _Memasang ada kecil Berisi 3 pernyataan .sql yang berisi data demo untuk pengaturan demo yang berfungsi, folder ini _gelandangan berisi a file tersesat dan sebuah pemuat boot Buat kotak Ubuntu 14.04 LTS yang 100% terinstal secara otomatis dan jalankan MINI2 di dalamnya.
Bagaimana MINI2 bekerja
MINI2 berfungsi seperti kebanyakan kerangka kerja lainnya dan menggunakan URL berikut: example.com/songs, contoh.com/songs/editsong/17, example.com/subhalaman Tunggu daripada menjadi jelek dan berantakan indeks.php?xxx=111&yyy=222 URI. Secara default, instalasi MINI2 memerlukan konfigurasi sederhana Apache (atau nginx atau IIS) untuk merutekan pengguna secara langsung /publik/index.php. Ini mudah diatur dan dijelaskan dengan jelas dalam tutorial instalasi. Hal ini juga menghalangi akses terhadap hal lain selain estetika /rakyat folder, ini membuat aplikasi Anda lebih aman dan juga melindungi potensi file/folder .git, file swap/noise, dll. agar tidak tergulung, dll.
mari kita lihat publik/index.phplangkah demi langkah:
view = new \Slim\Views\Twig(); $app->view->setTemplatesDirectory("../Mini/view");
Untuk pengembangan, pelaporan kesalahan diatur ke maksimum, kemudian Composer-autoloader dimuat, dan Slim diinisialisasi. Saat kita menggunakan Twig sebagai mesin templat, Twig juga diinisialisasi dan jalur ke file tampilan ditentukan. Omong-omong, saya sangat menyukai cara Slim menangani masalah ini: $aplikasi->lihat. Cantik!
/******************************************* THE CONFIGS *******************************************************/ // Configs for mode "development" (Slim's default), see the GitHub readme for details on setting the environment $app->configureMode('development', function () use ($app) { // pre-application hook, performs stuff before real action happens @see http://docs.slimframework.com/#Hooks $app->hook('slim.before', function () use ($app) { // SASS-to-CSS compiler @see https://github.com/panique/php-sass SassCompiler::run("scss/", "css/"); // CSS minifier @see https://github.com/matthiasmullie/minify $minifier = new MatthiasMullie\Minify\CSS('css/style.css'); $minifier->minify('css/style.css'); // JS minifier @see https://github.com/matthiasmullie/minify // DON'T overwrite your real .js files, always save into a different file //$minifier = new MatthiasMullie\Minify\JS('js/application.js'); //$minifier->minify('js/application.minified.js'); }); // Set the configs for development environment $app->config(array( 'debug' => true, 'database' => array( 'db_host' => 'localhost', 'db_port' => '', 'db_name' => 'mini', 'db_user' => 'root', 'db_pass' => 'your_password' ) )); });
Di sini kita mendefinisikan konfigurasi lingkungan pengembangan. Untuk menentukannya untuk produksi, Anda cukup menyalin blok ini dan mengisi kredensial yang sesuai. Untuk informasi selengkapnya, lihat readme GitHub. melompati $application->kait Blokir dan lihat untuk sementara $Aplikasi->Konfigurasi: Ini cukup jelas kan? Oke, kembali ke $application->kait: Ini adalah Slim’s hooks, blok kode yang dipanggil pada titik tertentu dalam siklus hidup aplikasi (dalam hal ini, sebelum aplikasi berjalan). Di sini, dalam pengaturan default, baris-baris ini hanya mengkompilasi file .scss kita menjadi .css, dan style.css diperkecil, keduanya melalui perpustakaan yang dimuat oleh Komposer.
/******************************************** THE MODEL ********************************************************/ // Initialize the model, pass the database configs. $model can now perform all methods from Mini\model\model.php $model = new \Mini\model\model($app->config('database'));
Hanya ada satu baris. Untuk memahami ini dengan lebih baik, lihat mini/model/model.php (disingkat untuk penjelasan yang lebih baik):
id) instead of array ($result["id"]) // @see http://php.net/manual/de/pdo.construct.php $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING); // create new PDO db connection $this->db = new PDO($dsn, $config['db_user'], $config['db_pass'], $options); } /** * Get all songs from database */ public function getAllSongs() { $sql = "SELECT id, artist, track, link, year, country, genre FROM song"; $query = $this->db->prepare($sql); $query->execute(); return $query->fetchAll(); } }
Ini hanyalah kelas sederhana yang memerlukan array dengan konfigurasi database saat dibangun. Saat membangun, koneksi database dibuat dan semua metode (biasanya panggilan database dan blok manipulasi data) tersedia. Jadi, kembali ke kita indeks.phpmari kita lihat baris ini lagi:
/******************************************** THE MODEL ********************************************************/ // Initialize the model, pass the database configs. $model can now perform all methods from Mini\model\model.php $model = new \Mini\model\model($app->config('database'));
Jadi, kita membuat objek model di atas dan meneruskan konfigurasi ke sana. Kami sekarang dapat melakukan operasi pada $model seperti $Model->getAllSongs(); ! Sangat sederhana.
/************************************ THE ROUTES / CONTROLLERS *************************************************/ // GET request on homepage, simply show the view template index.twig $app->get('/', function () use ($app) { $app->render('index.twig'); }); // GET request on /subpage, simply show the view template subpage.twig $app->get('/subpage', function () use ($app) { $app->render('subpage.twig'); });
Di sinilah tindakan sebenarnya dimulai: di sini rute, beberapa orang mungkin juga menyebutnya pengontrol, ditentukan. Logika di baliknya sangat sederhana, semua yang ada di dalamnya $aplikasi->dapatkan(‘/’ …akan dipanggil ketika permintaan GET dibuat di halaman beranda proyek, seperti example.com, dengan semua konten di dalamnya $app->dapatkan(‘/’subhalaman …akan dipanggil saat membuat permintaan GET di example.com/subhalaman. Sangat sederhana. Router Slim dapat menangani GET (pengaturan default browser saat “menjelajah” situs web), POST (biasanya saat mengirimkan formulir), dan sebagian besar kata kerja REST lainnya.
garis $app->render(‘index.ranting’); Mengatakan apa yang Anda harapkan: dokumentasi mini/view/index.ranting (hanya HTML biasa dalam kasus ini) dimuat, sehingga halaman statis sederhana ditampilkan dalam kasus ini. Lihat dokumentasi Ranting untuk informasi lebih lanjut. Anda akan menyukai Twig karena pastinya lebih mudah (!) daripada PHP murni.
Sekarang untuk beberapa rute yang lebih kompleks:
// All requests on /songs and behind (/songs/search etc) are grouped here. Note that $model is passed (as some routes // in /songs... use the model) $app->group('/songs', function () use ($app, $model) { // GET request on /songs. Perform actions getAmountOfSongs() and getAllSongs() and pass the result to the view. // Note that $model is passed to the route via "use ($app, $model)". I've written it like that to prevent creating // the model / database connection in routes that does not need the model / db connection. $app->get('/', function () use ($app, $model) { $amount_of_songs = $model->getAmountOfSongs(); $songs = $model->getAllSongs(); $app->render('songs.twig', array( 'amount_of_songs' => $amount_of_songs, 'songs' => $songs )); }); // POST request on /songs/addsong (after a form submission from /songs). Asks for POST data, performs // model-action and passes POST data to it. Redirects the user afterwards to /songs. $app->post('/addsong', function () use ($app, $model) { // in a real-world app it would be useful to validate the values (inside the model) $model->addSong( $_POST["artist"], $_POST["track"], $_POST["link"], $_POST["year"], $_POST["country"], $_POST["genre"]); $app->redirect('/songs'); }); // GET request on /songs/deletesong/:song_id, where :song_id is a mandatory song id. // Performs an action on the model and redirects the user to /songs. $app->get('/deletesong/:song_id', function ($song_id) use ($app, $model) { $model->deleteSong($song_id); $app->redirect('/songs'); });
$aplikasi->grup(‘/lagu’ … “Kelompokkan” segala sesuatu yang terjadi di example.com/songs, seperti example.com/songs itu sendiri, example.com/songs/editsong, dll. $aplikasi->dapatkan(‘/’, ….Ini mendefinisikan apa yang terjadi di example.com/songs(/). Di sini kita menampilkan file ranting seperti sebelumnya, tetapi juga meneruskan beberapa variabel ke tampilan: Mini/view/songs.twig akan ditampilkan dan isinya $jumlah_of_lagu akan tersedia dalam dokumen ini melalui {{jumlah lagu}} [that’s the syntax of Twig]seperti ini (lagu.ranting):
<h2>We have {{ amount_of_songs }} songsh2>
Oke, kembali ke indeks.php: Kode di atas dengan jelas menunjukkan di mana $jumlah_of_lagu Dari: $amount_of_songs = $model->getAmountOfSongs(); ! Seperti yang kita definisikan $model sebelumnya, kita bisa menggunakan metode apa pun dalam kategori ini untuk mendapatkan atau memanipulasi data, seperti dalam kasus ini hanya mendapatkan angka. CATATAN PENTING: Harap diperhatikan saat kami menggunakannya $model di dalam $aplikasi->dapatkan bagian, $model Variabel harus diteruskan secara internal seperti yang ditunjukkan pada baris ini dan $Aplikasi->Grup Baris sebelumnya: menggunakan ($aplikasi, $model ..mendefinisikan variabel mana yang diketahui dalam metode ini. Tidak perlu melalui $model kita tidak bisa menggunakan $model di dalam.
Blok berikutnya: $Aplikasi->Posting( Tangani permintaan POST di example.com/songs/addsong. Kode untuk metode ini hampir cukup jelas: kita menjalankan metode berikut $model dan meneruskan beberapa variabel $_POST Di sana. Kami kemudian mengarahkan pengguna kembali ke example.com/songs melalui $aplikasi->pengalihan(‘/lagu’).
Pada dasarnya: itu saja! akhirnya indeks.php berakhir di
/******************************************* RUN THE APP *******************************************************/ $app->run();
Pastikan untuk menjalankan seluruh aplikasi. Gali lebih dalam semua file ini untuk pemahaman yang lebih baik dan beberapa contoh lainnya, seperti panggilan AJAX atau fungsi pencarian. Juga, pastikan Anda membaca dokumentasi Slim dan dokumentasi Twig yang sangat bagus.
Di mana saya dapat menemukan MINI2?
Tentu saja, di GitHub Anda juga dapat menandai halaman portal php-mini.com dan halaman Facebook. Saya juga mencoba membuat dokumentasi di php-mini.com/documentation. Ada juga versi pertama MINI (1) di GitHub.