Khái niệm Filter

Filter là bộ lọc cho ứng dụng web nhằm loại bỏ, cắt gọt các dữ liệu không phù hợp. Cơ bản bộ lọc sẽ biến đổi dữ liệu đầu vào sao cho thích hợp. Ví dụ như những ký tự đặc biệt trong HTML được biến đổi để cho an toàn (như ký tự &).

Đảm bảo thư viện bạn dùng đã tích hợp Filter trước khi sử dụng, nếu chưa sử dụng lệnh composer sau

composer require zendframework/zend-filter

Filter là bộc lọc, mà dữ liệu khi đi qua nó sẽ biến đổi theo yêu cầu của ứng dụng. Để hiểu về thế nào là filter hãy xem ví dụ sau. Trong Zend Framework có sẵn một filter chuẩn là StringToLower mà dữ liệu qua nó thì chữ Hòa sẽ chuyển thành chữ thường.

$str = 'Học Zend Framework';
$strfilter  = new \Zend\Filter\StringToLower();
$str = $strfilter->filter($str);
//Hoặc $str = $strfilter($str);

//học zend framework
echo $str;

Sử dụng StaticFilter

Ngoại cách tạo ra các đối tượng cho bộ lọc muốn sử dụng như trên, bạn có thể sử dụng nhanh bằng lớp sử dụng StaticFilter để khởi tạo bộ lọc và sử dụng luôn.

Cú pháp:

$datafilter = \Zend\Filter\StaticFilter::execute($data, 'NameFilter', $args = []);

NameFilter tên Filter trong hệ thống, xem Danh sách các Filter ở dưới.

$args nếu có là mảng dữ liệu thiết lập tùy từng Filter cụ thể

Ví dụ trên có thể sử lại là:

$str = 'Học Zend Framework';
$str = \Zend\Filter\StaticFilter::execute($str, 'StringToLower');
//học zend framework
echo $str;

Dữ liệu của bạn có thể lọc nhiều lần qua các bộ lọc khác nhau để có được dữ liệu phù hợp.

Danh sách các Filter chuẩn

Trong Zend Framework xây dựng sẵn cho bạn các Filter mà có thể dùng ngay dưới đây, nếu yêu cầu chưa đáp ứng đủ cho bạn thì bạn cần tự xây dựng thêm các Filter riêng trình bày ở dưới.

Alnum Alpha BaseName Blacklist Boolean Callback Compress and Decompress Digits Dir Encrypt and Decrypt HtmlEntities ToInt ToNull NumberFormat NumberParse PregReplace RealPath StringToLower StringToUpper StringTrim StripNewlines StripTags UriNormalize Whitelist

Alnum

Chỉ giữ lại ký tự chữ hoặc số (loại bỏ các ký tự đặc biệt)

echo \Zend\Filter\StaticFilter::execute(
     'Học lập trình (PHP) #Zend Framework 3.x#',
     'Alnum',
     ['allowWhiteSpace'=>true]
);
//Học lập trình PHP Zend Framework 3x

Alpha

Chỉ giữ lại ký tự bảng chữ cái

echo \Zend\Filter\StaticFilter::execute(
     'Học lập trình (PHP) #Zend Framework 3.x#',
     'Alpha',
     ['allowWhiteSpace'=>true]
);
//Học lập trình PHP Zend Framework x

BaseName

Trả về tên cơ sở của file

$filter = new Zend\Filter\BaseName();
print $filter->filter('/vol/tmp/filename'); //filename
print $filter->filter('/vol/tmp/filename.txt'); //filename.txt

Blacklist

Trả về null nếu dữ liệu đưa vào có trong danh sách BlackList, còn nếu không có trả về chính dữ liệu đưa vào.

$blacklist = new \Zend\Filter\Blacklist([
    'list' => ['UK', 'US',]
]);
echo $blacklist->filter('UK'); // => null
echo $blacklist->filter('VN'); // => 'VN'

Boolean

Chuyển dữ liệu nhập vào thành kiểu boolean nhận giá trị false hoặc true.

$filter = new Zend\Filter\Boolean();
$value  = '';
$result = $filter->filter($value);
// returns false

Callback

Nếu bạn có một hàm, một lớp sử lý biến đổi dữ liệu riêng. Giờ muốn sử dụng nó như filter thì dùng CallBack

$filter = new Zend\Filter\Callback('strrev');

print $filter->filter('Hello!');
// returns "!olleH"
// strrev là hàm đảo ký tự của PHP

Nếu callback là một phương thức tĩnh của lớp ví dụ: MyClass::myMethod

$filter = new Zend\Filter\Callback(array('MyClass', 'myMethod'));

Compress / Decompress

Nén / giải nén file, chuỗi, thư mục. Khởi tạo filter này với hai tham số:

  • adapter: Adapter sử dụng (định dạng nén), mặc định là Gz, bạn có thể chọn: Bz2, Gz, Lzf, Rar, Tar, Zip
  • options: Các tùy chọn tùy thuộc vào Adapter.
$filter     = new Zend\Filter\Compress('Bz2');
$compressed = $filter->filter('Uncompressed string');
// Returns the compressed string

Digits

Chỉ giữ lại số.

