@@ -57,12 +57,13 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
5757 $ command ->addArgument ('extension ' , InputArgument::OPTIONAL );
5858 $ command ->addArgument ('targets ' , InputArgument::OPTIONAL );
5959 $ command ->addArgument ('values ' , InputArgument::OPTIONAL );
60+ $ command ->addArgument ('classes ' , InputArgument::OPTIONAL );
6061
6162 if ($ input ->getOption ('typescript ' )) {
6263 $ input ->setArgument ('extension ' , 'ts ' );
6364 } else {
6465 $ chosenExtension = $ io ->choice (
65- 'Language (<fg=yellow>JavaScript</> or <fg=yellow>TypeScript</>) ' ,
66+ 'Language (<fg=yellow>JavaScript</> or <fg=yellow>TypeScript</>) ' ,
6667 [
6768 'js ' => 'JavaScript ' ,
6869 'ts ' => 'TypeScript ' ,
@@ -107,16 +108,35 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
107108
108109 $ input ->setArgument ('values ' , $ values );
109110 }
111+
112+ if ($ io ->confirm ('Do you want to add classes? ' , false )) {
113+ $ classes = [];
114+ $ isFirstClass = true ;
115+
116+ while (true ) {
117+ $ newClass = $ this ->askForNextClass ($ io , $ classes , $ isFirstClass );
118+ if (null === $ newClass ) {
119+ break ;
120+ }
121+
122+ $ isFirstClass = false ;
123+ $ classes [] = $ newClass ;
124+ }
125+
126+ $ input ->setArgument ('classes ' , $ classes );
127+ }
110128 }
111129
112130 public function generate (InputInterface $ input , ConsoleStyle $ io , Generator $ generator ): void
113131 {
114132 $ controllerName = Str::asSnakeCase ($ input ->getArgument ('name ' ));
115133 $ chosenExtension = $ input ->getArgument ('extension ' );
116- $ targets = $ input ->getArgument ('targets ' );
117- $ values = $ input ->getArgument ('values ' );
134+ $ targets = $ targetArgs = $ input ->getArgument ('targets ' ) ?? [];
135+ $ values = $ valuesArg = $ input ->getArgument ('values ' ) ?? [];
136+ $ classes = $ classesArgs = $ input ->getArgument ('classes ' ) ?? [];
118137
119138 $ targets = empty ($ targets ) ? $ targets : \sprintf ("['%s'] " , implode ("', ' " , $ targets ));
139+ $ classes = $ classes ? \sprintf ("['%s'] " , implode ("', ' " , $ classes )) : null ;
120140
121141 $ fileName = \sprintf ('%s_controller.%s ' , $ controllerName , $ chosenExtension );
122142 $ filePath = \sprintf ('assets/controllers/%s ' , $ fileName );
@@ -127,6 +147,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
127147 [
128148 'targets ' => $ targets ,
129149 'values ' => $ values ,
150+ 'classes ' => $ classes ,
130151 ]
131152 );
132153
@@ -224,6 +245,29 @@ private function askForNextValue(ConsoleStyle $io, array $values, bool $isFirstV
224245 return ['name ' => $ valueName , 'type ' => $ type ];
225246 }
226247
248+ /** @param string[] $classes */
249+ private function askForNextClass (ConsoleStyle $ io , array $ classes , bool $ isFirstClass ): ?string
250+ {
251+ $ questionText = 'New class name (press <return> to stop adding classes) ' ;
252+
253+ if (!$ isFirstClass ) {
254+ $ questionText = 'Add another class? Enter the class name (or press <return> to stop adding classes) ' ;
255+ }
256+
257+ $ className = $ io ->ask ($ questionText , validator: function (?string $ name ) use ($ classes ) {
258+ if (str_contains ($ name , ' ' )) {
259+ throw new \InvalidArgumentException ('Class name cannot contain spaces. ' );
260+ }
261+ if (\in_array ($ name , $ classes , true )) {
262+ throw new \InvalidArgumentException (\sprintf ('The "%s" class already exists. ' , $ name ));
263+ }
264+
265+ return $ name ;
266+ });
267+
268+ return $ className ?: null ;
269+ }
270+
227271 private function printAvailableTypes (ConsoleStyle $ io ): void
228272 {
229273 foreach ($ this ->getValuesTypes () as $ type ) {
0 commit comments