Skip to content

Commit d1a46fb

Browse files
committed
feature symfony#840 allowing the user to choose a controller class for make:crud (weaverryan)
This PR was squashed before being merged into the 1.0-dev branch. Discussion ---------- allowing the user to choose a controller class for make:crud Hi! This adds a 2nd question to `make:crud`: <img width="1140" alt="Screen Shot 2021-03-15 at 10 41 58 AM" src="https://user-images.githubusercontent.com/121003/111171192-12558c00-857b-11eb-8b6e-0a11bc028b9f.png"> Very simple - I have hit a few cases where I wanted this :). Cheers! Commits ------- 8bb6788 allowing the user to choose a controller class for make:crud
2 parents ebbc8e1 + 8bb6788 commit d1a46fb

File tree

4 files changed

+144
-1
lines changed

4 files changed

+144
-1
lines changed

src/Maker/MakeCrud.php

+10-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ final class MakeCrud extends AbstractMaker
4444

4545
private $inflector;
4646

47+
private $controllerClassName;
48+
4749
public function __construct(DoctrineHelper $doctrineHelper, FormTypeRenderer $formTypeRenderer)
4850
{
4951
$this->doctrineHelper = $doctrineHelper;
@@ -91,6 +93,13 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
9193

9294
$input->setArgument('entity-class', $value);
9395
}
96+
97+
$defaultControllerClass = Str::asClassName(sprintf('%s Controller', $input->getArgument('entity-class')));
98+
99+
$this->controllerClassName = $io->ask(
100+
sprintf('Choose a name for your controller class (e.g. <fg=yellow>%s</>)', $defaultControllerClass),
101+
$defaultControllerClass
102+
);
94103
}
95104

96105
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator)
@@ -119,7 +128,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
119128
}
120129

121130
$controllerClassDetails = $generator->createClassNameDetails(
122-
$entityClassDetails->getRelativeNameWithoutSuffix().'Controller',
131+
$this->controllerClassName,
123132
'Controller\\',
124133
'Controller'
125134
);

tests/Maker/MakeCrudTest.php

+22
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public function getTestDetails()
2424
[
2525
// entity class name
2626
'SweetFood',
27+
'', // default controller
2728
])
2829
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrud')
2930
// need for crud web tests
@@ -36,11 +37,30 @@ public function getTestDetails()
3637
->setRequiredPhpVersion(70200),
3738
];
3839

