diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php index a52fe67aba7d8..3e5800f9dacb7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php @@ -17,6 +17,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Filesystem\Exception\IOException; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; @@ -65,7 +66,7 @@ protected function configure() { $this ->setDefinition(array( - new InputArgument('target', InputArgument::OPTIONAL, 'The target directory', 'public'), + new InputArgument('target', InputArgument::OPTIONAL, 'The target directory', null), )) ->addOption('symlink', null, InputOption::VALUE_NONE, 'Symlinks the assets instead of copying it') ->addOption('relative', null, InputOption::VALUE_NONE, 'Make relative symlinks') @@ -107,6 +108,10 @@ protected function execute(InputInterface $input, OutputInterface $output) $kernel = $this->getApplication()->getKernel(); $targetArg = rtrim($input->getArgument('target'), '/'); + if (!$targetArg) { + $targetArg = $this->getPublicDirectory($this->getContainer()); + } + if (!is_dir($targetArg)) { $targetArg = (isset($baseDir) ? $baseDir : $kernel->getContainer()->getParameter('kernel.project_dir')).'/'.$targetArg; @@ -288,4 +293,27 @@ private function hardCopy($originDir, $targetDir) return self::METHOD_COPY; } + + private function getPublicDirectory(ContainerInterface $container) + { + $defaultPublicDir = 'public'; + + if (!$container->hasParameter('kernel.project_dir')) { + return $defaultPublicDir; + } + + $composerFilePath = $container->getParameter('kernel.project_dir').'/composer.json'; + + if (!file_exists($composerFilePath)) { + return $defaultPublicDir; + } + + $composerConfig = json_decode(file_get_contents($composerFilePath), true); + + if (isset($composerConfig['extra']['public-dir'])) { + return $composerConfig['extra']['public-dir']; + } + + return $defaultPublicDir; + } } diff --git a/src/Symfony/Bundle/WebServerBundle/DependencyInjection/WebServerExtension.php b/src/Symfony/Bundle/WebServerBundle/DependencyInjection/WebServerExtension.php index 3dc492dcd1020..bf08a2bac9c97 100644 --- a/src/Symfony/Bundle/WebServerBundle/DependencyInjection/WebServerExtension.php +++ b/src/Symfony/Bundle/WebServerBundle/DependencyInjection/WebServerExtension.php @@ -27,8 +27,31 @@ public function load(array $configs, ContainerBuilder $container) $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('webserver.xml'); + $publicDirectory = $this->getPublicDirectory($container); + $container->getDefinition('web_server.command.server_run')->replaceArgument(0, $publicDirectory); + $container->getDefinition('web_server.command.server_start')->replaceArgument(0, $publicDirectory); + if (!class_exists(ConsoleFormatter::class)) { $container->removeDefinition('web_server.command.server_log'); } } + + private function getPublicDirectory(ContainerBuilder $container) + { + $kernelProjectDir = $container->getParameter('kernel.project_dir'); + $publicDir = 'public'; + $composerFilePath = $kernelProjectDir.'/composer.json'; + + if (!file_exists($composerFilePath)) { + return $kernelProjectDir.'/'.$publicDir; + } + + $composerConfig = json_decode(file_get_contents($composerFilePath), true); + + if (isset($composerConfig['extra']['public-dir'])) { + $publicDir = $composerConfig['extra']['public-dir']; + } + + return $kernelProjectDir.'/'.$publicDir; + } } diff --git a/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/WebServerExtensionTest.php b/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/WebServerExtensionTest.php index ebc0c9421fdb9..57a0a2995dc8f 100644 --- a/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/WebServerExtensionTest.php +++ b/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/WebServerExtensionTest.php @@ -21,8 +21,17 @@ class WebServerExtensionTest extends TestCase public function testLoad() { $container = new ContainerBuilder(); + $container->setParameter('kernel.project_dir', __DIR__); (new WebServerExtension())->load(array(), $container); + $this->assertSame( + __DIR__ . '/test', + $container->getDefinition('web_server.command.server_run')->getArgument(0) + ); + $this->assertSame( + __DIR__ . '/test', + $container->getDefinition('web_server.command.server_start')->getArgument(0) + ); $this->assertTrue($container->hasDefinition('web_server.command.server_run')); $this->assertTrue($container->hasDefinition('web_server.command.server_start')); $this->assertTrue($container->hasDefinition('web_server.command.server_stop')); diff --git a/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/composer.json b/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/composer.json new file mode 100644 index 0000000000000..a4652ebdf8af4 --- /dev/null +++ b/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/composer.json @@ -0,0 +1,6 @@ +{ + "name": "test-composer.json", + "extra": { + "public-dir": "test" + } +}