Steigend ist ein leichtes PHP-Framework. Erstellen Sie einfach und schnell hochleistungsreste Webanwendungen. Out-of-the-Box-integrierte Routing-, Datenbank-, Zwischenspeicher-, Fehlerbehandlungsbibliotheken. Konzentrieren Sie sich auf das Erstellen von Lösungen für den Kernprozess von Webanwendungen. Halten Sie einfach und erweiterbar.
| Projekt | Beschreibung |
|---|---|
| Aussteigen | Grundlegende Framework-integrierte Routing, Datenbank, Caching usw. |
| Steigen | Eine vollständige Administrator -Panel -Erweiterung basierend auf der kommenden. Keine Front-End-Codierung erforderlich. |
| Steigen projekt | Eine Vorlage für Anfänger, um einfach Webanwendungen von allight/allight-admin zu erstellen. |
PHP 7.4+
Haben Sie keinen Komponisten? Installieren Sie zuerst den Komponisten.
$ composer create-project juneszh/alight-project {PROJECT_DIRECTORY}Die Projektvorlage enthält eine gemeinsame Ordnerstruktur, die für das MVC-Muster geeignet ist. Siehe: allight-project.
Es ist einfach, Ordner durch Ändern der Konfiguration einfach anzupassen. Die folgenden Tutorials basieren jedoch auf der Vorlagenkonfiguration.
Nginx Beispiel (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;
}
}Alle Konfigurationsoptionen für das allgemeine Framework werden aus der Datei 'config/app.php' importiert, die Sie selbst erstellen müssen. Zum Beispiel:
Datei: 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 ' );Details finden Sie auf config.php.
Vor dem Erlernen von Routing -Regeln müssen Sie zunächst eine PHP -Datei erstellen, die Routing -Regeln speichert. Da der Routing -Cache aktualisiert wird oder nicht, basiert er auf der Änderungszeit der Routing -Datei. Zum Beispiel:
Datei: config/route/web.php
Alight Route:: get ( ' / ' , ' Controller::index ' );Datei: config/app.php
<?php
return [
' route ' => ' config/route/web.php '
// Also supports multiple files
// 'route' => ['config/route/web.php', config/route/api.php']
];Die Routenkonfiguration unterstützt übrigens das Importieren bestimmter Dateien für Subdomains :
<?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/Fast-Route behandelt alle regulären Ausdrücke im Routing-Pfad. Weitere Informationen finden Sie unter Fastroute -Nutzung.
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 ' ); Sie können die Methoden, die in AlightRoute::any() anpassen können.
Alight Route:: setAnyMethods ([ ' GET ' , ' POST ' ]);
Alight Route:: any ( ' only/get/and/post ' , ' handler ' );Wenn Sie vor dem Handler der Route einen gemeinsamen Code ausführen möchten.
// For example log every hit request
Alight Route:: beforeHandler ([ svc Request::class, ' log ' ]);
Alight Route:: get ( ' test ' , ' handler ' );
Alight Route:: post ( ' test ' , ' handler ' );Nicht empfohlen, aber wenn Ihr Code erforderlich ist:
// Effective in the current route file
Alight Route:: disableCache (); Alle Routing -Optionen werden nur in der aktuellen Datei wirksam und werden vor AlightRoute::init() Importieren der nächsten Datei automatisch zurückgesetzt. Zum Beispiel:
Datei: config/admin.php
Alight Route:: group ( ' admin ' );
Alight Route:: setAnyMethods ([ ' GET ' , ' POST ' ]);
// Matches '/admin/login' by methods 'GET', 'POST'
Alight Route:: any ( ' login ' , ' handler ' );Datei: config/web.php
// Matches '/login' by methods 'GET', 'POST', 'PUT', 'DELETE', etc
Alight Route:: any ( ' login ' , ' handler ' );Senden Sie einen Cache-Kontroll-Header, um das Caching in Browsern und gemeinsam genutzten Caches (CDNs) zu steuern, um die Geschwindigkeit des Zugriffs auf nicht modifizierte Daten zu optimieren.
// Cache one day
Alight Route:: get ( ' about/us ' , ' handler ' )-> cache ( 86400 );
// Or force disable cache
Alight Route:: put ( ' user/info ' , ' handler ' )-> cache ( 0 );Wir bieten einen einfachen Autorisierungshandler für die Verwaltung des Benutzeranmeldemittels.
// 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 );Datei: 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 ;
}
}Oft brauchen die vom Benutzer eingereichten Daten Zeit, um zu verarbeiten, und wir möchten nicht die gleichen Daten erhalten, bevor er verarbeitet wird. Daher müssen wir die Anfrage abklingen lassen. Der Benutzer erhält einen 429 -Fehler, wenn er erneut innerhalb der Abklingzeit anfordert.
// Cooldown only takes effect when authorized
Alight Route:: put ( ' user/info ' , ' handler ' )-> auth ()-> cd ( 2 );
Alight Route:: post ( ' user/status ' , ' handler ' )-> auth ()-> cd ( 2 );Wenn Ihre API für AJAX-Anfragen von einer Website von Drittanbietern verwendet werden muss (oder in Ihrem Projekt mehrere Domänen), müssen Sie eine Reihe von CORS-Headern senden. Aus bestimmten Gründen finden Sie unter: Mozilla -Dokumente.
// 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 ' );Wenn Ihre Website CDN verwendet, verwenden Sie dieses Dienstprogramm sorgfältig. Um einen Antragsfehler zu vermeiden, nachdem der Header von CDN zwischengespeichert wurde.
Ständig übergibt die Konfiguration der "Datenbank" direkt an das Catfan/Medoo . Für bestimmte Konfigurationsoptionen finden Sie in Medoo Erste Schritte. Zum Beispiel:
Datei: 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() ist eine statische und einzelne Instanzimplementierung von new MedooMedoo() , daher erbt es alle Funktionen von Medoo() . Eine einzelne Instanz stellt jede Anforderung nur einmal eine Verbindung zur Datenbank her und erneuert sie wieder, sodass die Anzahl der Datenbankverbindungen effektiv reduziert wird.
// 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 ();In Medoo -Dokumentation finden Sie Nutzungsdetails.
Allight unterstützt mehrere Cache -Treiber und mehrere Cache -Schnittstellen mit Symfony/Cache . Die Konfigurationsoptionen "DSN" und "Optionen" werden an den Cache -Adapter weitergegeben. Weitere Details finden Sie in verfügbaren Cache -Adaptern. Zum Beispiel:
Datei: 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' => [],
// ],
// ]
]; Wie bei der Datenbank ist AlightCache::init() eine statische und einzelne Instanzimplementierung des Cache -Clients, um die gleichzeitige Anfrage zu verbessern.
// 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 ' );Unterstützt auch memcachierte oder redis native Schnittstellen für die Verwendung erweiterter Caching:
$ memcached = Alight Cache:: memcached ( ' memcached ' );
$ memcached -> increment ( ' increment ' );
$ redis = Alight Cache:: redis ( ' redis ' );
$ redis -> lPush ( ' list ' , ' first ' );Symfony/Cache unterstützt mehr als 10 Adapter, aber wir haben nur integrierte 3 häufig verwendet, wie z. B. Dateisystem, Memcached, Redis. Wenn Sie mehr Adapter benötigen, können Sie es erweitern. Zum Beispiel:
Datei: config/app.php
<?php
return [
' app ' => [
' cacheAdapter ' => [ svc Cache::class, ' adapter ' ],
],
' cache ' => [
// ...
' apcu ' => [
' type ' => ' apcu '
],
' array ' => [
' type ' => ' array ' ,
' defaultLifetime ' => 3600
]
]
];Datei: 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 ;
}
}
}Weitere Informationen finden Sie unter Symfony Cache -Komponente.
Alle Fehler erfassen alle Fehler über AlightApp::start() . Wenn Sie "Debugg" in der App -Konfiguration einschalten, werden Fehler in hübschem HTML (nach Filp/Whoops ) oder JSON ausgegeben.
Datei: config/app.php
<?php
return [
' app ' => [
' debug ' => true ,
]
];Wenn Sie 'Debug' in der Produktionsumgebung ausgeschaltet werden, protokolliert es nur Fehler bei der Datei und gibt den HTTP -Status aus. Sie können diese Standardverhalten durch App -Konfiguration überschreiben. Zum Beispiel:
Datei: config/app.php
<?php
return [
' app ' => [
' errorHandler ' => [ svc Error::class, ' catch ' ],
' errorPageHandler ' => [ svc Error::class, ' page ' ],
]
];Datei: 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 ;
}
}
}Wenn Sie PHP -Skripte regelmäßig im Hintergrund ausführen müssen.
$ sudo contab -eFügen Sie Folgendes zur Endzeile hinzu:
* * * * * sudo -u www-data /usr/bin/php /var/www/{PROJECT_DIRECTORY}/app/scheduler.php >> /dev/null 2>&1Datei: 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 ' );Jeder Handler führt jeweils nur einen Vorgang aus, und die Standard -maximale Laufzeit eines Prozesses beträgt 1 Stunde. Wenn Ihr Handler eine längere Laufzeit benötigt, verwenden Sie Timelimit ().
Alight Job:: call ( ' handler ' )-> hourly ()-> timeLimit ( 7200 ); // 7200 seconds Ständig bietet AlightApp::root() um das Format der Dateipfade im Projekt zu standardisieren.
// 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 ' ); Die Dateipfade in der Konfiguration basieren alle auf der AlightApp::root() . Zum Beispiel:
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
]); Ständig bietet AlightResponse::api() um das Format der API -Antwort zu standardisieren.
HTTP 200 OK
{
" error " : 0 , // API error code
" message ": " OK ", // API status description
" data": {} // Object data
}Statusdefinition:
| HTTP -Status | API -Fehler | Beschreibung |
|---|---|---|
| 200 | 0 | OK |
| 200 | 1xxx | Allgemeine Geschäftsfehler zeigen nur eine Nachricht an den Benutzer an |
| 200 | 2xxx | Spezielle Geschäftsfehler müssen die nächste Aktion für den Benutzer definieren |
| 4xx | 4xx | Clientfehler |
| 5xx | 5xx | Serverfehler |
Zum Beispiel:
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": {}
// } Ständig bietet AlightResponse::render() um eine Ansichtsvorlagenansicht anzuzeigen, die Render -Methode mit dem Pfad der Vorlagendatei und der optionalen Vorlagendaten aufrufen:
Datei: App/Controller/Pages.php
namespace ctr ;
class Pages
{
public static function index ()
{
Alight Response:: render ( ' hello.php ' , [ ' name ' => ' Ben ' ]);
}
}Datei: App/Ansicht/Hallo.php
<h1>Hello, <?= $ name ?> !</h1>Datei: config/route/web.php
Alight Route:: get ( ' / ' , [ ctr Pages::class, ' index ' ]);Die Homepage -Ausgabe des Projekts wäre:
Hello, Ben!Es gibt auch einige nützliche Helfer, die in verschiedenen Namespaces platziert sind. Bitte klicken Sie auf die Datei für Details:
| Namespace | Datei |
|---|---|
| Involviert Anfrage | Request.php |
| Involviert Antwort | Response.php |
| Involviert Utility | Utility.php |