标签归档:laravel

laravel 缓存配置之后出现 __set_state 错误的解决办法

当使用 php artisan config:cache 后,出现:

Call to undefined method Closure::__set_state()

经过排查,是配置文件(config 目录下)中使用了闭包(函数),我的例子是使用 laravel-sms 时,遇到以下代码:

/*
    |--------------------------------------------------------------------------
    | 验证码短信通用内容
    |--------------------------------------------------------------------------
    |
    | 如需缓存配置,则需使用 `Toplan\Sms\SmsManger::closure($closure)` 方法进行配置
    |
    */
'content' => function ($code, $minutes, $input) {
    return '【signature】您的验证码是' . $code . ',有效期为' . $minutes . '分钟,请尽快验证。';
},

为了解决该问题,按照配置中的提示,修改为以下代码即可:

'content' => Toplan\Sms\SmsManager::closure(function ($code, $minutes, $input) {
    return '【signature】您的验证码是' . $code . ',有效期为' . $minutes . '分钟,请尽快验证。';
}),

注意: 提示中的单词 Manager 拼错了,少写了一个 a

余下配置中还有其他的闭包函数,使用相同的方法修改。

laravel-mix 依赖问题的解决办法

laravel-mix 使用 extract 分离组件后出现 Bootstrap’s JavaScript requires jQuery,解决办法是:在 webpack.mix.jsextract() 后添加:

.autoload({
        jquery: ['$', 'jQuery', 'jquery'],
    })

Laravel 模型触发 deleting/deleted 事件的方法

// 这样是不行的
User::where('id', 1)->delete();
// 这样是可行的,不推荐
$user = User::find(1);
$user->delete();
// 这也也可以,推荐:
User::where('id', 1)->get()->each->delete();
// 或者
User::destroy(1);
User::destroy([1, 2]);

Laravel Request 类里 get() 和 input() 的区别

同样一个post请求,以 form-data 的形式传送一个数据 title 的时候,get('title')input('title') 都可以取到。

但是以 json 的形式传送的时候,get('title') 得到的是 null,而 input('title') 却可以正确的取到值。

对于 GET 请求,get()input() 方法都可以取到相同的值。

get()input() 的方法的实现类其实并不一样。

get() 在:

Symfony\Component\HttpFoundation

input() 在:

Illuminate\Http

官方推荐使用 input

laravel 中怎样在 request 类中使用 sometimes 验证

public function withValidator($validator)
{
    // 有企业ID时必须是企业身份
    $validator->sometimes('group', 'in:1', function ($input) {
        return $input->company_id;
    });
    // 没有企业ID时必须是管理员身份(管理员必须没有企业ID)
    $validator->sometimes('group', 'in:2', function ($input) {
        return !$input->company_id;
    });
}

Laravel 验证规则中的 exists 和 unique 应该怎么使用

exists:table,column

验证字段的值是否存在于数据库指定表的指定列中,如果不存在将会抛出异常,这里是关于 exists 规则的 详细说明

基本用法

验证 users 表中是否存在 email 等于指定的 email 值的记录

  • 'email' => 'exists:users'
  • Rule::exists('users')

自定义列名

验证 users 表的 email_address

  • 'email' => 'exists:users,email_address'
  • Rule::exists('users','email_address')

自定义数据库连接

验证指定数据库连接的 users 表

  • 'email' => 'exists:connection.users,email'

附加 WHERE 条件(可以有多个)

除了验证 email_address 还需要验证 role 等于 admin

  • 'email' => 'exists:users,email_address,role,admin'
  • Rule::exists('users','email_address')->where('role','admin')

! 表示不等于

  • 'email' => 'exists:users,email_address,role,!admin'
  • Rule::exists('users','email_address')->whereNot('role','admin')

NULL 在 MySQL 中是通过 IS 判断的,这里注意不用 IS

  • 'email' => 'exists:users,email,deleted_at,NULL'
  • Rule::exists('users','email_address')->whereNull('deleted_at')

