Skip to content

Commit b2e4b22

Browse files
committed
Add 'extension' rule and tests
Usage: ‘extension:pdf,txt’ or ‘extension:.pdf,.txt’
1 parent bb2528d commit b2e4b22

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

src/Rules/Extension.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace Rakit\Validation\Rules;
4+
5+
use Rakit\Validation\Helper;
6+
use Rakit\Validation\Rule;
7+
8+
class Extension extends Rule
9+
{
10+
11+
/** @var string */
12+
protected $message = "The :attribute must be a :allowed_extensions file";
13+
14+
/**
15+
* Given $params and assign the $this->params
16+
*
17+
* @param array $params
18+
* @return self
19+
*/
20+
public function fillParameters(array $params): Rule
21+
{
22+
if (count($params) == 1 && is_array($params[0])) {
23+
$params = $params[0];
24+
}
25+
$this->params['allowed_extensions'] = $params;
26+
return $this;
27+
}
28+
29+
/**
30+
* Check the $value is valid
31+
*
32+
* @param mixed $value
33+
* @return bool
34+
*/
35+
public function check($value): bool
36+
{
37+
$this->requireParameters(['allowed_extensions']);
38+
$allowedExtensions = $this->parameter('allowed_extensions');
39+
foreach($allowedExtensions as $key => $ext){
40+
$allowedExtensions[$key] = ltrim($ext,'.');
41+
}
42+
43+
$or = $this->validation ? $this->validation->getTranslation('or') : 'or';
44+
$allowedExtensionsText = Helper::join(Helper::wraps($allowedExtensions, ".", ""), ', ', ", {$or} ");
45+
$this->setParameterText('allowed_extensions', $allowedExtensionsText);
46+
47+
$ext = strtolower(pathinfo($value, PATHINFO_EXTENSION));
48+
return ($ext && in_array($ext, $allowedExtensions)) ? true : false;
49+
}
50+
}

src/Validator.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ protected function registerBaseValidators()
140140
'ip' => new Rules\Ip,
141141
'ipv4' => new Rules\Ipv4,
142142
'ipv6' => new Rules\Ipv6,
143+
'extension' => new Rules\Extension,
143144
'array' => new Rules\TypeArray,
144145
'same' => new Rules\Same,
145146
'regex' => new Rules\Regex,

tests/Rules/ExtensionTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Rakit\Validation\Tests;
4+
5+
use Rakit\Validation\Rules\Extension;
6+
use PHPUnit\Framework\TestCase;
7+
8+
class ExtensionTest extends TestCase
9+
{
10+
11+
public function setUp()
12+
{
13+
$this->rule = new Extension;
14+
}
15+
16+
public function testValids()
17+
{
18+
$this->assertTrue($this->rule->fillParameters(['pdf','png','txt'])->check('somefile.txt'));
19+
$this->assertTrue($this->rule->fillParameters(['.pdf','.png','.txt'])->check('somefile.txt'));
20+
$this->assertTrue($this->rule->fillParameters(['pdf','png','txt'])->check('path/to/somefile.txt'));
21+
$this->assertTrue($this->rule->fillParameters(['pdf','png','txt'])->check('./absolute/path/to/somefile.txt'));
22+
$this->assertTrue($this->rule->fillParameters(['pdf','png','txt'])->check('https://site.test/somefile.txt'));
23+
}
24+
25+
public function testInvalids()
26+
{
27+
$this->assertFalse($this->rule->fillParameters(['pdf','png','txt'])->check(''));
28+
$this->assertFalse($this->rule->fillParameters(['pdf','png','txt'])->check('.dotfile'));
29+
$this->assertFalse($this->rule->fillParameters(['pdf','png','txt'])->check('notafile'));
30+
$this->assertFalse($this->rule->fillParameters(['pdf','png','txt'])->check('somefile.php'));
31+
$this->assertFalse($this->rule->fillParameters(['.pdf','.png','.txt'])->check('somefile.php'));
32+
}
33+
}

0 commit comments

Comments
 (0)