40+
yield 'crud_basic_custom_controller' => [MakerTestDetails::createTest(
41+
$this->getMakerInstance(MakeCrud::class),
42+
[
43+
// entity class name
44+
'SweetFood',
45+
'SweetFoodAdminController', // default controller
46+
])
47+
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrudCustomController')
48+
// need for crud web tests
49+
->configureDatabase()
50+
->assert(function (string $output, string $directory) {
51+
$this->assertStringContainsString('created: src/Controller/SweetFoodAdminController.php', $output);
52+
$this->assertStringContainsString('created: src/Form/SweetFoodType.php', $output);
53+
})
54+
// workaround for segfault in PHP 7.1 CI :/
55+
->setRequiredPhpVersion(70200),
56+
];
57+
3958
yield 'crud_basic_in_custom_root_namespace' => [MakerTestDetails::createTest(
4059
$this->getMakerInstance(MakeCrud::class),
4160
[
4261
// entity class name
4362
'SweetFood',
63+
'', // default controller
4464
])
4565
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrudInCustomRootNamespace')
4666
->changeRootNamespace('Custom')
@@ -59,6 +79,7 @@ public function getTestDetails()
5979
[
6080
// entity class name
6181
'SweetFood',
82+
'', // default controller
6283
])
6384
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrudRepository')
6485
// need for crud web tests
@@ -76,6 +97,7 @@ public function getTestDetails()
7697
[
7798
// entity class name
7899
'SweetFood',
100+
'', // default controller
79101
])
80102
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrud')
81103
// need for crud web tests
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace App\Entity;
4+
5+
use Doctrine\ORM\Mapping as ORM;
6+
7+
/**
8+
* @ORM\Entity()
9+
*/
10+
class SweetFood
11+
{
12+
/**
13+
* @ORM\Column(name="id", type="integer")
14+
* @ORM\Id
15+
* @ORM\GeneratedValue(strategy="AUTO")
16+
*/
17+
private $id;
18+
19+
/**
20+
* @ORM\Column(name="title", type="string", length=255)
21+
*/
22+
private $title;
23+
24+
public function getId()
25+
{
26+
return $this->id;
27+
}
28+
29+
/**
30+
* @return mixed
31+
*/
32+
public function getTitle()
33+
{
34+
return $this->title;
35+
}
36+
37+
/**
38+
* @param mixed $title
39+
*/
40+
public function setTitle($title)
41+
{
42+
$this->title = $title;
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
namespace App\Tests;
4+
5+
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
6+
7+
class GeneratedCrudControllerTest extends WebTestCase
8+
{
9+
public function testIndexAction()
10+
{
11+
$client = self::createClient();
12+
$crawler = $client->request('GET', '/sweet/food/admin/');
13+
$this->assertTrue($client->getResponse()->isSuccessful());
14+
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
15+
$this->assertStringContainsString('SweetFood index', $client->getResponse()->getContent());
16+
17+
$newLink = $crawler->filter('a:contains("Create new")')->eq(0)->link();
18+
19+
$crawler = $client->click($newLink);
20+
$this->assertTrue($client->getResponse()->isSuccessful());
21+
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
22+
$this->assertStringContainsString('New SweetFood', $client->getResponse()->getContent());
23+
24+
$newForm = $crawler->selectButton('Save')->form();
25+
$client->submit($newForm, ['sweet_food[title]' => 'Candy']);
26+
$this->assertTrue($client->getResponse()->isRedirect());
27+
28+
$crawler = $client->followRedirect();
29+
$this->assertTrue($client->getResponse()->isSuccessful());
30+
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
31+
$this->assertStringContainsString('SweetFood index', $client->getResponse()->getContent());
32+
$this->assertStringContainsString('<td>Candy</td>', $client->getResponse()->getContent());
33+
34+
$editLink = $crawler->filter('a:contains("edit")')->eq(0)->link();
35+
$crawler = $client->click($editLink);
36+
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
37+
$this->assertStringContainsString('Edit SweetFood', $client->getResponse()->getContent());
38+
$this->assertGreaterThan(0, $crawler->filter('input[type=text]')->count());
39+
40+
$editForm = $crawler->selectButton('Update')->form();
41+
$client->submit($editForm, ['sweet_food[title]' => 'Candy edited']);
42+
$this->assertTrue($client->getResponse()->isRedirect());
43+
44+
$crawler = $client->followRedirect();
45+
$this->assertTrue($client->getResponse()->isSuccessful());
46+
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
47+
$this->assertStringContainsString('SweetFood index', $client->getResponse()->getContent());
48+
$this->assertStringContainsString('Candy edited', $client->getResponse()->getContent());
49+
50+
$showLink = $crawler->filter('a:contains("show")')->eq(0)->link();
51+
52+
$crawler = $client->click($showLink);
53+
$this->assertTrue($client->getResponse()->isSuccessful());
54+
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
55+
$this->assertStringContainsString('SweetFood', $client->getResponse()->getContent());
56+
$this->assertStringContainsString('Candy edited', $client->getResponse()->getContent());
57+
58+
$deleteForm = $crawler->selectButton('Delete')->form();
59+
$client->submit($deleteForm);
60+
$this->assertTrue($client->getResponse()->isRedirect());
61+
62+
$client->followRedirect();
63+
$this->assertTrue($client->getResponse()->isSuccessful());
64+
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
65+
$this->assertStringContainsString('SweetFood index', $client->getResponse()->getContent());
66+
$this->assertStringContainsString('no records found', $client->getResponse()->getContent());
67+
}
68+
}

0 commit comments

Comments
 (0)