1. Go to this page and download the library: Download sidalex/swoole-app library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
sidalex / swoole-app example snippets
declare(strict_types=1);
t_contents('./config.json'));
$app = new \Sidalex\SwooleApp\Application($config);
$server = $app->createServer();
$server->start();
use Sidalex\SwooleApp\Classes\Validators\ConfigValidatorInterface;
class DatabaseConfigValidator implements ConfigValidatorInterface
{
public function validate(\stdClass $config): void
{
if (!isset($config->DB->HOST)) {
throw new \RuntimeException("Database host
if (!$builder->validate([DatabaseConfigValidator::class])) {
$errors = $builder->getErrors();
// Handle errors
}
Swoole\Server->task(Sidalex\SwooleApp\Classes\Tasks\Data\TaskDataInterface $data, int $dstWorkerId = -1, callable $finishCallback = null);
class MyCyclicJob implements CyclicJobsInterface
{
private $application;
private $server;
public function __construct(Application $application, Server $server)
{
$this->application = $application;
$this->server = $server;
}
public function getTimeSleepSecond(): float
{
// Returns the sleep time in seconds
return 5.0;
}
public function runJob(): void
{
$arr = [1,2,3,4,5,6,7,8,9];
foreach ($arr as $value){
if($value % 3 == 0)
{
echo "example";
}
}
}
}
$config = new \stdClass();
$config->globalMiddlewares = [
// Simple string - middleware class
'App\Middleware\AuthMiddleware',
// Or array with class and options
[
'class' => 'App\Middleware\CorsMiddleware',
'options' => ['origins' => ['https://example.com']]
]
];
use Sidalex\SwooleApp\Classes\Controllers\Route;
use Sidalex\SwooleApp\Classes\Middleware\Middleware;
#[Route(uri: '/api/protected', method: 'GET')]
#[Middleware(middlewareClass: 'App\Middleware\AuthMiddleware')]
#[Middleware(middlewareClass: 'App\Middleware\LogMiddleware', options: ['level' => 'info'])]
class ProtectedController extends AbstractController
{
public function execute(): \Swoole\Http\Response
{
// Controller logic
}
}
use Sidalex\SwooleApp\Classes\Middleware\MiddlewareInterface;
use Sidalex\SwooleApp\Application;
class AuthMiddleware implements MiddlewareInterface
{
public function process(
\Swoole\Http\Request $request,
\Swoole\Http\Response $response,
Application $application,
callable $next
): \Swoole\Http\Response {
// Authentication check
if (!$this->isAuthenticated($request)) {
$response->setStatusCode(401);
$response->end('Unauthorized');
return $response;
}
// Continue middleware chain
return $next($request, $response);
}
}
use Sidalex\SwooleApp\Classes\Middleware\ConfigurableMiddlewareInterface;
class CorsMiddleware implements ConfigurableMiddlewareInterface
{
private array $options;
public function __construct(array $options = [])
{
$this->options = $options;
}
public function process(/* ... */): \Swoole\Http\Response
{
// Use configuration options
$allowedOrigins = $this->options['origins'] ?? ['*'];
// ...
}
}
use Sidalex\SwooleApp\Classes\Validators\MiddlewareConfigValidator;
$validators = [MiddlewareConfigValidator::class];
$app = new Application($config, $validators);
#[\Sidalex\SwooleApp\Classes\Controllers\Route(uri: '/api/{v1}/get_resume',method:"POST")]
class TestController extends AbstractController
{
use Sidalex\SwooleApp\Classes\Controllers\Route;
#[Route(uri: '/api/{v1}/get_resume',method:"POST")]
class TestController extends AbstractController
{
$this->response->setHeader('Content-Type', 'application/json');
$this->response->end(
json_encode(
[
'status' => 'error',
'message' => 'collection '.$this->uri_params['collection_name'] . 'not found in collectionList',
]
)
);
class NotFoundController implements ControllerInterface
{
private \Swoole\Http\Request $request;
private \Swoole\Http\Response $responce;
/**
* @var array|string[]
*/
private array $uri_params;
public function __construct(\Swoole\Http\Request $request, \Swoole\Http\Response $response, array $uri_params=[])
{
$this->request = $request;
$this->responce = $response;
$this->uri_params = $uri_params;
}
public function execute(): \Swoole\Http\Response
{
$this->responce->setStatusCode(404);
$this->responce->setHeader('Content-Type', 'application/json');
$this->responce->end(json_encode(
[
'codeStatus' => '404',
'text' => 'Page not found'
]
));
return $this->responce;
}
public function setApplication(Application $application, Server $server)
{
}
}
namespace YourApp\StateContainers;
use Sidalex\SwooleApp\Classes\Initiation\AbstractContainerInitiator;
use Sidalex\SwooleApp\Application;
class DatabaseConnectionContainer extends AbstractContainerInitiator
{
protected string $key = 'database';
public function init(Application $app): void
{
// Initialize your database connection here
$config = $app->getConfig()->getContainer('database_config');
$this->result = new \PDO(
$config['dsn'],
$config['username'],
$config['password']
);
}
}
// In a controller:
$db = $this->application->getStateContainer()->getContainer('database');
// In a task executor:
$db = $this->app->getStateContainer()->getContainer('database');
// In a cyclic job:
$db = $this->application->getStateContainer()->getContainer('database');
$app = new \Sidalex\SwooleApp\Application($config);
$server = $app->createServer(); // Использует настроенные host/port/mode
$server->start();
use Sidalex\SwooleApp\Classes\Validators\ConfigValidatorInterface;
class DatabaseConfigValidator implements ConfigValidatorInterface
{
public function validate(\stdClass $config): void
{
if (!isset($config->DB->HOST)) {
throw new \RuntimeException("Требуется хост базы данных");
}
}
}
if (!$builder->validate([DatabaseConfigValidator::class])) {
$errors = $builder->getErrors();
// Обработка ошибок
}
Swoole\Server->task(Sidalex\SwooleApp\Classes\Tasks\Data\TaskDataInterface $data, int $dstWorkerId = -1, callable $finishCallback = null)
class MyCyclicJob implements CyclicJobsInterface
{
private $application;
private $server;
public function __construct(Application $application, Server $server)
{
$this->application = $application;
$this->server = $server;
}
public function getTimeSleepSecond(): float
{
// Возвращает время задержки в секундах
return 5.0;
}
public function runJob(): void
{
$arr = [1,2,3,4,5,6,7,8,9];
foreach ($arr as $value){
if($value % 3 == 0)
{
echo "example";
}
}
}
}
$config = new \stdClass();
$config->globalMiddlewares = [
// Простая строка - класс Middleware
'App\Middleware\AuthMiddleware',
// Или массив с классом и опциями
[
'class' => 'App\Middleware\CorsMiddleware',
'options' => ['origins' => ['https://example.com']]
]
];
use Sidalex\SwooleApp\Classes\Controllers\Route;
use Sidalex\SwooleApp\Classes\Middleware\Middleware;
#[Route(uri: '/api/protected', method: 'GET')]
#[Middleware(middlewareClass: 'App\Middleware\AuthMiddleware')]
#[Middleware(middlewareClass: 'App\Middleware\LogMiddleware', options: ['level' => 'info'])]
class ProtectedController extends AbstractController
{
public function execute(): \Swoole\Http\Response
{
// Логика контроллера
}
}
use Sidalex\SwooleApp\Classes\Middleware\MiddlewareInterface;
use Sidalex\SwooleApp\Application;
class AuthMiddleware implements MiddlewareInterface
{
public function process(
\Swoole\Http\Request $request,
\Swoole\Http\Response $response,
Application $application,
callable $next
): \Swoole\Http\Response {
// Проверка аутентификации
if (!$this->isAuthenticated($request)) {
$response->setStatusCode(401);
$response->end('Unauthorized');
return $response;
}
// Продолжение цепочки Middleware
return $next($request, $response);
}
}
use Sidalex\SwooleApp\Classes\Middleware\ConfigurableMiddlewareInterface;
class CorsMiddleware implements ConfigurableMiddlewareInterface
{
private array $options;
public function __construct(array $options = [])
{
$this->options = $options;
}
public function process(/* ... */): \Swoole\Http\Response
{
// Использование опций конфигурации
$allowedOrigins = $this->options['origins'] ?? ['*'];
// ...
}
}
use Sidalex\SwooleApp\Classes\Validators\MiddlewareConfigValidator;
$validators = [MiddlewareConfigValidator::class];
$app = new Application($config, $validators);
#[\Sidalex\SwooleApp\Classes\Controllers\Route(uri: '/api/{v1}/get_resume',method:"POST")]
class TestController extends AbstractController
{
use Sidalex\SwooleApp\Classes\Controllers\Route;
#[Route(uri: '/api/{v1}/get_resume',method:"POST")]
class TestController extends AbstractController
{
$this->response->setHeader('Content-Type', 'application/json');
$this->response->end(
json_encode(
[
'status' => 'error',
'message' => 'collection '.$this->uri_params['collection_name'] . 'not found in collectionList',
]
)
);
$obj = json_decode($this->request->getContent());
class NotFoundController implements ControllerInterface
{
private \Swoole\Http\Request $request;
private \Swoole\Http\Response $responce;
/**
* @var array|string[]
*/
private array $uri_params;
public function __construct(\Swoole\Http\Request $request, \Swoole\Http\Response $response, array $uri_params=[])
{
$this->request = $request;
$this->responce = $response;
$this->uri_params = $uri_params;
}
public function execute(): \Swoole\Http\Response
{
$this->responce->setStatusCode(404);
$this->responce->setHeader('Content-Type', 'application/json');
$this->responce->end(json_encode(
[
'codeStatus' => '404',
'text' => 'Page not found'
]
));
return $this->responce;
}
public function setApplication(Application $application, Server $server)
{
}
}
namespace YourApp\StateContainers;
use Sidalex\SwooleApp\Classes\Initiation\AbstractContainerInitiator;
use Sidalex\SwooleApp\Application;
class DatabaseConnectionContainer extends AbstractContainerInitiator
{
protected string $key = 'database';
public function init(Application $app): void
{
// Инициализируйте здесь подключение к базе данных
$config = $app->getConfig()->getContainer('database_config');
$this->result = new \PDO(
$config['dsn'],
$config['username'],
$config['password']
);
}
}
// В контроллере:
$db = $this->application->getStateContainer()->getContainer('database');
// В исполнителе задач:
$db = $this->app->getStateContainer()->getContainer('database');
// В циклическом задании:
$db = $this->application->getStateContainer()->getContainer('database');