对不等于 NULL 的情况不能使用 !,而是使用 NOT_NULL

  • 'email' => 'exists:users,email,deleted_at,NOT_NULL'
  • Rule::exists('users','email_address')->whereNotNull('deleted_at')

unique:table,column,except,idColumn

验证字段的值在数据库指定表的指定列中是否唯一,如果不唯一将会抛出异常,这里是关于 unique 规则的 详细说明

基本用法

验证指定的 email 值在 users 表的 email 中是否唯一

  • 'email' => 'unique:users '
  • Rule::unique('users')

自定义列名

验证 users 表的 email_address

  • 'email' => 'unique:users,email_address'
  • Rule::unique('users','email_address')

自定义数据库连接

验证指定数据库连接的 users 表

  • 'email' => 'unique:connection.users,email_address'

排除某条记录

排除 users 表中 id 等于 $userId 的记录,使用场景是用户修改 email 时,需要验证自身除外的其他用户是否已使用了该 email

  • 'email' => 'unique:users,email_address,'.$userId
  • Rule::unique('users','email_address')->ignore($userId)

排除时指定 primary_key

排除 users 表中 user_id 等于 $userId 的记录

  • 'email' => 'unique:users,email_address,'.$userId.',user_id'
  • Rule::unique('users','email_address')->ignore($userId,'user_id')

附加 WHERE 条件(和 exists 的 WHERE 条件相同)

由于排除是在 WHERE 条件之前的,如果指定了 WHERE 条件,但是没有指定排除,需要把第三个参数设为 NULL

  • 'email' => 'unique:users,email_address,NULL,id,role,admin'
  • Rule::unique('users','email_address')->where($role,'admin')

Laravel 5.4: Specified key was too long error

Laravel 5.4 made a change to the default database character set, and it’s now utf8mb4 which includes support for storing emojis. This only affects new applications and as long as you are running MySQL v5.7.7 and higher you do not need to do anything.

For those running MariaDB or older versions of MySQL you may hit this error when trying to run migrations:

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

As outlined in the Migrations guide to fix this all you have to do is edit your AppServiceProvider.php file and inside the boot method set a default string length:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

After that everything should work as normal. If you enjoyed this post be sure and join the weekly Laravel newsletter and never miss out on new releases, framework tips, and new tutorials.

Laravel 中 validation 验证应该怎么设置中文信息提示

