Skip to content

Commit eafcd0c

Browse files
authored
Add Laravel support to Swoole (#22)
1 parent a3bdfed commit eafcd0c

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

src/LaravelRunner.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
namespace Runtime\Swoole;
4+
5+
use Illuminate\Contracts\Http\Kernel;
6+
use Illuminate\Http\Request as LaravelRequest;
7+
use Swoole\Http\Request;
8+
use Swoole\Http\Response;
9+
use Swoole\Http\Server;
10+
use Symfony\Component\Runtime\RunnerInterface;
11+
12+
/**
13+
* A runner for Laravel.
14+
*
15+
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
16+
*/
17+
class LaravelRunner implements RunnerInterface
18+
{
19+
private $application;
20+
private $port;
21+
private $host;
22+
23+
public function __construct(Kernel $application, $host, $port)
24+
{
25+
$this->application = $application;
26+
$this->host = $host;
27+
$this->port = $port;
28+
}
29+
30+
public function run(): int
31+
{
32+
$server = new Server($this->host, $this->port);
33+
34+
$app = $this->application;
35+
36+
$server->on('request', function (Request $request, Response $response) use ($app) {
37+
// convert to HttpFoundation request
38+
$sfRequest = new LaravelRequest(
39+
$request->get ?? [],
40+
$request->post ?? [],
41+
[],
42+
$request->cookie ?? [],
43+
$request->files ?? [],
44+
$request->server ?? [],
45+
$request->rawContent()
46+
);
47+
48+
$sfResponse = $app->handle($sfRequest);
49+
foreach ($sfResponse->headers->all() as $name => $value) {
50+
$response->header($name, $value);
51+
}
52+
$response->end($sfResponse->getContent());
53+
});
54+
55+
$server->start();
56+
57+
return 0;
58+
}
59+
}

src/Runtime.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Runtime\Swoole;
44

5+
use Illuminate\Contracts\Http\Kernel;
56
use Symfony\Component\HttpKernel\HttpKernelInterface;
67
use Symfony\Component\Runtime\RunnerInterface;
78
use Symfony\Component\Runtime\SymfonyRuntime;
@@ -31,6 +32,10 @@ public function getRunner(?object $application): RunnerInterface
3132
return new SymfonyRunner($application, $this->options['swoole_host'], $this->options['swoole_port']);
3233
}
3334

35+
if ($application instanceof Kernel) {
36+
return new LaravelRunner($application, $this->options['swoole_host'], $this->options['swoole_port']);
37+
}
38+
3439
return parent::getRunner($application);
3540
}
3641
}

0 commit comments

Comments
 (0)