Dir

Dữ liệu vào là đường dẫn tới file, dữ liệu trả ra là đường dẫn thư mục chứa file.

Encrypt / Decrypt

Mã hóa và giải mã chuỗi. Hỗ trợ Adapter là BlockCipher và openssl

$filter = new Zend\Filter\Encrypt(['adapter' => 'BlockCipher']);
$filter->setKey('encryption key');

$encrypted = $filter->filter('text to be encrypted');
printf ("Encrypted text: %s\n", $encrypted);

HtmlEntities

Chuyển chuỗi thành giá trị biểu diễn mã HTML nếu có thể.

$filter = new Zend\Filter\HtmlEntities();
print $filter->filter('<');

$filter = new Zend\Filter\HtmlEntities(['quotestyle' => ENT_QUOTES]);
$input = "A 'single' and " . '"double"';
print $filter->filter($input); //A 'single' and "double"


$filter = new Zend\Filter\HtmlEntities(['quotestyle' => ENT_COMPAT]);
$input = "A 'single' and " . '"double"';
print $filter->filter($input);//A 'single' and "double"

ToInt

Chuyển dữ liệu thành số nguyên

$filter = new Zend\Filter\ToInt();

print $filter->filter('-4 is less than 0'); //-4

ToNull

Chuyển dữ liệu thành NULL nếu có thể nếu không giữ nguyên giá trị. Điều này cần thiết khi làm việc với database.

$filter = new Zend\Filter\ToNull();
$value  = '';
$result = $filter->filter($value);
// trả về null thay về chuỗi rỗng ''

PregReplace

Tìm và thay thế theo biểu thức chính quy

$filter = new Zend\Filter\PregReplace([
    'pattern'     => '/bob/',
    'replacement' => 'john',
]);
$input  = 'Hi bob!';

$filter->filter($input);
// returns 'Hi john!'

StringToLower / StringToUpper

Chuyển thành chữ thường, chữ Hoa

$filter = new Zend\Filter\StringToLower(['encoding' => 'UTF-8']);
print $filter->filter('SAMPLE');

StringTrim

Cắt các ký tự chỉ ra bắt gặp ở đầu ở cuối chuỗi.

//Bỏ khoảng trắng ở đầu, cuối
$filter = new Zend\Filter\StringTrim();
print $filter->filter(' This is (my) content: ');

//Cắt bỏ các ký tự chỉ ra ở đầu, cuối chuối
$filter = new Zend\Filter\StringTrim(':#$');
// or new Zend\Filter\StringTrim(array('charlist' => ':#$'));
print $filter->filter(' This is (my) content:');

StripNewlines

Loại bỏ ký tự xuống dòng

$filter = new Zend\Filter\StripNewlines();

print $filter->filter(' This is (my)``\n\r``content: ');
//Out:This is (my) content:

StripTags

Loại bỏ các HTML Tag

$filter = new Zend\Filter\StripTags();

print $filter->filter('My content');
//OUT: My content

Whitelist

Trả về null nếu giá trị đưa vào không có trong danh sách

$whitelist = new \Zend\Filter\Whitelist([
    'list' => ['allowed-1', 'allowed-2']
]);
echo $whitelist->filter('allowed-2');   // => 'allowed-2'
echo $whitelist->filter('not-allowed'); // => null

Rename

Đổi tên file, di chuyển file

// Di chuyển các file sang một thư mục khác
$filter = new \Zend\Filter\File\Rename('/tmp/');
echo $filter->filter('./myfile.txt');
// File has been moved to '/tmp/myfile.txt'
// Đổi tên file
$filter = new \Zend\Filter\File\Rename('/tmp/newfile.txt');
echo $filter->filter('./myfile.txt');
// File has been renamed to '/tmp/newfile.txt'

Lọc theo chuỗi FilterChain

FilterChain cho phép bạn tạo ra bộ lọc chứa nhiều filter, dữ liệu sẽ đi qua tất cả các filter này

// Create a filter chain and add filters to the chain
$filterChain = new Zend\Filter\FilterChain();
$filterChain
    ->attach(new Zend\I18n\Filter\Alpha())
    ->attach(new Zend\Filter\StringToLower());

// Filter the username
$username = $filterChain->filter($_POST['username']);

Nếu bạn tự tạo filter cho mình, thì filter được đưa vào chuỗi lọc như sau

$filterChain = new Zend\Filter\FilterChain();
$filterChain->getPluginManager()->setInvokableClass(
    'myNewFilter', 'MyCustom\Filter\MyNewFilter'
);
$filterChain->attachByName('alpha')
            ->attachByName('myNewFilter');

Viết Filter

Đơn giản là triển khai giao diện FilterInterface. Tạo ra filter tên MyFilter

use Zend\Filter\FilterInterface;

class MyFilter implements FilterInterface
{
    public function filter($value)
    {
        // Các đoạn code xử lý dữ liệu $value để trả về $valueFilter của bạn

         return $valueFiltered;

    }
}

Khi áp dụng, sử dụng như các filter khác, ví dụ:

$filterChain = new Zend\Filter\FilterChain();
$filterChain->attach(new Application\Filter\MyFilter());

Đăng ký nhận bài viết mới