首页 > 解决方案 > laravel 6 中的数据屏蔽

问题描述

如何在 laravel 刀片中输出某些输入之前屏蔽它们?我在 App\helpers.php 中创建了一个函数来屏蔽电子邮件 ID,同时在刀片中输出它。由于我有会员网站,因此字符掩码将根据用户的特定条件应用。

function mask_email($email, $masks = 15) {
    $array = explode("@", $email);
    $string_length = strlen($array[0]);
    if ($string_length < $masks)
        $masks = $string_length;
    $result = substr($array[0], 0, -$masks) . str_repeat('x', $masks);
    return $result."@".$array[1];
}

有没有比我正在做的更有效的方法?

标签: phplaraveldata-masking

解决方案


1)掩蔽

所以我假设你想要做的是将之前的每个字符替换@x?

你可以用Str助手类来做到这一点

$prefix       = Str::before($user->email, '@');
$replacement  = str_repeat('x', strlen($prefix));
$domain       = Str::after($user->email, '@');
$masked_email = $replacement . '@' . $domain;

2)介绍

Laracasts/Presenter是您可能会发现有用的一个方便的包,它充当模型的表示层。

User模型为例,您可以在UserPresenter

namespace App\Presenters;

use Laracasts\Presenter\Presenter;

class UserPresenter extends Presenter
{
    public function maskedEmail()
    {
        $prefix       = Str::before($user->entity->email, '@');
        $replacement  = str_repeat('x', strlen($prefix));
        $domain       = Str::after($user->entity->email, '@');
        $masked_email = $replacement . '@' . $domain;

        return $masked_email ;
    }
}

如果您要呈现给定用户的电子邮件,您可以在刀片模板中执行此操作:

{{ $user->present()->maskedEmail }}

3)摘要演讲者

如果您有多个演示者使用相同的方法,您可能需要考虑AbstractPresenter这样做:

AbstractPresenter.php

namespace App\Presenters;

use Laracasts\Presenter\Presenter;

abstract class AbstractPresenter extends Presenter
{
    public function maskedEmail()
    {
        ...
    }
}

namespace App\Presenters;

use App\Presenters\AbstractPresenter;

class AbstractPresenter extends AbstractPresenter
{

}


推荐阅读