Skip to content

Commit 5c3abe2

Browse files
authored
[bug] allow passing full namespace with make:factory (zenstruck#171)
1 parent d2cd4c7 commit 5c3abe2

File tree

2 files changed

+57
-9
lines changed

2 files changed

+57
-9
lines changed

src/Bundle/Maker/MakeFactory.php

+15-5
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,22 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
8888
throw new RuntimeCommandException(\sprintf('Entity "%s" not found.', $input->getArgument('entity')));
8989
}
9090

91+
$namespace = $input->getOption('namespace');
92+
93+
// strip maker's root namespace if set
94+
if (0 === \mb_strpos($namespace, $generator->getRootNamespace())) {
95+
$namespace = \mb_substr($namespace, \mb_strlen($generator->getRootNamespace()));
96+
}
97+
98+
$namespace = \trim($namespace, '\\');
99+
100+
// if creating in tests dir, ensure namespace prefixed with Tests\
101+
if ($input->getOption('test') && 0 !== \mb_strpos($namespace, 'Tests\\')) {
102+
$namespace = 'Tests\\'.$namespace;
103+
}
104+
91105
$entity = new \ReflectionClass($class);
92-
$factory = $generator->createClassNameDetails(
93-
$entity->getShortName(),
94-
$input->getOption('test') ? 'Tests\\'.$input->getOption('namespace') : $input->getOption('namespace'),
95-
'Factory'
96-
);
106+
$factory = $generator->createClassNameDetails($entity->getShortName(), $namespace, 'Factory');
97107

98108
$repository = new \ReflectionClass($this->managerRegistry->getRepository($entity->getName()));
99109

tests/Functional/Bundle/Maker/MakeFactoryTest.php

+42-4
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,15 @@ public function invalid_entity_throws_exception(): void
332332
public function can_customize_namespace(): void
333333
{
334334
$tester = new CommandTester((new Application(self::bootKernel()))->find('make:factory'));
335+
$expectedFile = self::tempFile('src/My/Namespace/TagFactory.php');
335336

336-
$this->assertFileDoesNotExist(self::tempFile('src/My/Namespace/TagFactory.php'));
337+
$this->assertFileDoesNotExist($expectedFile);
337338

338339
$tester->setInputs([Tag::class]);
339340
$tester->execute(['--namespace' => 'My\\Namespace']);
340341

341-
$this->assertFileExists(self::tempFile('src/My/Namespace/TagFactory.php'));
342+
$this->assertFileExists($expectedFile);
343+
$this->assertStringContainsString('namespace App\\My\\Namespace;', \file_get_contents($expectedFile));
342344
}
343345

344346
/**
@@ -347,12 +349,48 @@ public function can_customize_namespace(): void
347349
public function can_customize_namespace_with_test_flag(): void
348350
{
349351
$tester = new CommandTester((new Application(self::bootKernel()))->find('make:factory'));
352+
$expectedFile = self::tempFile('tests/My/Namespace/TagFactory.php');
350353

351-
$this->assertFileDoesNotExist(self::tempFile('tests/My/Namespace/TagFactory.php'));
354+
$this->assertFileDoesNotExist($expectedFile);
352355

353356
$tester->setInputs([Tag::class]);
354357
$tester->execute(['--namespace' => 'My\\Namespace', '--test' => true]);
355358

356-
$this->assertFileExists(self::tempFile('tests/My/Namespace/TagFactory.php'));
359+
$this->assertFileExists($expectedFile);
360+
$this->assertStringContainsString('namespace App\\Tests\\My\\Namespace;', \file_get_contents($expectedFile));
361+
}
362+
363+
/**
364+
* @test
365+
*/
366+
public function can_customize_namespace_with_root_namespace_prefix(): void
367+
{
368+
$tester = new CommandTester((new Application(self::bootKernel()))->find('make:factory'));
369+
$expectedFile = self::tempFile('src/My/Namespace/TagFactory.php');
370+
371+
$this->assertFileDoesNotExist($expectedFile);
372+
373+
$tester->setInputs([Tag::class]);
374+
$tester->execute(['--namespace' => 'App\\My\\Namespace']);
375+
376+
$this->assertFileExists($expectedFile);
377+
$this->assertStringContainsString('namespace App\\My\\Namespace;', \file_get_contents($expectedFile));
378+
}
379+
380+
/**
381+
* @test
382+
*/
383+
public function can_customize_namespace_with_test_flag_with_root_namespace_prefix(): void
384+
{
385+
$tester = new CommandTester((new Application(self::bootKernel()))->find('make:factory'));
386+
$expectedFile = self::tempFile('tests/My/Namespace/TagFactory.php');
387+
388+
$this->assertFileDoesNotExist($expectedFile);
389+
390+
$tester->setInputs([Tag::class]);
391+
$tester->execute(['--namespace' => 'App\\Tests\\My\\Namespace', '--test' => true]);
392+
393+
$this->assertFileExists($expectedFile);
394+
$this->assertStringContainsString('namespace App\\Tests\\My\\Namespace;', \file_get_contents($expectedFile));
357395
}
358396
}

0 commit comments

Comments
 (0)