-
Notifications
You must be signed in to change notification settings - Fork 0
Example of using FileUpload on BEAR.Sunday
Akihito Koriyama edited this page Nov 18, 2024
·
1 revision
<?php
declare(strict_types=1);
namespace MyVendor\Spike\Resource\Page;
use BEAR\Resource\ResourceInterface;
use Koriym\FileUpload\FileUpload;
use MyVendor\Spike\Injector;
use PHPUnit\Framework\TestCase;
use function assert;
use function dirname;
class IndexTest extends TestCase
{
private ResourceInterface $resource;
private array $originalFiles;
protected function setUp(): void
{
$injector = Injector::getInstance('app');
$this->resource = $injector->getInstance(ResourceInterface::class);
$this->originalFiles = $_FILES;
}
protected function tearDown(): void
{
$_FILES = $this->originalFiles;
}
public function testOnPost(): void
{
$fileUpload = FileUpload::fromFile(dirname(__DIR__, 2) . '/fixture/test.jpg');
$files = $fileUpload->toArray();
$_FILES = ['files' => $files]; // $_FILESに依存したテストを実行可能に
$ro = $this->resource->post('page://self/index', ['files' => $files]);
assert($ro instanceof Index);
$this->assertSame(200, $ro->code);
$this->assertSame('image/jpeg', $ro->body['fileType']);
}
}
declare(strict_types=1);
namespace MyVendor\Spike\Resource\Page;
use BEAR\Resource\Annotation\JsonSchema;
use BEAR\Resource\ResourceObject;
use Ray\Di\Di\Inject;
use Ray\Di\Di\Named;
use Ray\WebContextParam\Annotation\FilesParam;
use Ray\WebFormModule\FormInterface;
use RuntimeException;
/**
* @psalm-import-type FileUpload from \Koriym\FileUpload\FileUpload
*/
class Index extends ResourceObject
{
/** @param FileUpload $files */
#[JsonSchema(schema: 'image.json', params: 'image.post.json')]
public function onPost(
#[FilesParam(key: 'files')] ?array $files = null,
): ResourceObject {
$this->body = [
'fileType' => $files['type'], // $files($_FILES)はarrayですがFileUploadとして型が付けられているのでIDEで補完され、静的解析でも適切に扱われます。
];
}
return $this;
}
}