Laravel选择命令数字键

时间:2016-10-03 09:37:56

标签: laravel symfony console command

我试图使用"选择" Laravel / Symfony提供的功能作为控制台的一部分,在数字索引方面存在问题。

我试图模拟HTML select元素的行为,因为你显示了字符串值,但实际上却找回了一个关联的ID,而不是字符串。

示例 - 不幸的是,$ choice始终是名称,但我想要ID

<?php

namespace App\Console\Commands;

use App\User;
use Illuminate\Console\Command;

class DoSomethingCommand extends Command
{
    protected $signature = 'company:dosomething';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $choice = $this->choice("Choose person", [
            1    =>    'Dave',
            2    =>    'John',
            3    =>    'Roy'
        ]);
    }
}

解决方法 - 如果我为人员ID添加前缀,那么它是否有效,但希望还有其他方法,或者这只是库的限制?

<?php

namespace App\Console\Commands;

use App\User;
use Illuminate\Console\Command;

class DoSomethingCommand extends Command
{
    protected $signature = 'company:dosomething';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $choice = $this->choice("Choose person", [
            "partner-1"    =>    'Dave',
            "partner-2"    =>    'John',
            "partner-3"    =>    'Roy'
        ]);
    }
}

4 个答案:

答案 0 :(得分:5)

我有同样的问题。我将实体列为选项,ID为键,标签为值。我认为这是非常常见的情况,所以很惊讶地发现没有太多关于这种限制的信息。

问题是控制台将根据$choices数组是否为关联数组来决定是否将该键用作值。它通过检查choices数组中是否至少有一个字符串键来确定这一点 - 所以抛出一个伪造的选择是一种策略。

$choices = [
  1 => 'Dave',
  2 => 'John',
  3 => 'Roy',
  '_' => 'bogus'
];

注意: 您无法将密钥转换为字符串(即使用"1"而不是1)因为PHP将始终强制转换字符串表示形式当用作数组键时,int为true int。

我采用的工作是扩展ChoiceQuestion类并向其添加属性$useKeyAsValue,以强制将一个键用作值,然后覆盖{{ 1}}尊重此属性的方法。

ChoiceQuestion::isAssoc()

这个解决方案有点风险。它假设class ChoiceQuestion extends \Symfony\Component\Console\Question\ChoiceQuestion { /** * @var bool|null */ private $useKeyAsValue; public function __construct($question, array $choices, $useKeyAsValue = null, $default = null) { $this->useKeyAsValue = $useKeyAsValue; parent::__construct($question, $choices, $default); } protected function isAssoc($array) { return $this->useKeyAsValue !== null ? (bool)$this->useKeyAsValue : parent::isAssoc($array); } } 仅用于确定如何处理选择数组。

答案 1 :(得分:2)

我有同样的问题。似乎库中没有此选项。我通过将索引或id与数组中的值连接起来解决了这个问题。例如

$choices = [
    1 => 'Dave-1',
    2 => 'John-2',
    3 => 'Roy-3'
];
$choice = $this->choice('Choose',$choices);

然后在'-'之后得到部分

$id = substr( strrchr($choice, '-'), 1);;

答案 2 :(得分:0)

其他答案是正确的。问题在于,对于-> ask()函数是否将返回数组的索引或值,没有基于参数的控制。

但是一种简单的方法是使用chr()函数在字母和数字之间转换...类似

$choices[chr($i + 97)] = "this is actually option number $i";
$choice_mapper[chr($i + 97] = $what_you_really_want[$i];

\\later

$choice_letter = $this->choice('Choose',$choices);
$what_i_really_wanted = $choice_mapper[$choice_letter];

HTH,

-FT

答案 3 :(得分:0)

这可能是最好的选择,但也许不是最好的选择,但是如果您做的事情确实很简单,那么:

$options = [
    1 => 'Dave',
    2 => 'John',
    3 => 'Roy',
];

$choice = array_search(
    $this->choice('Choose person', $options),
    $options
);