Skip to content

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;
    }
}

Clone this wiki locally