diff --git a/composer.json b/composer.json index 33673c2..d6cf892 100644 --- a/composer.json +++ b/composer.json @@ -27,10 +27,11 @@ "prefer-dist": true, "require": { "php": ">=8.1", - "icanboogie/icanboogie": "^6.0", "icanboogie/activerecord": "dev-remove-model-id as 6.0", - "olvlvl/composer-attribute-collector": "^2.0" - }, + "icanboogie/icanboogie": "^6.0", + "olvlvl/composer-attribute-collector": "^2.0", + "symfony/expression-language": "^6.3" + }, "require-dev": { "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^10.0" diff --git a/lib/Record.php b/lib/Record.php new file mode 100644 index 0000000..df8b258 --- /dev/null +++ b/lib/Record.php @@ -0,0 +1,33 @@ + $activerecord_class + */ + public function __construct( // @phpstan-ignore-line + public readonly string $activerecord_class, + ) { + parent::__construct( + expression: sprintf( + "service('%s').model_for_activerecord('%s')", + self::escape(ActiveRecord\ModelProvider::class), + self::escape($this->activerecord_class) + ) + ); + } + + private static function escape(string $str): string { + return str_replace('\\', '\\\\', $str); + } +} diff --git a/tests/app/all/config/services.yml b/tests/app/all/config/services.yml index e6860d7..f743978 100644 --- a/tests/app/all/config/services.yml +++ b/tests/app/all/config/services.yml @@ -13,3 +13,6 @@ services: test.active_record.model.node_by_class: alias: Test\ICanBoogie\Binding\ActiveRecord\Acme\NodeModel + + Test\ICanBoogie\Binding\ActiveRecord\Acme\SampleService: + autowire: true diff --git a/tests/lib/Acme/SampleService.php b/tests/lib/Acme/SampleService.php new file mode 100644 index 0000000..b78c78d --- /dev/null +++ b/tests/lib/Acme/SampleService.php @@ -0,0 +1,17 @@ + $model + */ + public function __construct( + #[Record(Article::class)] public readonly Model $model, + ) { + } +} diff --git a/tests/lib/IntegrationTest.php b/tests/lib/IntegrationTest.php index 9cdc292..e219f8e 100644 --- a/tests/lib/IntegrationTest.php +++ b/tests/lib/IntegrationTest.php @@ -4,8 +4,11 @@ use ICanBoogie\ActiveRecord\ModelProvider; use PHPUnit\Framework\TestCase; +use Test\ICanBoogie\Binding\ActiveRecord\Acme\Article; use Test\ICanBoogie\Binding\ActiveRecord\Acme\NodeModel; +use Test\ICanBoogie\Binding\ActiveRecord\Acme\SampleService; + use function ICanBoogie\app; final class IntegrationTest extends TestCase @@ -19,4 +22,12 @@ public function test_nodes_model(): void $this->assertEquals('id', $nodes->schema->primary); $this->assertEquals('id', $nodes->primary); } + + public function test_qualified_model(): void + { + $service = app()->service_for_class(SampleService::class); + $actual = $service->model->activerecord_class; + + $this->assertEquals(Article::class, $actual); + } }