Menurunkan kerangka PHP ringan. Bangun aplikasi web REST berkinerja tinggi dengan mudah dan cepat. Routing bawaan, basis data, caching, penanganan kesalahan, penanganan, dan perpustakaan penjadwalan pekerjaan. Fokus pada menciptakan solusi untuk proses inti aplikasi web. Tetap sederhana dan dapat diperluas.
| Proyek | Keterangan |
|---|---|
| Turun | Kerangka dasar routing bawaan, basis data, caching, dll. |
| Awali-Lengket | Ekstensi Panel Admin Penuh Berdasarkan Awal. Tidak diperlukan pengkodean front-end. |
| Project turun | Template untuk pemula untuk dengan mudah membuat aplikasi web dengan ALIGHT/ALIGHT-ADMIN. |
PHP 7.4+
Tidak punya komposer? Instal komposer terlebih dahulu.
$ composer create-project juneszh/alight-project {PROJECT_DIRECTORY}Template proyek berisi struktur folder umum, cocok untuk pola MVC, silakan merujuk ke: Project Alight.
Mudah untuk menyesuaikan folder dengan memodifikasi konfigurasi. Tetapi tutorial berikut didasarkan pada konfigurasi template.
Nginx Contoh (Nginx 1.17.10, PHP 7.4.3, Ubuntu 20.04.3):
server {
listen 80 ;
listen [::]:80;
root /var/www/{PROJECT_DIRECTORY}/public;
index index.php;
server_name {YOUR_DOMAIN};
location / {
try_files $uri $uri / /index.php? $query_string ;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}Semua opsi konfigurasi untuk kerangka kerja Ainight akan diimpor dari file 'config/app.php', yang perlu Anda buat sendiri. Misalnya:
File: config/app.php
<?php
return [
' app ' => [
' debug ' => false ,
' timezone ' => ' Europe/Kiev ' ,
' storagePath ' => ' storage ' ,
' domainLevel ' => 2 ,
' corsDomain ' => null ,
' corsHeaders ' => null ,
' corsMethods ' => null ,
' cacheAdapter ' => null ,
' errorHandler ' => null ,
' errorPageHandler ' => null ,
],
' route ' => ' config/route/web.php ' ,
' database ' => [
' type ' => ' mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' database ' => ' alight ' ,
' username ' => ' root ' ,
' password ' => '' ,
],
' cache ' => [
' type ' => ' file ' ,
],
' job ' => ' config/job.php ' ,
]; <?php
Alight Config:: get ( ' app ' );
Alight Config:: get ( ' app ' , ' storagePath ' );Lihat config.php untuk detailnya.
Sebelum belajar aturan perutean, Anda perlu membuat file PHP terlebih dahulu yang menyimpan aturan perutean. Karena cache perutean diperbarui atau tidak, didasarkan pada waktu modifikasi file perutean. Misalnya:
File: config/route/web.php
Alight Route:: get ( ' / ' , ' Controller::index ' );File: config/app.php
<?php
return [
' route ' => ' config/route/web.php '
// Also supports multiple files
// 'route' => ['config/route/web.php', config/route/api.php']
];Ngomong -ngomong, konfigurasi rute mendukung mengimpor file yang ditentukan untuk subdomain :
<?php
return [
' route ' => [
//Import on any request
' * ' => ' config/route/web.php ' ,
//Import when requesting admin.yourdomain.com
' admin ' => ' config/route/admin.php ' ,
//Import multiple files when requesting api.yourdomain.com
' api ' => [ ' config/route/api.php ' , ' config/route/api_mobile.php ' ],
]
]; Alight Route:: get ( $ pattern , $ handler );
// Example
Alight Route:: get ( ' / ' , ' Controller::index ' );
Alight Route:: get ( ' / ' , [ ' Controller ' , ' index ' ]);
// Or try this to easy trigger hints from IDE
Alight Route:: get ( ' / ' , [Controller::class, ' index ' ]);
// With default args
Alight Route:: get ( ' post/list[/{page}] ' , [Controller::class, ' list ' ], [ ' page ' => 1 ]);
// Common HTTP request methods
Alight Route:: options ( ' / ' , ' handler ' );
Alight Route:: head ( ' / ' , ' handler ' );
Alight Route:: post ( ' / ' , ' handler ' );
Alight Route:: delete ( ' / ' , ' handler ' );
Alight Route:: put ( ' / ' , ' handler ' );
Alight Route:: patch ( ' / ' , ' handler ' );
// Map for Custom methods
Alight Route:: map ([ ' GET ' , ' POST ' ], ' test ' , ' handler ' );
// Any for all common methods
Alight Route:: any ( ' test ' , ' handler ' ); // Matches /user/42, but not /user/xyz
Alight Route:: get ( ' user/{id:d+} ' , ' handler ' );
// Matches /user/foobar, but not /user/foo/bar
Alight Route:: get ( ' user/{name} ' , ' handler ' );
// Matches /user/foo/bar as well, using wildcards
Alight Route:: get ( ' user/{name:.+} ' , ' handler ' );
// The /{name} suffix is optional
Alight Route:: get ( ' user[/{name}] ' , ' handler ' );
// Root wildcards for single page app
Alight Route:: get ( ' /{path:.*} ' , ' handler ' );Nikic/rute cepat menangani semua ekspresi reguler di jalur perutean. Lihat Penggunaan Fastroute untuk detailnya.
Alight Route:: group ( ' admin ' );
// Matches /admin/role/list
Alight Route:: get ( ' role/list ' , ' handler ' );
// Matches /admin/role/info
Alight Route:: get ( ' role/info ' , ' handler ' );
// Override the group
Alight Route:: group ( ' api ' );
// Matches /api/news/list
Alight Route:: get ( ' news/list ' , ' handler ' ); Anda dapat menyesuaikan metode yang terkandung di AlightRoute::any() .
Alight Route:: setAnyMethods ([ ' GET ' , ' POST ' ]);
Alight Route:: any ( ' only/get/and/post ' , ' handler ' );Jika Anda ingin menjalankan beberapa kode umum sebelum route's handler.
// For example log every hit request
Alight Route:: beforeHandler ([ svc Request::class, ' log ' ]);
Alight Route:: get ( ' test ' , ' handler ' );
Alight Route:: post ( ' test ' , ' handler ' );Tidak disarankan, tetapi jika kode Anda membutuhkan:
// Effective in the current route file
Alight Route:: disableCache (); Semua opsi perutean hanya berlaku di file saat ini dan akan diatur ulang secara otomatis oleh AlightRoute::init() sebelum file berikutnya diimpor. Misalnya:
File: config/admin.php
Alight Route:: group ( ' admin ' );
Alight Route:: setAnyMethods ([ ' GET ' , ' POST ' ]);
// Matches '/admin/login' by methods 'GET', 'POST'
Alight Route:: any ( ' login ' , ' handler ' );File: config/web.php
// Matches '/login' by methods 'GET', 'POST', 'PUT', 'DELETE', etc
Alight Route:: any ( ' login ' , ' handler ' );Kirim header kontrol cache untuk mengontrol caching di browser dan cache bersama (CDN) untuk mengoptimalkan kecepatan akses ke data yang tidak dimodifikasi.
// Cache one day
Alight Route:: get ( ' about/us ' , ' handler ' )-> cache ( 86400 );
// Or force disable cache
Alight Route:: put ( ' user/info ' , ' handler ' )-> cache ( 0 );Kami menyediakan penangan otorisasi sederhana untuk mengelola status login pengguna.
// Define a global authorization verification handler
Alight Route:: authHandler ([ svc Auth::class, ' verify ' ]);
// Enable verification in routes
Alight Route:: get ( ' user/info ' , ' handler ' )-> auth ();
Alight Route:: get ( ' user/password ' , ' handler ' )-> auth ();
// No verification by default
Alight Route:: get ( ' about/us ' , ' handler ' );
// In general, routing with authorization will not use browser cache
// So auth() has built-in cache(0) to force disable cache
// Please add cache(n) after auth() to override the configuration if you need
Alight Route:: get ( ' user/rank/list ' , ' handler ' )-> auth ()-> cache ( 3600 );File: App/Service/auth.php
namespace svc ;
class Auth
{
public static function verify ()
{
// Some codes about get user session from cookie or anywhere
// Returns the user id if authorization is valid
// Otherwise returns 0 or something else for failure
// Then use Router::getAuthId() in the route handler to get this id again
return $ userId ;
}
}Berkali -kali data yang dikirimkan oleh pengguna membutuhkan waktu untuk diproses, dan kami tidak ingin menerima data yang sama sebelum diproses. Jadi kita perlu mengatur waktu cooldown permintaan. Pengguna akan menerima kesalahan 429 saat meminta lagi di dalam cooldown.
// Cooldown only takes effect when authorized
Alight Route:: put ( ' user/info ' , ' handler ' )-> auth ()-> cd ( 2 );
Alight Route:: post ( ' user/status ' , ' handler ' )-> auth ()-> cd ( 2 );Ketika API Anda perlu digunakan untuk permintaan AJAX oleh situs web pihak ketiga (atau proyek Anda memiliki banyak domain), Anda perlu mengirim satu set header CORS. Untuk alasan khusus, silakan merujuk ke: Mozilla Docs.
// Domains in config will receive the common cors header
Alight Route:: put ( ' share/config ' , ' handler ' )-> cors ();
// The specified domain will receive the common cors header
Alight Route:: put ( ' share/specified ' , ' handler ' )-> cors ( ' abc.com ' );
// The specified domain will receive the specified cors header
Alight Route:: put ( ' share/specified2 ' , ' handler ' )-> cors ( ' abc.com ' , ' Authorization ' , [ ' GET ' , ' POST ' ]);
// All domains will receive a 'Access-Control-Allow-Origin: *' header
Alight Route:: put ( ' share/all/http ' , ' handler ' )-> cors ( ' * ' );
// All domains will receive a 'Access-Control-Allow-Origin: [From Origin]' header
Alight Route:: put ( ' share/all/https ' , ' handler ' )-> cors ( ' origin ' );Jika situs web Anda menggunakan CDN, silakan gunakan utilitas ini dengan hati -hati. Untuk menghindari kegagalan permintaan setelah header di -cache oleh CDN.
Menyalakan konfigurasi 'basis data' ke catfan/medoo secara langsung. Untuk opsi konfigurasi tertentu, silakan merujuk ke Medoo memulai. Misalnya:
File: config/app.php
<?php
return [
' database ' => [
' type ' => ' mysql ' ,
' host ' => ' 127.0.0.1 ' ,
' database ' => ' alight ' ,
' username ' => ' root ' ,
' password ' => '' ,
],
// Multiple databases (The first database is default)
// 'database' => [
// 'main' => [
// 'type' => 'mysql',
// 'host' => '127.0.0.1',
// 'database' => 'alight',
// 'username' => 'root',
// 'password' => '',
// ],
// 'remote' => [
// 'type' => 'mysql',
// 'host' => '1.1.1.1',
// 'database' => 'alight',
// 'username' => 'root',
// 'password' => '',
// ],
// ]
]; AlightDatabase::init() adalah implementasi statis dan tunggal dari new MedooMedoo() , sehingga mewarisi semua fungsi Medoo() . Single Instance membuat setiap permintaan terhubung ke database hanya sekali dan menggunakannya kembali, secara efektif mengurangi jumlah koneksi basis data.
// Initializes the default database
$ db = Alight Database:: init ();
// Initializes others database with key
$ db2 = Alight Database:: init ( ' remote ' );
$ userList = $ db -> select ( ' user ' , ' * ' , [ ' role ' => 1 ]);
$ userInfo = $ db -> get ( ' user ' , ' * ' , [ ' id ' => 1 ]);
$ db -> insert ( ' user ' , [ ' name ' => ' anonymous ' , ' role ' => 2 ]);
$ id = $ db -> id ();
$ result = $ db -> update ( ' user ' , [ ' name ' => ' alight ' ], [ ' id ' => $ id ]);
$ result -> rowCount ();Lihat Dokumentasi Medoo untuk detail penggunaan.
Menurunkan beberapa driver cache dan beberapa antarmuka cache dengan Symfony/Cache . Opsi konfigurasi 'DSN' dan 'Opsi' akan diteruskan ke adaptor cache, lebih detail silakan merujuk ke adaptor cache yang tersedia. Misalnya:
File: config/app.php
<?php
return [
' cache ' => [
' type ' => ' file ' ,
],
// Multiple cache (The first cache is the default)
// 'cache' => [
// 'file' => [
// 'type' => 'file',
// ],
// 'memcached' => [
// 'type' => 'memcached',
// 'dsn' => 'memcached://localhost',
// 'options' => [],
// ],
// 'redis' => [
// 'type' => 'redis',
// 'dsn' => 'redis://localhost',
// 'options' => [],
// ],
// ]
]; Seperti database, AlightCache::init() adalah implementasi instance statis dan tunggal dari klien cache untuk meningkatkan kinerja permintaan bersamaan.
// Initializes the default cache
$ cache = Alight Cache:: init ();
// Initializes others cache with key
$ cache2 = Alight Cache:: init ( ' redis ' );
// Use SimpleCache(PSR-16) interface
if (! $ cache -> has ( ' test ' )){
$ cache -> set ( ' test ' , ' hello world! ' , 3600 );
}
$ cacheData = $ cache -> get ( ' test ' );
$ cache -> delete ( ' test ' ); $ cache6 = Alight Cache:: psr6 ( ' memcached ' );
$ cacheItem = $ cache6 -> getItem ( ' test ' );
if (! $ cacheItem -> isHit ()){
$ cacheItem -> expiresAfter ( 3600 );
$ cacheItem -> set ( ' hello world! ' );
// Bind to a tag
$ cacheItem -> tag ( ' alight ' );
}
$ cacheData = $ cacheItem -> get ();
$ cache6 -> deleteItem ( ' test ' );
// Delete all cached items in the same tag
$ cache6 -> invalidateTags ( ' alight ' )
// Or symfony/cache adapter style
$ cacheData = $ cache6 -> get ( ' test ' , function ( $ item ){
$ item -> expiresAfter ( 3600 );
return ' hello world! ' ;
});
$ cache6 -> delete ( ' test ' );Juga mendukung antarmuka asli memcached atau redis untuk menggunakan caching canggih:
$ memcached = Alight Cache:: memcached ( ' memcached ' );
$ memcached -> increment ( ' increment ' );
$ redis = Alight Cache:: redis ( ' redis ' );
$ redis -> lPush ( ' list ' , ' first ' );Symfony/Cache mendukung lebih dari 10 adaptor, tetapi kami hanya memiliki built-in 3 yang biasa digunakan, seperti sistem file, memcached, redis. Jika Anda membutuhkan lebih banyak adaptor, Anda dapat memperluasnya. Misalnya:
File: config/app.php
<?php
return [
' app ' => [
' cacheAdapter ' => [ svc Cache::class, ' adapter ' ],
],
' cache ' => [
// ...
' apcu ' => [
' type ' => ' apcu '
],
' array ' => [
' type ' => ' array ' ,
' defaultLifetime ' => 3600
]
]
];File: App/Service/Cache.php
namespace svc ;
use Symfony Component Cache Adapter ApcuAdapter ;
use Symfony Component Cache Adapter ArrayAdapter ;
use Symfony Component Cache Adapter NullAdapter ;
class Cache
{
public static function adapter ( array $ config )
{
switch ( $ config [ ' type ' ]) {
case ' apcu ' :
return new ApcuAdapter ();
break ;
case ' array ' :
return new ArrayAdapter ( $ config [ ' defaultLifetime ' ]);
default :
return new NullAdapter ();
break ;
}
}
}Lihat Komponen Symfony Cache untuk informasi lebih lanjut.
Menyalakan semua kesalahan melalui AlightApp::start() . Saat menyalakan 'debug' dalam konfigurasi aplikasi, kesalahan akan output dalam HTML yang cantik (oleh Filp/whoops ) atau JSON.
File: config/app.php
<?php
return [
' app ' => [
' debug ' => true ,
]
];Saat mematikan 'debug' di lingkungan produksi, turun hanya mencatat kesalahan untuk mengajukan dan mengeluarkan status HTTP. Anda dapat mengganti perilaku default ini dengan konfigurasi aplikasi. Misalnya:
File: config/app.php
<?php
return [
' app ' => [
' errorHandler ' => [ svc Error::class, ' catch ' ],
' errorPageHandler ' => [ svc Error::class, ' page ' ],
]
];File: App/service/error.php
namespace svc ;
class Error
{
public static function catch ( Throwable $ exception )
{
// Some code like sending an email or using Sentry or something
}
public static function page ( int $ status )
{
switch ( $ status ) {
case 400 :
// Page code...
break ;
case 401 :
// Page code...
break ;
case 403 :
// Page code...
break ;
case 404 :
// Page code...
break ;
case 500 :
// Page code...
break ;
default :
// Page code...
break ;
}
}
}Jika Anda perlu menjalankan skrip PHP di latar belakang secara berkala.
$ sudo contab -eTambahkan yang berikut ke baris akhir:
* * * * * sudo -u www-data /usr/bin/php /var/www/{PROJECT_DIRECTORY}/app/scheduler.php >> /dev/null 2>&1File: config/job.php
Alight Job:: call ( ' handler ' )-> minutely ();
Alight Job:: call ( ' handler ' )-> hourly ();
Alight Job:: call ( ' handler ' )-> daily ();
Alight Job:: call ( ' handler ' )-> weekly ();
Alight Job:: call ( ' handler ' )-> monthly ();
Alight Job:: call ( ' handler ' )-> yearly ();
Alight Job:: call ( ' handler ' )-> everyMinutes ( 5 );
Alight Job:: call ( ' handler ' )-> everyHours ( 2 );
Alight Job:: call ( ' handler ' )-> date ( ' 2022-08-02 22:00 ' );Setiap penangan hanya menjalankan satu proses pada satu waktu, dan runtime maks default dari suatu proses adalah 1 jam. Jika pawang Anda membutuhkan runtime yang lebih lama, gunakan TimeLimit ().
Alight Job:: call ( ' handler ' )-> hourly ()-> timeLimit ( 7200 ); // 7200 seconds Menyediakan AlightApp::root() untuk menstandarkan format jalur file dalam proyek.
// Suppose the absolute path of the project is /var/www/my_project/
Alight App:: root ( ' public/favicon.ico ' ); // /var/www/my_project/public/favicon.ico
// Of course, you can also use absolute path files with the first character '/'
Alight App:: root ( ' /var/data/config/web.php ' ); Jalur file dalam konfigurasi semuanya didasarkan pada AlightApp::root() . Misalnya:
Alight App:: start ([
' route ' => ' config/route/web.php ' , // /var/www/my_project/config/route/web.php
' job ' => ' config/job.php ' // /var/www/my_project/config/job.php
]); Menyediakan AlightResponse::api() untuk membakukan format respons API.
HTTP 200 OK
{
" error " : 0 , // API error code
" message ": " OK ", // API status description
" data": {} // Object data
}Definisi Status:
| Status HTTP | Kesalahan API | Keterangan |
|---|---|---|
| 200 | 0 | OKE |
| 200 | 1xxx | Kesalahan bisnis umum, hanya menampilkan pesan kepada pengguna |
| 200 | 2xxx | Kesalahan bisnis khusus, perlu mendefinisikan tindakan berikutnya untuk pengguna |
| 4xx | 4xx | Kesalahan klien |
| 5xx | 5xx | Kesalahan server |
Misalnya:
Alight Response:: api ( 0 , null , [ ' name ' => ' alight ' ]);
// Response:
// HTTP 200 OK
//
// {
// "error": 0,
// "message": "OK",
// "data": {
// "name": "alight"
// }
// }
Alight Response:: api ( 1001 , ' Invalid request parameter. ' );
// Response:
// HTTP 200 OK
//
// {
// "error": 1001,
// "message": "Invalid request parameter.",
// "data": {}
// }
Alight Response:: api ( 500 , ' Unable to connect database. ' );
// Response:
// HTTP 500 Internal Server Error
//
// {
// "error": 500,
// "message": "Unable to connect database.",
// "data": {}
// } Menyediakan AlightResponse::render() untuk menampilkan Tampilan Template Panggilan metode render dengan jalur file templat dan data template opsional:
File: App/controller/halaman.php
namespace ctr ;
class Pages
{
public static function index ()
{
Alight Response:: render ( ' hello.php ' , [ ' name ' => ' Ben ' ]);
}
}File: App/View/Hello.php
<h1>Hello, <?= $ name ?> !</h1>File: config/route/web.php
Alight Route:: get ( ' / ' , [ ctr Pages::class, ' index ' ]);Output beranda proyek adalah:
Hello, Ben!Ada juga beberapa pembantu berguna yang ditempatkan di berbagai nama. Silakan klik file untuk detailnya:
| Namespace | Mengajukan |
|---|---|
| Turun permintaan | Request.php |
| Tanggapan | Response.php |
| UTIGHT Utility | Utility.php |