Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/main/lib/cli/command/make/service/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/main/lib/cli/command/make/service/controllerservice.php

<?php

namespace Bitrix\Main\Cli\Command\Make\Service;

use Bitrix\Main\Cli\Command\Make\Service\Controller\GenerateDto;
use Bitrix\Main\Cli\Helper\PathGenerator;
use Bitrix\Main\Cli\Helper\NamespaceGenerator;
use Bitrix\Main\Cli\Helper\Renderer;
use Bitrix\Main\Cli\Command\Make\Templates\ControllerTemplate;
use InvalidArgumentException;

final class ControllerService
{
	private Renderer $renderer;
	private PathGenerator $PathGenerator;
	private NamespaceGenerator $NamespaceGenerator;
	private string $defaultRootFolder;

	public function __construct()
	{
		$this->renderer = new Renderer();
		$this->NamespaceGenerator = new NamespaceGenerator();
		$this->defaultRootFolder = (string)$_SERVER['DOCUMENT_ROOT'];
	}

	public function generateContent(GenerateDto $dto): string
	{
		$namespace = $this->generateNamespace($dto);
		$className = $this->normalizeControllerName($dto->name);
		$fileTemplate = new ControllerTemplate($className, $namespace);

		return $fileTemplate->getContent();
	}

	public function generateFile(GenerateDto $dto): void
	{
		$namespace = $this->generateNamespace($dto);
		$className = $this->normalizeControllerName($dto->name);
		$fileTemplate = new ControllerTemplate($className, $namespace);

		$this->PathGenerator = new PathGenerator(
			$dto->psr4,
			$dto->rootFolder ?: $this->defaultRootFolder,
		);
		$filePath = $this->PathGenerator->generatePathToClass($namespace, $className);

		$this->renderer->renderToFile($filePath, $fileTemplate);
	}

	#region internal

	private function generateNamespace(GenerateDto $dto): string
	{
		$namespace = $dto->namespace;
		if (empty($namespace))
		{
			$moduleId = $dto->moduleId;
			if (empty($moduleId))
			{
				throw new InvalidArgumentException('If namespace option is not set, module argument MUST BE set!');
			}

			$namespace = $this->NamespaceGenerator->generateNamespaceForModule($moduleId, 'Controller');
		}

		return $namespace;
	}

	private function normalizeControllerName(string $name): string
	{
		$name = preg_replace('/Controller$/i', '', $name);
		if (empty($name))
		{
			throw new InvalidArgumentException('Invalid controller name');
		}

		return ucfirst($name) . 'Controller';
	}

	#endregion internal
}