fake()에 대해 조사를 진행했습니다.

11712 단어 PHPLaravelLT

$ php artisan help @tetsunosuke

  • 회의장 스폰서 중의 사람
  • PHP 경험치: 15년/Laavel 경험치: 2주
  • 인사경력: 9개월 반 (지금 여기)
  • 연수(워크숍 디자인)
  • 도입
  • 이벤트(회의장 임대!)
  • 개시하다


    참고HTTP Tests에는 다음과 같은 기술이 있습니다. 파일을 생성하고 테스트를 업로드할 수 있음을 알았습니다.
    UploadedFile::fake()->image('avatar.jpg', $width, $height)
                        ->size(100);
    

    수요로 삼다

  • 사이즈 제한 업로드 오류: upload_max_filesize
  • 최대 HTTP POST 크기: post_max_size
  • 당첨을 결정한 상태에서 테스트를 할 수 있다고 한다.
    ...근데 이게 php야.니 따위.htaccess 설정.
    아파치가 아니면 가만히 있을 수도 있어요.

    참고하다

    <?php
    namespace Tests\Feature;
        public function testAvatarUpload()
        {
            Storage::fake('avatars');
            // リファレンスから変更  w:200, h:100, size:1000(kB?) 
            $file = UploadedFile::fake()->image('avatar.jpg', 200, 100)->size(1000);
    
            $response = $this->json('POST', '/avatar', [
                'avatar' => $file,
            ]);
            // ...
        }
    

    업로드된 이미지 보기


    *Controller.php
        public function upload(Request $request)
        {
            // これにより tmp/upload/phpq2D07W のようなファイルができる
            $filename = $request->file->move('tmp/upload');
            return redirect('/');
        }
    

    이렇게


    확실히 w:200h:100입니다.

    파일 크기 봐봐.

    $ wc -c < tmp/upload/phpq2D07W
        1055
    
    어?

    말하기 시작하다


    깜깜한 파일로 종횡 사이즈를 결정하는데 파일 크기를 결정할 수 있나요...?
    (...메타데이터에 쓸모없는 바이트를 쓰시겠습니까?)

    나는 이 파일이 어떻게 Fake를 만드는지 검사했다


    이렇게


    Illuminate/Http/Testing/File.php
        /**
         * Create a new fake image.
         * 略
         * @return \Illuminate\Http\Testing\File
         */
        public static function image($name, $width = 10, $height = 10)
        {
            // デフォルトで `$file = UploadedFile::fake()->image('avatar.jpg');` 
            // したときは 10x10 の画像だった。
    
            return (new FileFactory)->image($name, $width, $height);
        }
    
    

    또 다른 걸 쫓아다니면...


    Illuminate/Http/Testing/FileFactory.php
        /**
         * Generate a dummy image of the given width and height.
         * 略
         */
        protected function generateImage($width, $height, $type)
        {
            return tap(tmpfile(), function ($temp) use ($width, $height, $type) {
                // ...
                // 確かに縦横ベースで画像データを作っている!
                $image = imagecreatetruecolor($width, $height);
                // ...ここでpngにするかjpegにするか変換している処理も
            });
        }
    

    tap이 뭐야?!

    tap(tmpfile(), function () {});
    

    조수 함수!


    Illuminate\Support\helpers.php
    if (! function_exists('tap')) {
        /**
         * Call the given Closure with the given value then return the value.
         * 略
         */
        function tap($value, $callback = null)
        {
            // 略
        }
    }
    


    임시 파일의 생성을 알았습니다.size ()는 어떻게 되었습니까?


    필요한 HTTP 제목 보기


    app/Http/Controllers/HomeController.php
    public function upload(Request $request)
    {
        // header() 引数なしで呼ぶと全部
        // 引数あり、たとえば Content-typeを渡すと
        // application/x-www-form-urlencoded とかが取れる
        $headers = $request->header();
        var_dump($headers);
    }
    

    Content-Length도 없고...

    array(6) {
      'host' =>
      array(1) {
        [0] =>
        string(14) "127.0.0.1:8000"
      }
      'user-agent' =>
      array(1) {
        [0] =>
        string(7) "Symfony" ← へーそうなんだ!!
      }
      'accept' =>
      array(1) {
        [0] =>
        string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
      }
      'accept-language' =>
      array(1) {
        [0] =>
        string(14) "en-us,en;q=0.5"
      }
      'accept-charset' =>
      array(1) {
        [0] =>
        string(30) "ISO-8859-1,utf-8;q=0.7,*;q=0.7"
      }
      'content-type' =>
      array(1) {
        [0] =>
        string(33) "application/x-www-form-urlencoded"
      }
    }
    

    업로드에 대한 데이터를 봅시다.


    tests/Feature/Upload.php
            $file = UploadedFile::fake()->image('avatar.jpg', 200, 100)->size(1000);
            var_dump($file);
    
    class Illuminate\Http\Testing\File#296 (10) {
    ...
      public $sizeToReport => int(1024000)
    ...
    }
    

    파일 크기

    $request->file('file') ->getSize()획득가능.
    app/Http/Controllers/HomeController.php
    public function upload(Request $request)
    {
        // これでアップロードされたファイルサイズに応じた処理ができる
        // $_FILES['file']['size']相当    
        $size = $request->file('file')->getSize(); 
    }
    

    총결산

  • 프레임에 있는 코드를 따라가면 이해할 수 있어요!
  • php.ini 저를 배려하지 못하는 경우도 있는 것 같아요!
  • 이번에는 Dusk의 내부 행동을 조사하고 싶다
  • 여담: Qita의 슬레이드 모드무스.
    $ php artisan follow @tetsunosukeito 
    

    좋은 웹페이지 즐겨찾기