Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
42.86% covered (warning)
42.86%
6 / 14
33.33% covered (danger)
33.33%
2 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
Define
42.86% covered (warning)
42.86%
6 / 14
33.33% covered (danger)
33.33%
2 / 6
28.66
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 getLimitSize
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAllowExtensions
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 make
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 isAllowExtension
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
2.15
 isUnderSizeLimit
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
2.15
1<?php
2
3/**
4 * @license MIT
5 * @author hazuki3417<hazuki3417@gmail.com>
6 * @copyright 2023 hazuki3417 all rights reserved.
7 */
8
9namespace Selen\File\Validate;
10
11use Selen\Str\SizeParser;
12
13/**
14 * ファイルバリデーションの設定・検証を提供するクラスです。
15 */
16class Define
17{
18    /** @var string|null ファイルサイズ上限 */
19    private string|null $limitSize;
20    /** @var string[] 許容する拡張子 */
21    private array $allowExtensions;
22
23    /**
24     * バリデーション定義を作成します。
25     *
26     * @param string|null $limitSize          ファイルサイズの上限を指定します
27     * @param string      ...$allowExtensions 許容する拡張子を指定します。
28     */
29    private function __construct(string $limitSize = null, string ...$allowExtensions)
30    {
31        if (\is_string($limitSize)) {
32            if (!SizeParser::validParse($limitSize)) {
33                throw SizeParser::makeParseException();
34            }
35        }
36
37        $this->limitSize       = $limitSize;
38        $this->allowExtensions = $allowExtensions;
39    }
40
41    /**
42     * ファイルサイズの上限値(byte)を取得します
43     *
44     * @return string|null ファイルサイズの上限値を返します
45     */
46    public function getLimitSize()
47    {
48        return $this->limitSize;
49    }
50
51    /**
52     * 許容する拡張子を取得します
53     *
54     * @return string[] 許容する拡張子を返します
55     */
56    public function getAllowExtensions()
57    {
58        return $this->allowExtensions;
59    }
60
61    /**
62     * バリデーション定義を作成します。
63     *
64     * @param string|null $limitSize       ファイルサイズの上限を指定します。指定しない場合はnullを指定します。
65     * @param string      $allowExtensions 許容する拡張子を指定します
66     */
67    public static function make(string $limitSize = null, string ...$allowExtensions): Define
68    {
69        return new self($limitSize, ...$allowExtensions);
70    }
71
72    /**
73     * 許可されたファイル拡張子かどうか確認します。
74     *
75     * @param string $filePath ファイルパスを渡します
76     *
77     * @return bool 許可されたファイル拡張子の場合はtrueを、それ以外の場合はfalseを返します。
78     *
79     * NOTE: $allowExtensionsを指定しなかった場合($allowExtensions = [])は常にtrueを返します。
80     */
81    public function isAllowExtension(string $filePath): bool
82    {
83        if ($this->allowExtensions === []) {
84            return true;
85        }
86
87        return \in_array(pathinfo($filePath, PATHINFO_EXTENSION), $this->allowExtensions, true);
88    }
89
90    /**
91     * 指定されたファイルサイズ上限以下であるか確認します。
92     *
93     * @param string $filePath ファイルパスを渡します
94     *
95     * @return bool 指定されたファイルサイズ上限以下であればtrueを、それ以外の場合はfalseを返します。
96     *
97     * NOTE: $limitSizeを指定しなかった場合($limitSize = null)は常にtrueを返します。
98     */
99    public function isUnderSizeLimit(string $filePath): bool
100    {
101        if ($this->limitSize === null) {
102            return true;
103        }
104        return \filesize($filePath) <= SizeParser::toByte($this->limitSize);
105    }
106}