<?php
|
|
namespace SparkLib\Application\Environment;
|
|
|
|
use \SparkLib\Application\Environment;
|
|
use \SparkLib\Application\Request\Get;
|
|
use \SparkLib\Application\Request\Post;
|
|
use \SparkLib\Application\Request\Head;
|
|
use \SparkLib\Application\Request\Delete;
|
|
|
|
/**
|
|
* An application environment for the command line. Mangles ARGV,
|
|
* STDIN, etc., into objects that can be treated by Application more
|
|
* or less the same way it treats data from HTTP requests.
|
|
*
|
|
* See comments on Environment\HTTP for more detailed rationale.
|
|
*
|
|
* Arguments work like so:
|
|
*
|
|
* $ executable
|
|
* $ executable controller
|
|
* $ executable controller action
|
|
* $ executable controller action param1=val param2=val ...
|
|
*
|
|
* Which should correspond almost exactly to:
|
|
*
|
|
* /index.php
|
|
* /index.php/controller
|
|
* /index.php/controller/action
|
|
* /index.php/controller/action?param1=val
|
|
*
|
|
*/
|
|
class CLI extends Environment {
|
|
|
|
protected $_keyvalpat = '/
|
|
(?<key> .*?)
|
|
=
|
|
(?<val> .*)
|
|
/x';
|
|
|
|
protected $_flagpat = '/
|
|
^-+
|
|
(?<flag> [a-z]+)
|
|
/xi';
|
|
|
|
protected $_flags = [];
|
|
|
|
public function __construct ()
|
|
{
|
|
global $argv;
|
|
$script = array_shift($argv);
|
|
|
|
$request = [];
|
|
$path_arr = [];
|
|
$argc = 1;
|
|
|
|
foreach ($argv as $arg) {
|
|
|
|
$matches = [];
|
|
if (preg_match($this->_keyvalpat, $arg, $matches)) {
|
|
|
|
// handle pulling key/values into the "request"
|
|
$request[ $matches['key'] ] = $matches['val'];
|
|
|
|
} else if (preg_match($this->_flagpat, $arg, $matches)) {
|
|
|
|
// set some bits for --flag style flags
|
|
$this->_flags[ $matches['flag'] ] = true;
|
|
|
|
} else if (count($path_arr) >= 2) {
|
|
|
|
$request['arg' . ($argc++)] = $arg;
|
|
|
|
} else {
|
|
|
|
// tack other strings on to path
|
|
$path_arr[] = $arg;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// we need a leading slash and a slash-separated path
|
|
// for all the routing crap:
|
|
$this->_path = implode('/', $path_arr);
|
|
|
|
// if we have a path, but it doesn't start with a leading slash,
|
|
// add one:
|
|
if (strlen($this->_path)) {
|
|
if ($this->_path[0] !== '/') {
|
|
$this->_path = '/' . $this->_path;
|
|
}
|
|
}
|
|
|
|
// set up a Request object
|
|
switch ($this->method()) {
|
|
case 'GET' : $this->_req = new Get($request); break;
|
|
case 'POST' : $this->_req = new Post($request); break;
|
|
case 'DELETE' : $this->_req = new Delete($request); break;
|
|
case 'HEAD' : $this->_req = new Head($request); break;
|
|
default : $this->_req = new Get($request);
|
|
}
|
|
}
|
|
|
|
public function method ()
|
|
{
|
|
// silly, liable to break:
|
|
if (isset($this->_flags['get'])) return 'GET';
|
|
if (isset($this->_flags['post'])) return 'POST';
|
|
if (isset($this->_flags['delete'])) return 'DELETE';
|
|
if (isset($this->_flags['head'])) return 'HEAD';
|
|
|
|
// silly default:
|
|
return 'GET';
|
|
}
|
|
|
|
/**
|
|
* For now, just fake a session.
|
|
*/
|
|
public function startSession ()
|
|
{
|
|
$GLOBALS['_SESSION'] = [];
|
|
}
|
|
|
|
/**
|
|
* End the current session.
|
|
*/
|
|
public function endSession ()
|
|
{
|
|
$GLOBALS['_SESSION'] = array();
|
|
}
|
|
|
|
public function header ($header)
|
|
{
|
|
return;
|
|
}
|
|
|
|
}
|