Ejemplo n.º 1
0
    public function testRenderDir()
    {
        Generator::renderDir($this->dir, array('me' => 'Fabien'));

        $this->assertEquals('Hello Fabien', file_get_contents($this->dir.'/template.txt'), '::renderDir() renders a directory');
        $this->assertEquals('Hello Fabien', file_get_contents($this->dir.'/foo/bar.txt'), '::renderDir() renders a directory');
    }
Ejemplo n.º 2
0
    /**
     * @see Command
     *
     * @throws \InvalidArgumentException When namespace doesn't end with Bundle
     * @throws \RuntimeException         When bundle can't be executed
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if (!preg_match('/Bundle$/', $namespace = $input->getArgument('namespace'))) {
            throw new \InvalidArgumentException('The namespace must end with Bundle.');
        }

        // validate namespace
        $namespace = strtr($namespace, '/', '\\');
        if (preg_match('/[^A-Za-z0-9_\\\-]/', $namespace)) {
            throw new \InvalidArgumentException('The namespace contains invalid characters.');
        }

        // user specified bundle name?
        $bundle = $input->getArgument('bundleName');
        if (!$bundle) {
            $bundle = strtr($namespace, array('\\' => ''));
        }

        if (!preg_match('/Bundle$/', $bundle)) {
            throw new \InvalidArgumentException('The bundle name must end with Bundle.');
        }

        // validate that the namespace is at least one level deep
        if (false === strpos($namespace, '\\')) {
            $msg = array();
            $msg[] = sprintf('The namespace must contain a vendor namespace (e.g. "VendorName\%s" instead of simply "%s").', $namespace, $namespace);
            $msg[] = 'If you\'ve specified a vendor namespace, did you forget to surround it with quotes (init:bundle "Acme\BlogBundle")?';

            throw new \InvalidArgumentException(implode("\n\n", $msg));
        }

        $dir = $input->getArgument('dir');

        // add trailing / if necessary
        $dir = '/' === substr($dir, -1, 1) ? $dir : $dir.'/';

        $targetDir = $dir.strtr($namespace, '\\', '/');

        if (file_exists($targetDir)) {
            throw new \RuntimeException(sprintf('Bundle "%s" already exists.', $bundle));
        }

        $filesystem = $this->container->get('filesystem');
        $filesystem->mirror(__DIR__.'/../Resources/skeleton/bundle/generic', $targetDir);
        $filesystem->mirror(__DIR__.'/../Resources/skeleton/bundle/'.$input->getOption('format'), $targetDir);

        Generator::renderDir($targetDir, array(
            'namespace' => $namespace,
            'bundle'    => $bundle,
        ));

        rename($targetDir.'/Bundle.php', $targetDir.'/'.$bundle.'.php');

        $output->writeln('<comment>Summary of actions</comment>');
        $output->writeln(sprintf('- The bundle "<info>%s</info>" was created at "<info>%s</info>" and is using the namespace "<info>%s</info>".', $bundle, $targetDir, $namespace));
        $output->writeln(sprintf('- The bundle contains a sample controller, a sample template and a sample routing file.'));

        $output->writeln('');
        $output->writeln('<comment>Follow-up actions</comment>');

        $output->writeln('- Enable the bundle inside the AppKernel::registerBundles() method.');
        $output->writeln('      Resource: <info>http://symfony.com/doc/2.0/book/page_creation.html#create-the-bundle</info>');

        $output->writeln('- Ensure that the namespace is registered with the autoloader.');
        $output->writeln('      Resource: <info>http://symfony.com/doc/2.0/book/page_creation.html#autoloading-introduction-sidebar</info>');

        $output->writeln('- If using routing, import the bundle\'s routing resource.');
        $output->writeln('      Resource: <info>http://symfony.com/doc/2.0/book/routing.html#including-external-routing-resources</info>');

        $output->writeln('- Starting building your bundle!');
        $output->writeln('      Resource: <info>http://symfony.com/doc/2.0/book/page_creation.html#the-hello-symfony-page</info>');
    }