Laravel의 맞춤 검증 및 테스트

18681 단어 PHPUnitPHP라라벨
이 기사는 Laravel Advent Calendar 2016의 6 일째 기사입니다.

소개



공식 커스텀 밸리데이션의 문서가 지금 하나 알기 어렵기 때문에, 순서를 정리하기로 했다.
이번에는 샘플로서 후리가나의 검증을 작성한다.

※이전에 쓴 통상 밸리데이션의 응용
ぃ tp // 코 m / 코마 t · ms / 422bc 9847 또는 3 a 79 9

환경


  • CentOS 7
  • PHP 7
  • Laravel 5.3

  • 맞춤 검증 생성 절차



    서비스 제공업체 작성



    php artisan make:provider ValidatorServiceProvider

    작성된 클래스를 다음과 같이 편집.

    app/Providers/ValidatorServiceProvider.php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use Domain\CustomValidator;
    
    class ValidatorServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap the application services.
         *
         * @return void
         */
        public function boot()
        {
          \Validator::resolver(function ($translator, $data, $rules, $messages) {
              return new CustomValidator($translator, $data, $rules, $messages);
          });
        }
    
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
    

    만든 서비스 공급자를 구성 파일에 추가



    config/app.php
    'providers' => [
        ...
    
        App\Providers\ValidatorServiceProvider::class,
    
        ...
    

    사용자 지정 유효성 검사 논리를 작성하는 파일 만들기



    이번에는 domain라는 디렉토리를 만들고 그 아래에 CustomValidator.php를 만들었습니다.

    domain/CustomValidator.php
    namespace Domain;
    
    class CustomValidator extends \Illuminate\Validation\Validator
    {
      /**
      * ふりがなのバリデーション
      *
      * @param $attribute
      * @param $value
      * @param $parameters
      * @return bool
      */
      public function validateKana($attribute, $value, $parameters)
      {
          if (mb_strlen($value) > 100) {
              return false;
          }  
    
          if (preg_match('/[^ぁ-んー]/u', $value) !== 0) {
              return false;
          }
    
          return true;
      }
    }
    

    자동 로드 설정


    composer.json 의 psr-4 설정에 domain 디렉토리 부하를 자동 로드할 수 있도록 추가
    ※이것을 눈치채지 못하고 빠졌다

    composer.json
    ...
    
    "autoload": {
      "psr-4": {
          "App\\": "app/",
          "Domain\\": "domain/",
      }
    }
    
    ...
    

    오류 메시지 파일에 추가



    resources/lang/en/validation.php
    return [
       ...
    
       'kana' => ':attributeはひらがなで入力をしてください。',
    
       ...
    
       'attributes' => [
           ...
    
            'family_name_kana' => 'ふりがな(せい)',
            'given_name_kana'  => 'ふりがな(めい)',
    
           ...
       ],
    

    맞춤 유효성 검사 사용



    사용법은 통상의 밸리데이션과 같고,'family_name_kana' => 'required|kana',와 같이 사용하고 싶은 바리데이션을 | 단락으로 지정하면 된다.

    app/Http/Controllers/RegistersController.php
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    use Validator;
    
    class RegistersController extends Controller
    {
        ...
    
        public function confirm(Request $request, $registerToken)
        {
            \Validator::make(
                [
                    'family_name_kana' => trim($request->get('family_name_kana')),
                    'given_name_kana'  => trim($request->get('given_name_kana')),
                ],
                [
                    'family_name_kana' => 'required|kana',
                    'given_name_kana'  => 'required|kana',
                ]
            }->validate();
        }
        return view('registers/registers_confirm');
    
        ...
    }
    

    밸리데이션 실시 결과




    ふりがな(せい) 가 카타카나로 POST 했으므로, 제대로 걸려 있다.

    테스트 코드 작성



    제대로 유효성을 검사하는 코드를 작성합니다.

    tests/domain/validation/KanaTest.php
    <?php
    
    /**
     * かなのバリデーションのテストクラス
     */
    
    namespace Tests\Domain\Validation;
    
    use Validator;
    
    class KanaTest extends \TestCase
    {
        /**
         * 正常系テスト
         *
         * @dataProvider successParamsProvider
         * @param array $values
         */
        public function testSuccess($values)
        {
            $validator = \Validator::make(
                [
                    'family_name_kana' => $values,
                    'given_name_kana'  => $values,
                ],
                [
                    'family_name_kana' => 'required|kana',
                    'given_name_kana'  => 'required|kana',
                ]
            );
    
            $this->assertTrue(
                $validator->passes()
            );
        }
    
        /**
         * 正常系パラメータ用のデータプロバイダー
         *
         * @return array
         */
        public function successParamsProvider()
        {
            return [
                'ひらがな' => [
                    'やきにくていしょく',
                ],
                '大きな文字列(かなは100文字まで)' => [
                    str_repeat('あ', 100)
                ],
            ];
        }
    
        /**
         * 異常系テスト
         *
         * @dataProvider failParamsProvider
         * かなに不適切な文字が入力されている
         *
         * @param array $values
         */
        public function testFail($values)
        {
            $validator = \Validator::make(
                [
                    'family_name_kana' => $values,
                    'given_name_kana'  => $values,
                ],
                [
                    'family_name_kana' => 'required|kana',
                    'given_name_kana'  => 'required|kana',
                ]
            );
    
            $this->assertTrue(
                $validator->fails()
            );
        }
    
        /**
         * 異常系パラメータ用のデータプロバイダー
         *
         * @return array
         */
        public function failParamsProvider()
        {
            return [
                '数字' => [
                    1,
                ],
                '漢字' => [
                    '焼肉定食',
                ],
                'カタカナ' => [
                    'ヤキニクテイショク',
                ],
                '大きな文字列(かなは100文字まで)' => [
                    str_repeat('あ', 101),
                ],
                'NULL' => [
                    null,
                ],
                '空' => [
                    '',
                ],
                'スクリプト' => [
                    '<script>alert(1);</script>',
                ],
                '\'' => [
                    '\'',
                ],
                '/' => [
                    '/',
                ],
                '<' => [
                    '<',
                ],
                '¥' => [
                    '¥',
                ],
            ];
        }
    }
    

    해설


  • 히라가나, 100 문자 이내인지 테스트하고 있습니다
  • PHPUnit의 데이터 제공업체 라는 기능을 사용하면 간결하게 테스트 코드를 쓸 수 있어, 실패했을 때에 어디에서 실패했는지 알기 쉽다



  • 한 사람



    이것으로 밸리데이션 처리에 관해서는, 거의 대응할 수 있게 되었다.

    좋은 웹페이지 즐겨찾기