-
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding the ability to generate TCP service and Centrifugo handler via…
… Scaffolder (#80) * Add the ability to generate TCP service and Centrifugo handler * Fix CS, fix Psalm * Improve tests * PHPUnit 10 * Fix CS
- Loading branch information
Showing
22 changed files
with
488 additions
and
55 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Spiral\RoadRunnerBridge\Bootloader; | ||
|
||
use Psr\Container\ContainerInterface; | ||
use RoadRunner\Centrifugo\CentrifugoApiInterface; | ||
use Spiral\Boot\Bootloader\Bootloader; | ||
use Spiral\Console\Bootloader\ConsoleBootloader; | ||
use Spiral\RoadRunnerBridge\Console\Command\Scaffolder\CentrifugoHandlerCommand; | ||
use Spiral\RoadRunnerBridge\Console\Command\Scaffolder\TcpServiceCommand; | ||
use Spiral\RoadRunnerBridge\Scaffolder\Declaration\CentrifugoHandlerDeclaration; | ||
use Spiral\RoadRunnerBridge\Scaffolder\Declaration\TcpServiceDeclaration; | ||
use Spiral\RoadRunnerBridge\Tcp\Server; | ||
use Spiral\Scaffolder\Bootloader\ScaffolderBootloader as BaseScaffolderBootloader; | ||
|
||
final class ScaffolderBootloader extends Bootloader | ||
{ | ||
public const DEPENDENCIES = [ | ||
ConsoleBootloader::class, | ||
BaseScaffolderBootloader::class, | ||
]; | ||
|
||
public function __construct( | ||
private readonly ContainerInterface $container | ||
) { | ||
} | ||
|
||
public function init(BaseScaffolderBootloader $scaffolder, ConsoleBootloader $console): void | ||
{ | ||
$this->configureCommands($console); | ||
$this->configureDeclarations($scaffolder); | ||
} | ||
|
||
private function configureCommands(ConsoleBootloader $console): void | ||
{ | ||
if ($this->container->has(CentrifugoApiInterface::class)) { | ||
$console->addCommand(CentrifugoHandlerCommand::class); | ||
} | ||
|
||
if ($this->container->has(Server::class)) { | ||
$console->addCommand(TcpServiceCommand::class); | ||
} | ||
} | ||
|
||
private function configureDeclarations(BaseScaffolderBootloader $scaffolder): void | ||
{ | ||
$scaffolder->addDeclaration(CentrifugoHandlerDeclaration::TYPE, [ | ||
'namespace' => 'Endpoint\\Centrifugo\\Handler', | ||
'postfix' => 'Handler', | ||
'class' => CentrifugoHandlerDeclaration::class, | ||
]); | ||
|
||
$scaffolder->addDeclaration(TcpServiceDeclaration::TYPE, [ | ||
'namespace' => 'Endpoint\\Tcp\\Service', | ||
'postfix' => 'Service', | ||
'class' => TcpServiceDeclaration::class, | ||
]); | ||
} | ||
} |
35 changes: 35 additions & 0 deletions
35
src/Console/Command/Scaffolder/CentrifugoHandlerCommand.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Spiral\RoadRunnerBridge\Console\Command\Scaffolder; | ||
|
||
use Spiral\Console\Attribute\Argument; | ||
use Spiral\Console\Attribute\AsCommand; | ||
use Spiral\Console\Attribute\Option; | ||
use Spiral\Console\Attribute\Question; | ||
use Spiral\RoadRunnerBridge\Scaffolder\Declaration\CentrifugoHandlerDeclaration; | ||
use Spiral\Scaffolder\Command\AbstractCommand; | ||
|
||
#[AsCommand(name: 'create:centrifugo-handler', description: 'Create Centrifugo handler declaration')] | ||
final class CentrifugoHandlerCommand extends AbstractCommand | ||
{ | ||
#[Argument(description: 'Centrifugo handler name')] | ||
#[Question(question: 'What would you like to name the Centrifugo handler?')] | ||
private string $name; | ||
|
||
#[Option(shortcut: 'c', description: 'Optional comment to add as class header')] | ||
private ?string $comment = null; | ||
|
||
#[Option(description: 'Optional, specify a custom namespace')] | ||
private ?string $namespace = null; | ||
|
||
public function perform(): int | ||
{ | ||
$declaration = $this->createDeclaration(CentrifugoHandlerDeclaration::class); | ||
|
||
$this->writeDeclaration($declaration); | ||
|
||
return self::SUCCESS; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Spiral\RoadRunnerBridge\Console\Command\Scaffolder; | ||
|
||
use Spiral\Console\Attribute\Argument; | ||
use Spiral\Console\Attribute\AsCommand; | ||
use Spiral\Console\Attribute\Option; | ||
use Spiral\Console\Attribute\Question; | ||
use Spiral\RoadRunnerBridge\Scaffolder\Declaration\TcpServiceDeclaration; | ||
use Spiral\Scaffolder\Command\AbstractCommand; | ||
|
||
#[AsCommand(name: 'create:tcp-service', description: 'Create TCP service declaration')] | ||
final class TcpServiceCommand extends AbstractCommand | ||
{ | ||
#[Argument(description: 'TCP service name')] | ||
#[Question(question: 'What would you like to name the TCP service?')] | ||
private string $name; | ||
|
||
#[Option(shortcut: 'c', description: 'Optional comment to add as class header')] | ||
private ?string $comment = null; | ||
|
||
#[Option(description: 'Optional, specify a custom namespace')] | ||
private ?string $namespace = null; | ||
|
||
public function perform(): int | ||
{ | ||
$declaration = $this->createDeclaration(TcpServiceDeclaration::class); | ||
|
||
$this->writeDeclaration($declaration); | ||
|
||
return self::SUCCESS; | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
src/Scaffolder/Declaration/CentrifugoHandlerDeclaration.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Spiral\RoadRunnerBridge\Scaffolder\Declaration; | ||
|
||
use RoadRunner\Centrifugo\CentrifugoApiInterface; | ||
use Spiral\Scaffolder\Declaration\AbstractDeclaration; | ||
|
||
class CentrifugoHandlerDeclaration extends AbstractDeclaration | ||
{ | ||
public const TYPE = 'centrifugo-handler'; | ||
|
||
public function declare(): void | ||
{ | ||
$this->namespace->addUse(CentrifugoApiInterface::class); | ||
|
||
$this->class->setFinal(); | ||
|
||
$this->class->addMethod('__construct') | ||
->setPublic() | ||
->addPromotedParameter('api') | ||
->setPrivate() | ||
->setReadOnly() | ||
->setType(CentrifugoApiInterface::class) | ||
; | ||
|
||
$this->class->addMethod('handle')->setPublic()->setReturnType('void'); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Spiral\RoadRunnerBridge\Scaffolder\Declaration; | ||
|
||
use Spiral\RoadRunner\Tcp\Request; | ||
use Spiral\RoadRunnerBridge\Tcp\Response\RespondMessage; | ||
use Spiral\RoadRunnerBridge\Tcp\Response\ResponseInterface; | ||
use Spiral\RoadRunnerBridge\Tcp\Service\ServiceInterface; | ||
use Spiral\Scaffolder\Declaration\AbstractDeclaration; | ||
|
||
class TcpServiceDeclaration extends AbstractDeclaration | ||
{ | ||
public const TYPE = 'tcp-service'; | ||
|
||
public function declare(): void | ||
{ | ||
$this->namespace->addUse(ServiceInterface::class); | ||
$this->namespace->addUse(Request::class); | ||
$this->namespace->addUse(RespondMessage::class); | ||
$this->namespace->addUse(ResponseInterface::class); | ||
|
||
$this->class->addImplement(ServiceInterface::class); | ||
$this->class->setFinal(); | ||
|
||
$this->class->addMethod('handle') | ||
->setPublic() | ||
->addBody("return new RespondMessage('some message', true);") | ||
->setReturnType(ResponseInterface::class) | ||
->addParameter('request') | ||
->setType(Request::class) | ||
; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Spiral\Tests\Bootloader; | ||
|
||
use Spiral\RoadRunnerBridge\Scaffolder\Declaration\CentrifugoHandlerDeclaration; | ||
use Spiral\RoadRunnerBridge\Scaffolder\Declaration\TcpServiceDeclaration; | ||
use Spiral\Scaffolder\Config\ScaffolderConfig; | ||
use Spiral\Tests\TestCase; | ||
|
||
final class ScaffolderBootloaderTest extends TestCase | ||
{ | ||
public function testCommandsShouldBeRegistered(): void | ||
{ | ||
$this->assertCommandRegistered('create:centrifugo-handler'); | ||
$this->assertCommandRegistered('create:tcp-service'); | ||
} | ||
|
||
public function testDeclarationsShouldBeRegistered(): void | ||
{ | ||
$config = $this->getConfig(ScaffolderConfig::CONFIG); | ||
|
||
$this->assertSame([ | ||
'namespace' => 'Endpoint\\Centrifugo\\Handler', | ||
'postfix' => 'Handler', | ||
'class' => CentrifugoHandlerDeclaration::class, | ||
], $config['defaults']['declarations'][CentrifugoHandlerDeclaration::TYPE]); | ||
|
||
$this->assertSame([ | ||
'namespace' => 'Endpoint\\Tcp\\Service', | ||
'postfix' => 'Service', | ||
'class' => TcpServiceDeclaration::class, | ||
], $config['defaults']['declarations'][TcpServiceDeclaration::TYPE]); | ||
} | ||
} |
Oops, something went wrong.