exylon / fuse

Laravel 工具集合

dev-master 2017-11-23 05:34 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:31:23 UTC


README

该软件仍在积极开发中。使用时请谨慎。

需要具备一定的 Laravel 和软件设计模式知识

Laravel 工具集合

安装

composer require exylon/fuse:dev-master

Artisan 辅助工具

php artisan make:subscriber

根据 Laravel 订阅者创建新的 Subscriber 类

基本用法

$ php artisan make:subscriber AuthEventsSubscriber --event="Illuminate\\Auth\\Events\\Login" --event="Illuminate\\Auth\\Events\\Logout" 

php artisan make:repository

创建新的 repository 类

基本用法

$ php artisan make:repository User --no-interface 

php artisan make:service

创建新的 service 类。

基本用法

$ php artisan make:service UserService -r=UserRepository --crud

辅助函数

str_replace_assoc(array $pairs, $subject)

使用键值对(关联数组)进行字符串替换。

validate(array $data, array $rules)

等同于 \Validator::validate($data, $rules)

str_random_hex($length)

生成指定长度的随机十六进制字符串。

示例: $var = str_random_hex(10) //ffeb09ed56

str_random_int($length, $min = 0, $pad = '0')

生成随机数字字符串。如果生成的数字字符串长度小于 $length,则使用 $pad 进行填充。

示例: $var = str_random_int(5) //01467

proper_case($str,$delimiters = '_')

将字符串转换为正确的标题格式

示例

$var = proper_case('lorem_ipsum_dolor') // Lorem Ipsum Dolor
$var = proper_case('lorem_ipsum-dolor') // Lorem Ipsum-Dolor
$var = proper_case('lorem_ipsum-dolor',['_','-']) // Lorem Ipsum Dolor

辅助特性类

\Exylon\Fuse\Support\Attributes

增强型关联数组。将普通关联数组转换为标准对象

$arr = new Attributes([
              'red'    => 'apple',
              'orange' => 'orange',
              'yellow' => [
                  'mangoes' => 'foo',
                  'pear'    => 'bar'
              ]
          ]);

echo $arr['red']; // "apple"
echo $arr->red; // "apple"

echo $arr['yellow']['mangoes']; // "foo"
echo $arr->yellow->mangoes; // "foo"

处理别名。 注意:当前别名只支持第一层键

$arr = new Attributes([
              'red'    => 'apple',
              'orange' => 'orange',
              'yellow' => [
                  'mangoes' => 'foo',
                  'pear'    => 'bar'
              ]
          ],[ // 'pula' as an alias for 'red'
              'pula'   => 'red'
          ]);

echo $arr['red']; // "apple"
echo $arr->red; // "apple"

echo $arr['pula']; // "apple"
echo $arr->pula; // "apple"

Attributes::toJson($options=0)

将属性转换为 JSON


\Exylon\Fuse\Support\Eloquent\CascadeDelete

在 PHP 端启用级联删除。对于多态关系非常有用。

/*
 * 'Team' model can also have payment methods. That's the reason
 * PaymentMethod is poloymorphic.
 */
class Customer extends Model {
    use CascadeDelete;
    
    protected $cascade = [
        'paymentMethods'
    ];
    
    public function paymentMethods(){
        return $this->morphMany(PaymentMethod::class,'owner');
    }
}
...
$customer->delete(); // this will delete all related payment methods

辅助宏

Request::location()

使用 torann/geoip

\Exylon\Fuse\Support\Attributes {
  #attributes: array [
    "ip" => "127.0.0.0"
    "iso_code" => "PH"
    "country" => "Philippines"
    "city" => "Paranaque"
    "state" => "MNL"
    "state_name" => "Manila"
    "postal_code" => "06510"
    "lat" => 14.471016
    "lon" => 121.01476
    "timezone" => "Asia/Manila"
    "continent" => "NA"
    "currency" => "USD"
    "default" => true
    "cached" => false
  ]
  #aliases: array [
    "country_code" => "iso_code"
    "latitude" => "lat"
    "longitude" => "lon"
    "zip_code" => "postal_code"
  ]
}

