Pada tanggal 25 April 2019, versi alpha
baru dari mikroframework Slim melihat cahaya hari, dan pada tanggal 18 Mei itu tumbuh menjadi beta
. Saya sarankan agar Anda membiasakan diri dengan versi baru.
Di bawah potongan:
- Tentang inovasi kerangka kerja
- Menulis aplikasi sederhana di Slim-4
- Tentang Slim dan PhpStorm Friendship
Baru di Slim 4
Inovasi kunci dibandingkan dengan versi 3:
- Versi minimum PHP adalah 7.1;
- Dukungan untuk PSR-15 (Middleware);
- Menghapus penerapan pesan http. Instal pustaka yang kompatibel PSR-7 dan gunakan;
- Ketergantungan Jerawat dihapus. Instal wadah kompatibel PSR-11 favorit Anda dan gunakan;
- Kemampuan untuk menggunakan router Anda (Sebelumnya, tidak mungkin untuk meninggalkan FastRoute );
- Mengubah implementasi penanganan kesalahan;
- Perubahan implementasi dari output respon;
- Menambahkan pabrik untuk membuat instance aplikasi;
- Pengaturan yang dihapus;
- Slim tidak lagi menetapkan
default_mimetype
ke string kosong, jadi Anda harus menginstalnya sendiri di php.ini
atau di aplikasi Anda menggunakan ini_set('default_mimetype', '')
; - Penangan permintaan aplikasi sekarang hanya menerima objek permintaan (dalam versi lama, itu menerima permintaan dan objek respons).
Bagaimana cara membuat aplikasi sekarang?
Di versi ketiga, membuat aplikasi tampak seperti ini:
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\App; require 'vendor/autoload.php'; $settings = [ 'addContentLengthHeader' => false, ]; $app = new App(['settings' => $settings]); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response, array $args) { $name = $args['name']; $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
Sekarang konstruktor aplikasi menerima parameter berikut:
Juga sekarang Anda dapat menggunakan metode create
statis dari pabrik aplikasi \Slim\Factory\AppFactory
.
Metode ini menerima parameter yang sama dengan input, hanya semuanya opsional.
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response) { $name = $request->getAttribute('name'); $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
Berikan saya 404 kesalahan kembali!
Jika kami mencoba membuka halaman yang tidak ada, kami mendapatkan kode respons 500
, bukan 404
. Agar kesalahan diproses dengan benar, Anda harus menghubungkan \Slim\Middleware\ErrorMiddleware
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\Factory\AppFactory; use Slim\Middleware\ErrorMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ErrorMiddleware( $app->getCallableResolver(), $app->getResponseFactory(), false, false, false ); $app->add($middleware); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response) { $name = $request->getAttribute('name'); $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
Middleware
Middleware sekarang harus menjadi implementasi PSR-15. Sebagai pengecualian, Anda dapat melewati fungsi, tetapi tanda tangan harus cocok dengan metode process()
dari antarmuka \Psr\Http\Server\MiddlewareInterface
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\RequestHandlerInterface; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->add(function (ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $response = $handler->handle($request); return $response->withHeader('Content-Type', 'application/json'); });
Tanda tangan ($request, $response, $next)
tidak lagi didukung
Bagaimana cara hidup tanpa pengaturan?
Anda dapat hidup tanpa pengaturan. Alat yang disediakan akan membantu kami dalam hal ini.
httpVersion
dan responseChunkSize
httpVersion
bertanggung jawab untuk menampilkan versi protokol dalam respons.
Pengaturan responseChunkSize
menentukan ukuran setiap chunk yang dibaca dari badan respons ketika dikirim ke browser.
Sekarang fungsi-fungsi ini dapat ditugaskan untuk emitor dari jawabannya.
Menulis emitor
<?php
Kami terhubung ke aplikasi
<?php use App\ResponseEmitter; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $serverRequestFactory = \Slim\Factory\ServerRequestCreatorFactory::create(); $request = $serverRequestFactory->createServerRequestFromGlobals();
outputBuffering
Pengaturan ini memungkinkan menyalakan / mematikan buffering output. Nilai Pengaturan:
false
- buffering dimatikan (semua panggilan untuk echo
, pernyataan print
diabaikan).'append'
- semua panggilan ke echo
, pernyataan print
ditambahkan setelah badan tanggapan'prepend'
- semua panggilan ke echo
, pernyataan print
ditambahkan sebelum badan respons
Pengembang \Slim\Middleware\OutputBufferingMiddleware
mengusulkan untuk mengganti opsi ini dengan \Slim\Middleware\OutputBufferingMiddleware
, ke dalam konstruktor di mana pabrik aliran yang kompatibel dengan PSR-17 dan mode yang dapat sama dengan append
atau prepend
<?php use Slim\Factory\AppFactory; use Slim\Factory\Psr17\SlimPsr17Factory; use Slim\Middleware\OutputBufferingMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new OutputBufferingMiddleware(SlimPsr17Factory::getStreamFactory(), OutputBufferingMiddleware::APPEND); $app->add($middleware);
determineRouteBeforeAppMiddleware
Pengaturan ini memungkinkan untuk mendapatkan rute saat ini dari objek permintaan di middleware
Pengganti disediakan \Slim\Middleware\RoutingMiddleware
<?php use Slim\Factory\AppFactory; use Slim\Middleware\RoutingMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new RoutingMiddleware($app->getRouteResolver()); $app->add($middleware);
displayErrorDetails
Pengaturan diizinkan untuk menampilkan detail kesalahan. Saat debugging, itu membuat hidup lebih mudah.
Ingat \Slim\Middleware\ErrorMiddleware
? Ini dia akan membantu kita!
<?php use Slim\Factory\AppFactory; use Slim\Middleware\ErrorMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ErrorMiddleware( $app->getCallableResolver(), $app->getResponseFactory(), true,
addContentLengthHeader
Pengaturan ini diizinkan untuk mengaktifkan / menonaktifkan penambahan otomatis header Content-Length
dengan nilai volume data di badan respons
Mengganti opsi middleware \Slim\Middleware\ContentLengthMiddleware
<?php use Slim\Factory\AppFactory; use Slim\Middleware\ContentLengthMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ContentLengthMiddleware(); $app->add($middleware);
routerCacheFile
Sekarang Anda dapat langsung menginstal file cache router
<?php use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->getRouteCollector()->setCacheFile('/path/to/cache/router.php');
Membuat aplikasi di Slim-4
Untuk melihat lebih dekat pada framework, kita akan menulis sebuah aplikasi kecil.
Aplikasi akan memiliki rute berikut:
/hello/{name}
- halaman sambutan;/
- redirect ke halaman /hello/world
- Rute lain akan mengembalikan halaman kustom dengan 404 kesalahan.
Logikanya ada di controller, kita akan me-render halaman melalui mesin template Twig
Sebagai bonus, tambahkan aplikasi konsol berdasarkan komponen Symfony Console dengan perintah yang menampilkan daftar rute
Langkah 0. Menginstal dependensi
Kami akan membutuhkan:
Saya memilih ultra-lite / wadah sebagai wadah ketergantungan, karena ringan, ringkas, dan sesuai dengan standar.
Pengembang PSR-7 dan PSR-17 Slim menyediakan slim / psr7 dalam satu paket. Kami akan menggunakannya
Diasumsikan bahwa manajer paket Komposer sudah diinstal.
Kami membuat folder untuk proyek ( /path/to/project
akan digunakan sebagai contoh) dan pergi ke sana.
Tambahkan file composer.json
ke proyek dengan konten berikut:
{ "require": { "php": ">=7.1", "slim/slim": "4.0.0-beta", "slim/psr7": "~0.3", "ultra-lite/container": "^6.2", "symfony/console": "^4.2", "twig/twig": "^2.10" }, "autoload": { "psr-4": { "App\\": "app" } } }
dan jalankan perintah
composer install
Sekarang kita memiliki semua paket yang diperlukan dan autoloader kelas dikonfigurasi.
Jika kita bekerja dengan git , tambahkan file .gitignore
dan tambahkan direktori vendor
sana (dan direktori IDE Anda jika perlu)
/.idea/* /vendor/*
Saya menggunakan IDE PhpStorm dan bangga akan hal itu . Untuk perkembangan yang nyaman, saatnya berteman dengan wadah dan IDE.
Di root proyek, buat file .phpstorm.meta.php
dan tulis kode berikut di sana:
<?php
Kode ini akan memberi tahu IDE bahwa untuk objek yang mengimplementasikan antarmuka \Psr\Container\ContainerInterface
, metode get()
akan mengembalikan objek kelas atau implementasi antarmuka yang namanya dilewatkan dalam parameter.
Langkah 1. Kerangka Aplikasi
Tambahkan direktori:
app
- kode aplikasi. Kami akan menghubungkan namespace kami untuk autoloader kelas ke sana;bin
- direktori untuk utilitas konsol;config
- di sini akan ada file konfigurasi aplikasi;public
- direktori dibuka di web (titik masuk aplikasi, gaya, js, gambar, dll.);template
- direktori template
;var
adalah direktori untuk berbagai file. Log, cache, penyimpanan lokal, dll.
Dan file-file:
config/app.ini
- konfigurasi aplikasi utama;config/app.local.ini
- config untuk lingkungan local
;app/Support/CommandMap.php
- pemetaan perintah aplikasi konsol untuk pemuatan malas.app/Support/Config.php
- Kelas konfigurasi (sehingga IDE tahu konfigurasi mana yang kita miliki).app/Support/NotFoundHandler.php
- 404 kelas penangan kesalahan.app/Support/ServiceProviderInterface.php
- Antarmuka penyedia layanan.app/Provider/AppProvider.php
- Penyedia utama aplikasi.bootstrap.php
- perakitan wadah;bin/console
- titik masuk aplikasi konsol;public/index.php
- titik masuk aplikasi web.
config / app.ini ; slim.debug=Off ; templates.dir=template ; templates.cache=var/cache/template
config / app.local.ini ; . ; slim.debug=On ; templates.cache=
Oh ya, masih bagus untuk mengecualikan konfigurasi lingkungan dari repositori. Bagaimanapun, mungkin ada tampilan / kata sandi. Tembolok juga dikecualikan.
.gitignore /.idea/* /config/* /vendor/* /var/cache/* !/config/app.ini !/var/cache/.gitkeep
app / Dukungan / CommandMap.php app / Dukungan / Config.php app / Dukungan / NotFoundHandler.php Sekarang Anda dapat mengajar PhpStorm untuk memahami kunci mana yang memiliki kunci dan jenisnya.
app / Dukungan / ServiceProviderInterface.php app / Provider / AppProvider.php Kami memindahkan perutean ke wadah sehingga kami bisa bekerja dengannya tanpa menginisialisasi objek \Slim\App
.
Dianjurkan untuk memberikan izin file ini untuk dieksekusi
chmod +x ./bin/console
Verifikasi
Luncurkan aplikasi konsol:
./bin/console
Sebagai tanggapan, jendela selamat datang untuk komponen symfony/console
akan muncul dengan dua perintah yang tersedia - help
dan list
.
Console Tool Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: help Displays help for a command list Lists commands
Sekarang mulai server web.
php -S localhost:8080 -t public public/index.php
Dan buka url apa pun di localhost: 8080.
Semua permintaan harus mengembalikan respons dengan kode 404
dan badan kosong.
Ini terjadi karena kami tidak memiliki rute yang terdaftar.
Tetap bagi kami untuk menghubungkan render, menulis templat, pengontrol dan mengatur rute.
Langkah 2. Render
Tambahkan template template/layout.twig
. Ini adalah templat dasar untuk semua halaman.
template / layout.twig {# template/layout.twig #} <!DOCTYPE html> <html lang="en"> <head> <title>{% block title %}Slim demo{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html>
Tambahkan template/hello.twig
halaman sambutan template/hello.twig
template / hello.twig {# template/hello.twig #} {% extends 'layout.twig' %} {% block title %}Slim demo::hello, {{ name }}{% endblock %} {% block content %} <h1>Welcome!</h1> <p>Hello, {{ name }}!</p> {% endblock %}
Dan template/err404.twig
halaman kesalahan template/err404.twig
template / err404.twig {# template/err404.twig #} {% extends 'layout.twig' %} {% block title %}Slim demo::not found{% endblock %} {% block content %} <h1>Error!</h1> <p>Page not found =(</p> {% endblock %}
Tambahkan app/Provider/RenderProvider.php
penyedia rendering app/Provider/RenderProvider.php
app / Provider / RenderProvider.php Nyalakan penyedia di bootstrap
Tambahkan render ke penangan kesalahan 404
app / Dukungan / NotFoundHandler.php (DIFF) app / Provider / AppProvider.php (DIFF) 404 .
3.
2:
app/Controller/HomeController.php
—app/Controller/HelloController.php
—
( URL ), — ( html)
app/Controller/HomeController.php app/Controller/HelloController.php ,
app/Provider/WebProvider.php - ( )...
php -S localhost:8080 -t public public/index.php
… http://localhost:8080 , http://localhost:8080/hello/world
world'.
http://localhost:8080/hello/ivan ivan'.
, , http://localhost:8080/helo/world 404 .
4.
route:list
app/Command/RouteListCommand.php ,
app/Provider/CommandProvider.php ...
./bin/console route:list
… :
Routes ====== --------------- --------- ------- ------------------------------------- Route Methods Name Handler --------------- --------- ------- ------------------------------------- / GET index App\Controller\HomeController:index /hello/{name} GET hello App\Controller\HelloController:show --------------- --------- ------- -------------------------------------
, , !
, Slim — routes.php
( ), . — , , .