PEAR: Console_CommandLine #5 – 사용자 정의

특별한 형식을 가진 옵션을 받는 경우가 종종 있습니다. 예를 들면 IP 같은 것 말입니다. 보통의 경우 IP를 문자열로 받은 후에 문자열이 올바른 IP인지 검사를 합니다만, PEAR Console_CommandLine에서는 Action을 사용자 정의하여 조금 더 깔끔하고 통일된 형태로 이를 처리 할 수 있습니다.

소스 코드를 설명드리기 전에 첫번째 글에서 보여드렸던 Composer로 PEAR 패키지를 설치하는 방식 대신에 Packagist를 통해 설치하는 것을 보여드리려고 합니다.

$ composer require pear/console_commandline

위의 명령은 다음과 같은 내용을 가진 composer.json을 생성합니다.

{
    "require": {
        "pear/console_commandline": "^1.2"
    }
}

composer를 통해 CommandLine을 설치했으면, 이제 옵션으로 IP를 입력받는 예제 소스 코드를 살펴 보도록 하겠습니다.

<?php

require 'vendor/autoload.php';

class ActionIP extends Console_CommandLine_Action
{
    public function execute($value=false, $params=array())
    {
        if (ip2long($value) === false) {
            throw new Exception('Invalid IP');
        }
        $this->setResult($value);
    }
}

Console_CommandLine::registerAction('StoreIP', 'ActionIP');

$parser = new Console_CommandLine();
$parser->addOption(
    'ip',
    array(
        'short_name'  => '-i',
        'long_name'   => '--ip',
        'description' => 'IP Address',
        'help_name'   => 'IP',
        'action'      => 'StoreIP'
    )
);

try {
    $result = $parser->parse();
    print_r($result->options);
} catch (Exception $e) {
    $parser->displayError($e->getMessage());
};

우선 액션을 정의하기 위해서는 Console_CommandLine_Action 클래스를 상속받은 클래스를 하나 정의해야 합니다. 여기서는 일관성을 위해 Action으로 시작하는 ActionIP 클래스를 정의 해 보겠습니다. 이 클래스는 publicexecute 메소드를 정의해야 합니다. execute 메소드는 옵션의 값을 첫번째 파라미터 $value로 넘겨줍니다. 이 value를 검사하고, 필요하다면 적절히 변형하여 $this->setResult($value)를 통해 값을 저장하면 내장된 다른 Store 계열 액션들과 마찬가지로 사용 할 수 있게 됩니다.

액션을 처리 할 클래스를 정의했다면 이 클래스를 Consol_CommandLine에 등록을 시켜주어야 합니다. 이를 처리하는 정적 메소드는 Console_CommandLine::registerAction으로 첫번째는 옵션을 정의 할 때 쓸 액션의 이름을 받고, 두번째는 액션을 정의한 클래스명을 받습니다.

이렇게 액션을 처리하는 클래스를 정의하고 이를 등록시켜 준 후, 내장된 액션들처럼 자유롭게 사용이 가능해집니다.