我需要为 Symfony2 应用程序创建一个控制台命令,我在这里和这里阅读了文档,尽管我不确定我应该遵循哪些。所以这就是我所做的。
- 在下创建一个文件
/src/PDI/PDOneBundle/Console/PDOneSyncCommand.php
写下这段代码:
namespace PDI\PDOneBundle\Console\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class PDOneSyncCommand extends Command { protected function configure() { $this ->setName('pdone:veeva:sync') ->setDescription('Some description'); } protected function execute(InputInterface $input, OutputInterface $output) { $name = $input->getArgument('name'); if ($name) { $text = 'Hello '.$name; } else { $text = 'Hello'; } if ($input->getOption('yell')) { $text = strtoupper($text); } $output->writeln($text); } }
- 在下创建一个文件
/bin
写下这段代码:
!/usr/bin/env php
需要 __ DIR __ .'/vendor/autoload.php';
使用 PDI\PDOneBundle\Console\Command\PDOneSyncCommand;使用 Symfony\组件\控制台\应用程序;
$应用程序=新应用程序();$application->add(new PDOneSyncCommand()); $应用程序->运行();
- 在下创建一个文件
php app/console --shell
但是当我通过运行并点击进入控制台时,ENTER
我看不到注册的命令,我错过了什么?
注意:比我更有经验的人可以正确格式化第二段代码吗?
更新 1
好的,按照建议并以答案为起点,我构建了这段代码:
protected function execute(InputInterface $input, OutputInterface $output)
{
$container = $this->getContainer();
$auth_url = $container->get('login_uri')."/services/oauth2/authorize?response_type=code&client_id=".$container->get('client_id')."&redirect_uri=".urlencode($container->get('redirect_uri'));
$token_url = $container->get('login_uri')."/services/oauth2/token";
$revoke_url = $container->get('login_uri')."/services/oauth2/revoke";
$code = $_GET['code'];
if (!isset($code) || $code == "") {
die("Error - code parameter missing from request!");
}
$params = "code=".$code
."&grant_type=".$container->get('grant_type')
."&client_id=".$container->get('client_id')
."&client_secret=".$container->get('client_secret')
."&redirect_uri=".urlencode($container->get('redirect_uri'));
$curl = curl_init($token_url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
$json_response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($status != 200) {
die("Error: call to token URL $token_url failed with status $status, response $json_response, curl_error ".curl_error(
$curl
).", curl_errno ".curl_errno($curl));
}
curl_close($curl);
$response = json_decode($json_response, true);
$access_token = $response['access_token'];
$instance_url = $response['instance_url'];
if (!isset($access_token) || $access_token == "") {
die("Error - access token missing from response!");
}
if (!isset($instance_url) || $instance_url == "") {
die("Error - instance URL missing from response!");
}
$output->writeln('Access Token ' . $access_token);
$output->writeln('Instance Url ' . $instance_url);
}
但是每当我调用任务时,我都会收到此错误:
[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException] 你请求了一个不存在的服务“login_uri”。
为什么?我不能访问parameter.yml
文件中的参数吗?我在哪里失败?