【发布时间】:2015-09-02 17:33:24
【问题描述】:
我需要为 Symfony2 应用程序创建一个控制台命令,并且我阅读了文档 here 和 here 尽管我不确定我应该遵循哪些文档。所以这就是我所做的。
- 在
/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\Component\Console\Application;
$application = new Application(); $application->add(new PDOneSyncCommand()); $application->run();
- 在
但是当我通过运行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 文件上的参数吗?我哪里失败了?
【问题讨论】:
-
在您编辑之后,我宁愿使用
ContainerAwareCommand子类来仅运行一项服务。不确定在execute()命令中包含所有这些代码是一种好习惯。我的回答对你有帮助吗? -
@D4V1D 是的,这两个答案都对我有帮助,我正在将代码移至您的代码,并将很快进行测试,如果我有任何问题,会通知您。如果我将控制器注册为服务,我还能将其用作普通控制器吗?我想稍后也从网络后端使用它
-
这很棘手,但可能。告诉我,我会帮助您实现这一目标。
标签: php symfony symfony-2.6 symfony-components symfony-console