Request::agent()

使用 jenssegers/agent

\Exylon\Fuse\Support\Attributes {
  #attributes: array [
    "agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
    "is_mobile" => false
    "is_phone" => false
    "is_tablet" => false
    "device" => "Macintosh"
    "is_desktop" => true
    "platform" => "OS X"
    "is_robot" => false
    "robot" => false
    "browser" => "Chrome"
    "languages" => array:2 [▶]
  ]
}

Builder::forceMake($attributes)

与 Eloquent 模型的 forceCreate 相同,此方法创建模型实例而不进行持久化,避免 MassAssignmentException。 注意:请确保预先验证了属性。

$user = User::forceMake(['name'=>'John Doe']);

FuseSanitizer 门面

根据规则清理数据。

内联规则

$data = [
    'email' =>  '    EXAMPLE@EXAMPLE.COM    '
];
$data = FuseSanitizer::sanitize($data,[
          '*' =>  'trim::string', // Wildcard
          'email' =>  'strtolower' // Applicable only fields named 'email'
      ]); // ['email' => 'example@example.com']

“email”规则仅适用于名为“email”的字段。在此情况下,如果数据中存在“email”字段,则将调用 strtolower

* 表示通配符,使其适用于“任何”字段,但请注意,包含的规则是 trim::string。规则分为三个部分 - 函数参数数据类型 - 由冒号(:)分隔;参数由逗号(,)分隔。默认情况下,数据类型将假设为字符串。在我们的示例中,对于函数 trim 我们不需要任何参数,但我们需要提供一个数据类型,使其仅适用于 string 类型的数据。可用的数据类型有 stringarrayintfloatdouble

内联规则与全局规则

示例

FuseSanitizer::setGlobalRules([
    'email' =>  'trim' 
]);
$data = [
    'email' =>  '    EXAMPLE@EXAMPLE.COM    '
];
$data = FuseSanitizer::sanitize($data,[
          'email' =>  'strtolower'
      ]); // ['email' => 'example@example.com']

规则的优先级顺序如下

  1. 全局通配符
  2. 全局规则
  3. 内联通配符
  4. 内联规则

如果您设置了全局规则,则内联规则是可选的。示例

FuseSanitizer::setGlobalRules([
    'email' =>  ['trim','strtolower']
]);
$data = [
    'email' =>  '    EXAMPLE@EXAMPLE.COM    '
];
$data = FuseSanitizer::sanitize($data); // ['email' => 'example@example.com']

单个值的消毒

示例

$email = FuseSanitizer::sanitizeValue('    EXAMPLE@EXAMPLE.COM    ',['trim','strtolower']); // 'example@example.com'

规则集格式

使用管道(|)分隔的规则
$email = FuseSanitizer::sanitizeValue('    EXAMPLE@EXAMPLE.COM    ','trim|strtolower'); // 'example@example.com'
使用数组
$email = FuseSanitizer::sanitizeValue('    EXAMPLE@EXAMPLE.COM    ', ['trim','strtolower']); // 'example@example.com'
使用回调函数
$email = FuseSanitizer::sanitizeValue('    EXAMPLE@EXAMPLE.COM    ', ['trim',function($value){
    return strtolower($value);
}]); // 'example@example.com'
使用类/方法对
$email = FuseSanitizer::sanitizeValue('    EXAMPLE@EXAMPLE.COM    ', ['trim','App\\Support\\SanitizerHelper@toLower']); // 'example@example.com'

通过 FuseSanitizer::register 扩展回调函数

FuseSanitizer::register('tolower',function($value){
  return strtolower($value);
});
$email = FuseSanitizer::sanitizeValue('    EXAMPLE@EXAMPLE.COM    ', ['trim','tolower']); // 'example@example.com'
FuseSanitizer::register('tolower','App\\Support\\SanitizerHelper@toLower');
$email = FuseSanitizer::sanitizeValue('    EXAMPLE@EXAMPLE.COM    ', ['trim','tolower']); // 'example@example.com'