/** * Kickstart a new action controller * * Generates an Action Controller with the given name in the specified package. * In its default mode it will create just the controller containing a sample * indexAction. * * By specifying the --generate-actions flag, this command will also create a * set of actions. If no model or repository exists which matches the * controller name (for example "CoffeeRepository" for "CoffeeController"), * an error will be shown. * * Likewise the command exits with an error if the specified package does not * exist. By using the --generate-related flag, a missing package, model or * repository can be created alongside, avoiding such an error. * * By specifying the --generate-templates flag, this command will also create * matching Fluid templates for the actions created. This option can only be * used in combination with --generate-actions. * * The default behavior is to not overwrite any existing code. This can be * overridden by specifying the --force flag. * * @param string $packageKey The package key of the package for the new controller with an optional subpackage, (e.g. "MyCompany.MyPackage/Admin"). * @param string $controllerName The name for the new controller. This may also be a comma separated list of controller names. * @param boolean $generateActions Also generate index, show, new, create, edit, update and delete actions. * @param boolean $generateTemplates Also generate the templates for each action. * @param boolean $generateRelated Also create the mentioned package, related model and repository if neccessary. * @param boolean $force Overwrite any existing controller or template code. Regardless of this flag, the package, model and repository will never be overwritten. * @return string * @see neos.kickstarter:kickstart:commandcontroller */ public function actionControllerCommand($packageKey, $controllerName, $generateActions = false, $generateTemplates = true, $generateRelated = false, $force = false) { $subpackageName = ''; if (strpos($packageKey, '/') !== false) { list($packageKey, $subpackageName) = explode('/', $packageKey, 2); } $this->validatePackageKey($packageKey); if (!$this->packageManager->isPackageAvailable($packageKey)) { if ($generateRelated === false) { $this->outputLine('Package "%s" is not available.', array($packageKey)); $this->outputLine('Hint: Use --generate-related for creating it!'); exit(2); } $this->packageManager->createPackage($packageKey); } $generatedFiles = array(); $generatedModels = false; $controllerNames = Arrays::trimExplode(',', $controllerName); if ($generateActions === true) { foreach ($controllerNames as $currentControllerName) { $modelClassName = str_replace('.', '\\', $packageKey) . '\\Domain\\Model\\' . $currentControllerName; if (!class_exists($modelClassName)) { if ($generateRelated === true) { $generatedFiles += $this->generatorService->generateModel($packageKey, $currentControllerName, array('name' => array('type' => 'string'))); $generatedModels = true; } else { $this->outputLine('The model %s does not exist, but is necessary for creating the respective actions.', array($modelClassName)); $this->outputLine('Hint: Use --generate-related for creating it!'); exit(3); } } $repositoryClassName = str_replace('.', '\\', $packageKey) . '\\Domain\\Repository\\' . $currentControllerName . 'Repository'; if (!class_exists($repositoryClassName)) { if ($generateRelated === true) { $generatedFiles += $this->generatorService->generateRepository($packageKey, $currentControllerName); } else { $this->outputLine('The repository %s does not exist, but is necessary for creating the respective actions.', array($repositoryClassName)); $this->outputLine('Hint: Use --generate-related for creating it!'); exit(4); } } } } foreach ($controllerNames as $currentControllerName) { if ($generateActions === true) { $generatedFiles += $this->generatorService->generateCrudController($packageKey, $subpackageName, $currentControllerName, $force); } else { $generatedFiles += $this->generatorService->generateActionController($packageKey, $subpackageName, $currentControllerName, $force); } if ($generateTemplates === true) { $generatedFiles += $this->generatorService->generateLayout($packageKey, 'Default', $force); if ($generateActions === true) { $generatedFiles += $this->generatorService->generateView($packageKey, $subpackageName, $currentControllerName, 'Index', 'Index', $force); $generatedFiles += $this->generatorService->generateView($packageKey, $subpackageName, $currentControllerName, 'New', 'New', $force); $generatedFiles += $this->generatorService->generateView($packageKey, $subpackageName, $currentControllerName, 'Edit', 'Edit', $force); $generatedFiles += $this->generatorService->generateView($packageKey, $subpackageName, $currentControllerName, 'Show', 'Show', $force); } else { $generatedFiles += $this->generatorService->generateView($packageKey, $subpackageName, $currentControllerName, 'Index', 'SampleIndex', $force); } } } $this->outputLine(implode(PHP_EOL, $generatedFiles)); if ($generatedModels === true) { $this->outputLine('As new models were generated, don\'t forget to update the database schema with the respective doctrine:* commands.'); } }