Особого-легкая платформа PHP. Легко и быстро создавать высокопроизводительные веб -приложения. Встроенная встроенная маршрутизация, база данных, кэширование, обработка ошибок, ведение журнала и планирование заданий. Сосредоточьтесь на создании решений для основного процесса веб -приложений. Держите простые и расширяемые.
| Проект | Описание |
|---|---|
| Засаживаться | Основная структура встроенная маршрутизация, база данных, кэширование и т. Д. |
| Заливая админ | Полное расширение панели администратора на основе зажженного. Не требуется кодирование фронт-элитного. |
| Застенчивый | Шаблон для начинающего, чтобы легко создавать веб-приложения с помощью Alight/Alight-Admin. |
PHP 7,4+
У вас нет композитора? Сначала установите композитор.
$ composer create-project juneszh/alight-project {PROJECT_DIRECTORY}Шаблон проекта содержит общую структуру папок, подходящую для шаблона MVC, см.: Alight-Project.
Это легко настраивать папки путем изменения конфигурации. Но следующие уроки основаны на конфигурации шаблона.
Пример NGINX (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;
}
}Все параметры конфигурации для Framework будут импортированы из файла 'config/app.php', который вам необходимо создать сами. Например:
Файл: 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 ' );См. Config.php для деталей.
Прежде чем изучать правила маршрутизации, сначала необходимо создать файл PHP, который хранит правила маршрутизации. Поскольку кэш маршрутизации обновляется или нет, он основан на времени изменения файла маршрутизации. Например:
Файл: config/route/web.php
Alight Route:: get ( ' / ' , ' Controller::index ' );Файл: config/app.php
<?php
return [
' route ' => ' config/route/web.php '
// Also supports multiple files
// 'route' => ['config/route/web.php', config/route/api.php']
];Кстати, конфигурация маршрута поддерживает импорт указанных файлов для поддоменов :
<?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 обрабатывает все регулярные выражения на пути маршрутизации. Смотрите использование Fastroute для деталей.
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 ' ); Вы можете настроить методы, содержащиеся в AlightRoute::any() .
Alight Route:: setAnyMethods ([ ' GET ' , ' POST ' ]);
Alight Route:: any ( ' only/get/and/post ' , ' handler ' );Если вы хотите запустить какой -то общий код перед обработчиком маршрута.
// For example log every hit request
Alight Route:: beforeHandler ([ svc Request::class, ' log ' ]);
Alight Route:: get ( ' test ' , ' handler ' );
Alight Route:: post ( ' test ' , ' handler ' );Не рекомендуется, но если ваш код требует:
// Effective in the current route file
Alight Route:: disableCache (); Все параметры маршрутизации вступают в силу только в текущем файле и будут автоматическим сбросом по AlightRoute::init() до импорта следующего файла. Например:
Файл: config/admin.php
Alight Route:: group ( ' admin ' );
Alight Route:: setAnyMethods ([ ' GET ' , ' POST ' ]);
// Matches '/admin/login' by methods 'GET', 'POST'
Alight Route:: any ( ' login ' , ' handler ' );Файл: config/web.php
// Matches '/login' by methods 'GET', 'POST', 'PUT', 'DELETE', etc
Alight Route:: any ( ' login ' , ' handler ' );Отправьте заголовок контроля кэша для управления кэшированием в браузерах и общих кешах (CDN), чтобы оптимизировать скорость доступа к немодифицированным данным.
// Cache one day
Alight Route:: get ( ' about/us ' , ' handler ' )-> cache ( 86400 );
// Or force disable cache
Alight Route:: put ( ' user/info ' , ' handler ' )-> cache ( 0 );Мы предоставляем простой обработчик авторизации для управления статусом входа пользователя.
// 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 );Файл: приложение/служба/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 ;
}
}Много раз данные, представленные пользователем, требуют времени для обработки, и мы не хотим получать те же данные до их обработки. Поэтому нам нужно установить время перезарядки запроса. Пользователь получит ошибку 429 при снова запросе в процессе восстановления.
// Cooldown only takes effect when authorized
Alight Route:: put ( ' user/info ' , ' handler ' )-> auth ()-> cd ( 2 );
Alight Route:: post ( ' user/status ' , ' handler ' )-> auth ()-> cd ( 2 );Когда ваш API необходимо использовать для запросов AJAX на стороннем веб-сайте (или в вашем проекте есть несколько доменов), вам необходимо отправить набор заголовков CORS. По конкретным причинам, пожалуйста, обратитесь к: 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 ' );Если ваш сайт использует CDN, пожалуйста, внимательно используйте эту утилиту. Чтобы избежать сбоя запроса после того, как заголовок кэширован CDN.
Особого выпуска передает конфигурацию «базы данных» в Catfan/Medoo напрямую. Для конкретных параметров конфигурации, пожалуйста, обратитесь к Medoo. Начните. Например:
Файл: 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() - это статическая и отдельная реализация new MedooMedoo() , поэтому она наследует все функции Medoo() . Одиночный экземпляр заставляет каждый запрос подключаться к базе данных только один раз и повторно используйте его, эффективно уменьшая количество подключений к базе данных.
// 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 ();Смотрите документацию MEDOO для деталей использования.
Alight поддерживает несколько драйверов кэша и несколько интерфейсов кэша с Symfony/Cache . Параметры конфигурации «DSN» и «Параметры» будут переданы в адаптер кэша, более подробная информация, пожалуйста, обратитесь к доступным адаптерам кеша. Например:
Файл: 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' => [],
// ],
// ]
]; Как и база данных, AlightCache::init() - это статическая и отдельная реализация клиента Cache для повышения производительности параллельных запросов.
// 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 ' );Также поддерживает нативные интерфейсы Memcached или Redis для использования расширенного кэширования:
$ memcached = Alight Cache:: memcached ( ' memcached ' );
$ memcached -> increment ( ' increment ' );
$ redis = Alight Cache:: redis ( ' redis ' );
$ redis -> lPush ( ' list ' , ' first ' );Symfony/Cache поддерживает более 10 адаптеров, но мы имели только встроенные 3, такие как файловая система, Memcached, Redis. Если вам нужно больше адаптеров, вы можете расширить его. Например:
Файл: config/app.php
<?php
return [
' app ' => [
' cacheAdapter ' => [ svc Cache::class, ' adapter ' ],
],
' cache ' => [
// ...
' apcu ' => [
' type ' => ' apcu '
],
' array ' => [
' type ' => ' array ' ,
' defaultLifetime ' => 3600
]
]
];Файл: приложение/служба/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 ;
}
}
}См. Компонент кэша Symfony для получения дополнительной информации.
Alight ловит все ошибки через AlightApp::start() . При включении «отладка» в конфигурации приложения ошибки будут выводиться в Pretty HTML (по FILP/WHOPS ) или JSON.
Файл: config/app.php
<?php
return [
' app ' => [
' debug ' => true ,
]
];При выключении «отладка» в производственной среде Alight просто регистрирует ошибки, чтобы файл и выводит статус HTTP. Вы можете переопределить эти поведения по умолчанию с помощью конфигурации приложения. Например:
Файл: config/app.php
<?php
return [
' app ' => [
' errorHandler ' => [ svc Error::class, ' catch ' ],
' errorPageHandler ' => [ svc Error::class, ' page ' ],
]
];Файл: приложение/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 ;
}
}
}Если вам нужно периодически запускать сценарии PHP на заднем плане.
$ sudo contab -eДобавьте следующее к конечной линии:
* * * * * sudo -u www-data /usr/bin/php /var/www/{PROJECT_DIRECTORY}/app/scheduler.php >> /dev/null 2>&1Файл: 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 ' );Каждый обработчик запускает только один процесс за раз, а максимальное время выполнения процесса по умолчанию составляет 1 час. Если вашему обработчику нужно более длительное время выполнения, используйте Timelimit ().
Alight Job:: call ( ' handler ' )-> hourly ()-> timeLimit ( 7200 ); // 7200 seconds Alight предоставляет AlightApp::root() для стандартизации формата путей файлов в проекте.
// 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 ' ); Путь файла в конфигурации все основаны на AlightApp::root() . Например:
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
]); Alight обеспечивает AlightResponse::api() для стандартизации формата ответа API.
HTTP 200 OK
{
" error " : 0 , // API error code
" message ": " OK ", // API status description
" data": {} // Object data
}Определение статуса:
| Статус HTTP | Ошибка API | Описание |
|---|---|---|
| 200 | 0 | ХОРОШО |
| 200 | 1xxx | Общие бизнес -ошибки, только отображать сообщение пользователю |
| 200 | 2xxx | Специальные бизнес -ошибки, необходимо определить следующее действие для пользователя |
| 4xx | 4xx | Клиентские ошибки |
| 5xx | 5xx | Серверные ошибки |
Например:
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": {}
// } Alight предоставляет AlightResponse::render() для отображения шаблона представления вызовите метод рендеринга с помощью пути файла шаблона и дополнительных данных шаблона:
Файл: App/Controller/pages.php
namespace ctr ;
class Pages
{
public static function index ()
{
Alight Response:: render ( ' hello.php ' , [ ' name ' => ' Ben ' ]);
}
}Файл: app/view/hello.php
<h1>Hello, <?= $ name ?> !</h1>Файл: config/route/web.php
Alight Route:: get ( ' / ' , [ ctr Pages::class, ' index ' ]);Доходная страница проекта будет:
Hello, Ben!Есть также несколько полезных помощников, размещенных в разных пространствах имен. Пожалуйста, нажмите на файл для получения подробной информации:
| Пространство имен | Файл |
|---|---|
| Alight запрос | Request.php |
| Ответ | Response.php |
| СОВЕТ Утилита | Utility.php |