首先复制 resources\lang\en 目录下边的 validation.php到新建的文件夹zh-cn中,用下面代码替换之前的代码,在 attributes 中设置字段,最后设置config下的app.php中修改 'locale' => 'zh-cn'

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted'             => ':attribute必须接受',
    'active_url'           => ':attribute必须是一个合法的 URL',
    'after'                => ':attribute 必须是 :date 之后的一个日期',
    'after_or_equal'       => ':attribute 必须是 :date 之后或相同的一个日期',
    'alpha'                => ':attribute只能包含字母',
    'alpha_dash'           => ':attribute只能包含字母、数字、中划线或下划线',
    'alpha_num'            => ':attribute只能包含字母和数字',
    'array'                => ':attribute必须是一个数组',
    'before'               => ':attribute 必须是 :date 之前的一个日期',
    'before_or_equal'      => ':attribute 必须是 :date 之前或相同的一个日期',
    'between'              => [
        'numeric' => ':attribute 必须在 :min 到 :max 之间',
        'file'    => ':attribute 必须在 :min 到 :max KB 之间',
        'string'  => ':attribute 必须在 :min 到 :max 个字符之间',
        'array'   => ':attribute 必须在 :min 到 :max 项之间',
    ],
    'boolean'              => ':attribute 字符必须是 true 或 false',
    'confirmed'            => ':attribute 二次确认不匹配',
    'date'                 => ':attribute 必须是一个合法的日期',
    'date_format'          => ':attribute 与给定的格式 :format 不符合',
    'different'            => ':attribute 必须不同于 :other',
    'digits'               => ':attribute必须是 :digits 位.',
    'digits_between'       => ':attribute 必须在 :min 和 :max 位之间',
    'dimensions'           => ':attribute具有无效的图片尺寸',
    'distinct'             => ':attribute字段具有重复值',
    'email'                => ':attribute必须是一个合法的电子邮件地址',
    'exists'               => '选定的 :attribute 是无效的.',
    'file'                 => ':attribute必须是一个文件',
    'filled'               => ':attribute的字段是必填的',
    'image'                => ':attribute必须是 jpeg, png, bmp 或者 gif 格式的图片',
    'in'                   => '选定的 :attribute 是无效的',
    'in_array'             => ':attribute 字段不存在于 :other',
    'integer'              => ':attribute 必须是个整数',
    'ip'                   => ':attribute必须是一个合法的 IP 地址。',
    'json'                 => ':attribute必须是一个合法的 JSON 字符串',
    'max'                  => [
        'numeric' => ':attribute 的最大长度为 :max 位',
        'file'    => ':attribute 的最大为 :max',
        'string'  => ':attribute 的最大长度为 :max 字符',
        'array'   => ':attribute 的最大个数为 :max 个.',
    ],
    'mimes'                => ':attribute 的文件类型必须是 :values',
    'min'                  => [
        'numeric' => ':attribute 的最小长度为 :min 位',
        'file'    => ':attribute 大小至少为 :min KB',
        'string'  => ':attribute 的最小长度为 :min 字符',
        'array'   => ':attribute 至少有 :min 项',
    ],
    'not_in'               => '选定的 :attribute 是无效的',
    'numeric'              => ':attribute 必须是数字',
    'present'              => ':attribute 字段必须存在',
    'regex'                => ':attribute 格式是无效的',
    'required'             => ':attribute 字段是必须的',
    'required_if'          => ':attribute 字段是必须的当 :other 是 :value',
    'required_unless'      => ':attribute 字段是必须的,除非 :other 是在 :values 中',
    'required_with'        => ':attribute 字段是必须的当 :values 是存在的',
    'required_with_all'    => ':attribute 字段是必须的当 :values 是存在的',
    'required_without'     => ':attribute 字段是必须的当 :values 是不存在的',
    'required_without_all' => ':attribute 字段是必须的当 没有一个 :values 是存在的',
    'same'                 => ':attribute和:other必须匹配',
    'size'                 => [
        'numeric' => ':attribute 必须是 :size 位',
        'file'    => ':attribute 必须是 :size KB',
        'string'  => ':attribute 必须是 :size 个字符',
        'array'   => ':attribute 必须包括 :size 项',
    ],
    'string'               => ':attribute 必须是一个字符串',
    'timezone'             => ':attribute 必须是个有效的时区.',
    'unique'               => ':attribute 已存在',
    'url'                  => ':attribute 无效的格式',

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [
        'username'      => '帐号',
        'pwd'           => '密码',
        'phone'         => '手机',
    ],

];

laravel 的 $request 改值操作

// 合并输入,如果有相同的key,用户输入的值会被替换掉,否则追加到 input
$request->merge(['foo' => 'bar', ....]);

// 替换所有输入
$request->replace([..])

// 设置某参数,如果存在则替换,否则新增
$request['foo'] = 'bar';

// 移除某参数
unset($request['foo'])

laravel 的表单验证

使用 request 注入验证时,获取路由中的参数:

// 获取当前需要排除的id,这里的 user 是 路由 {} 中的参数
$id = $this->route('user');

字段唯一性同时排除指定ID验证:

// unique:表名,字段,需要排除的ID
'user' => 'required|unique:users,user,' . $id

匹配字段验证(如输入两次密码是否一致):

'password' => 'required|min:8|confirmed',
'password_confirmation' => 'required' // 可选验证规则,但名称一定要使用 +_confirmation 方式命名