Get Input Object in Controller
Last section we have learned how to make controller work, now it's time to see how the application receives HTTP request queries and respond.
In Windwalker you may access input queries using Input
object. Below is how it works:
// src/Flower/Controller/Sakuras/GetController.php
class GetController extends AbstractController
{
protected function doExecute()
{
$id = $this->input->get('id');
$token = $this->input->get('token', 'default value');
// Do some stuff
}
}
Get Input at Anywhere
// Use global Ioc class
$input = Ioc::getInput();
// OR use container object
$input = $container->get('input');
// In Controller
$this->input;
Web Input
Input object is a container of web request data and superglobals.
use Windwalker\IO\Input;
$input = new Input;
// To get $_REQUEST['flower']
$input->get('flower', 'default');
// Set value
$input->set('flower', 'sakura');
// Get value from $_POST
$input->post->get('form_data');
The second argument is default value if request params not exists
Filter
Input object use Windwalker Filter package to clean request string, get request data by Input object keeps us away from unsafe string injection.
The default filter type is CMD
. We can use other filter type:
// mysite.com/?flower=<p>to be, or not to be.</p>;
$input->get('flower'); // tobeornottobe (Default cmd filter)
$input->get('flower', 'default_value', InputFilter::STRING); // to be, or not to be
$input->getString('flower'); // to be, or not to be (Same as above, using magic method)
$input->getRaw('flower') // <p>to be, or not to be.</p>
More filter usage please see: Windwalker Filter
Compact and Get Array
Get data as an array.
// mysite.com/?flower[1]=sakura&flower[2]=olive;
$input->getArray('flower'); // Array( [1] => sakura [2] => olive)
// Get array and filter every values
$input->getArray('flower', null, '.', 'int');
Use compact()
method
// mysite.com/?flower=sakura&foo=bar&king=Richard
// Get all request
$input->compact();
// To retrieve values you want
$array(
'flower' => '',
'king' => '',
);
$input->compact($array); // Array( [flower] => sakura [king] => Richard)
// Specify different filters for each of the inputs:
$array(
'flower' => InputFilter::CMD,
'king' => InputFilter::STRING,
);
// Use nested array to get more complicated hierarchies of values
$input->compact(array(
'windwalker' => array(
'title' => InputFilter::STRING,
'quantity' => InputFilter::INTEGER,
'state' => 'integer' // Same as above
)
));
Get And Set Multi-Level
If we want to get value of foo[bar][baz]
, just use get('foo.bar.baz')
:
$value = $input->get('foo.bar.baz', 'default', InputFilter::STRING);
$input->set('foo.bar.baz', $data);
// Use custom separator
$input->get('foo/bar/baz', 'default', 'string', '/');
$input->set('foo/bar/baz', $data, '/');
Get Value From Other Methods
We can get other methods as a new input object.
$post = $input->post;
$value = $post->get('foo', 'bar');
// Other inputs
$get = $input->get;
$put = $input->put;
$delete = $input->delete;
Get SUPER GLOBALS
$env = $input->env;
$session = $input->session;
$cookie = $input->cookie;
$server = $input->server;
$server->get('REMOTE_ADDR'); // Same as $_SERVER['REMOTE_ADDR'];
See: SUPER GLOBALS
Get method of current request:
$method = $input->getMethod();
Json Input
If you send a request with json body or content-type: application/json
, you can use $input->json
to
get JsonInput
and parse json values.
Files and Uploaded
Windwalker Http package convert nested $_FILES
variables to a set of UploadedFileInterface
that we can easily move the uploaded files.
Suppose we have this HTML form.
<form action="..." enctype="multipart/form-data" method="post">
<input type="file" name="flower[sakura]" />
<input type="file" name="flower[rose]" />
<input type="submit" value="submit" />
</form>
Then we get files in controller:
// controller::doExecute()
use Windwalker\Http\Helper\UploadedFileHelper;
/** @var $file UploadedFileInterface */
$file = $this->input->files->get('flower.sakura');
if ($file->getError())
{
throw new \RuntimeException('Upload fail: ' . UploadedFileHelper::getUploadMessage($file->getError()), 500);
}
$dest = WINDWALKER_TEMP . '/uploaded/' . $file->getClientFilename();
try
{
$file->moveTo($temp);
}
catch (\RuntimeException $e)
{
// Handle move error.
}
See Windwalker Http
If you found a typo or error, please help us improve this document.