2016-10-04 89 views
0

我決定創建最小的Silex 3,Doctrine2堆棧,以便可以製作簡單的REST API。我不知道如何處理教義控制檯。使用自定義CLI命令運行原理控制檯

我想保持簡單,所以在project root我創建的文件夾名爲bin。我創建了應該運行各種php文件的簡單文件console.php

文件:bin\console.php

<?php 

// When I run "php bin/console.php doctrine --version" 
// The "doctrine" is name of the library that I want to use 
// So that I can also do something like "php bin/console.php myLibrary --specialCommand" 
$type = $argv[1]; 

// I want to remove the name of the library from the cli command though 
unset($argv[1]); 
// Update array indexes 
$argv = array_values($argv); 

// Choose file 
if ($type == "doctrine") { 
    // Run doctrine 
    require_once __DIR__ . "/console/doctrine.php"; 
} 

,但我得到以下錯誤:

[Symfony\Component\Console\Exception\CommandNotFoundException] 
    Command "doctrine" is not defined. 

回答

0

我知道,這其實是一個非常糟糕的路該怎麼做的事情,但如果有人想知道的答案未來如果你想編輯你還必須更新$argc

此代碼按預期工作:

<?php 

// When I run "php bin/console.php doctrine --version" 
// The "doctrine" is name of the library that I want to use 
// So that I can also do something like "php bin/console.php myLibrary --specialCommand" 
$type = $argv[1]; 

// I want to remove the name of the library from the cli command though 
unset($argv[1]); 
// Update array indexes 
$argv = array_values($argv); 
$argc -= 1; 

// Choose file 
if ($type == "doctrine") { 
    // Run doctrine 
    require_once __DIR__ . "/console/doctrine.php"; 
} 
1

這是我與Silex-SkeletonDoctrine ORM Service Provider配置。

src/console.php

在這個文件中,您需要添加Doctrine CLI命令。

<?php 

use Symfony\Component\Console\Application; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 
use Symfony\Component\Console\Input\InputArgument; 
use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Filesystem\Filesystem; 
use Symfony\Component\Finder\Finder; 
use Symfony\Component\Console\Helper\HelperSet; 
use Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper; 
use Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper; 
use Doctrine\ORM\Tools\Console\ConsoleRunner; 

$console = new Application('My Silex Application', 'n/a'); 
$console->getDefinition()->addOption(new InputOption('--env', '-e', InputOption::VALUE_REQUIRED, 'The Environment name.', 'dev')); 
$console->setDispatcher($app['dispatcher']); 

$console 
    ->register('cache:clear') 
    ->setDescription('Clears the cache') 
    ->setCode(function (InputInterface $input, OutputInterface $output) use ($app) { 

     $cacheDir = $app['cache.path']; 
     $finder = Finder::create()->in($cacheDir)->notName('.gitignore'); 

     $filesystem = new Filesystem(); 
     $filesystem->remove($finder); 

     $output->writeln(sprintf("%s <info>success</info>", 'cache:clear')); 

    }) 
; 

/* 
* Doctrine CLI 
*/ 

$helperSet = new HelperSet(array(
    'db' => new ConnectionHelper($app['orm.em']->getConnection()), 
    'em' => new EntityManagerHelper($app['orm.em']) 
)); 

$console->setHelperSet($helperSet); 
Doctrine\ORM\Tools\Console\ConsoleRunner::addCommands($console); 

return $console; 

bin/console

#!/usr/bin/env php 
<?php 

require_once __DIR__.'/../vendor/autoload.php'; 

set_time_limit(0); 

use Symfony\Component\Console\Input\ArgvInput; 

$input = new ArgvInput(); 
$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev'); 

$app = require __DIR__.'/../src/app.php'; 
require __DIR__.'/../config/'.$env.'.php'; 
$console = require __DIR__.'/../src/console.php'; 
$console->run(); 

src/app.php

<?php 

use Silex\Application; 
use Silex\Provider\AssetServiceProvider; 
use Silex\Provider\TwigServiceProvider; 
use Silex\Provider\ServiceControllerServiceProvider; 
use Silex\Provider\HttpFragmentServiceProvider; 
use Dflydev\Provider\DoctrineOrm\DoctrineOrmServiceProvider; 
use Silex\Provider\DoctrineServiceProvider; 

$app = new Application(); 
$app->register(new ServiceControllerServiceProvider()); 
$app->register(new AssetServiceProvider()); 
$app->register(new TwigServiceProvider()); 
$app->register(new HttpFragmentServiceProvider()); 
$app->register(new DoctrineServiceProvider()); 
$app->register(new DoctrineOrmServiceProvider); 

$app['twig'] = $app->extend('twig', function ($twig, $app) { 
    // add custom globals, filters, tags, ... 

    return $twig; 
}); 

// Doctrine DBAL 
$app['db.options'] = array(
    'driver' => 'pdo_mysql', 
    'host' => 'localhost', 
    'dbname' => 'xxxx', 
    'user' => 'xxxx', 
    'password' => 'xxxx', 
    'charset'  => 'utf8', 
    'driverOptions' => array(1002 => 'SET NAMES utf8',), 
); 

// Doctrine ORM 
$app["orm.em.options"] = array(
    "mappings" => array(
     array(
      'type' => 'annotation', 
      "namespace" => "XYZ\Entity", 
      'path' => __DIR__ .'/XYZ/Entity', 
      "alias" => "AppBundle", 
      'use_simple_annotation_reader' => false 
     ), 
    ), 
); 

return $app; 

composer.json

您需要添加一些依賴:

"symfony/console": "~2.8|3.0.*", 
"doctrine/dbal": "~2.5.4", 
"dflydev/doctrine-orm-service-provider": "^2.0", 

而且finaly執行控制檯:

php bin/console 
php bin/console orm:generate-entities src/ 
相關問題