作者: admin

  • Laravel在FormRequest验证中返回JSON

    Laravel中表单验证可以用FormRequest来进行,但是这个默认是返回视图文件的,如果想要把验证结果以JSON格式返回,可以使用如下代码(failedValidation函数):

    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Contracts\Validation\Validator;
    use Illuminate\Foundation\Http\FormRequest;
    use Illuminate\Validation\ValidationException;
    use Symfony\Component\HttpFoundation\Response;
    
    class TagStoreRequest extends FormRequest
    {
        
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array<string, mixed>
         */
        public function rules(): array
        {
            return [
                'tag' => 'required|unique:tags',
            ];
        }
    
        public function messages(): array
        {
            return [
                'tag.required'=> '标签名称不能为空!',
                'rag.unique' => '该标签已存在!',
            ];
        }
    
        protected function failedValidation(Validator $validator)
        {
            throw new ValidationException(
                $validator,
                response()->json(
                    [
                        'code'=>-1,
                        'msg'=> $validator->errors()->first()
                    ],
                    Response::HTTP_UNPROCESSABLE_ENTITY
                )
            );       
        }
    }
  • Laravel更新时的唯一性验证

    在执行update进行更新数据时,有时需要对唯一性进行验证,这时要在验证项的后面加上一个ID,不然Laravel会认为该字段内容已存在。

    具体验证代码如下:

    $validator = validator($request->all(), [
        'name' => 'required|unique:departments,name,' . $department->id,
    ]);
    
    if ($validator->fails()) {
        return response()->json([
            'code' => -1,
            'msg' => $validator->errors()->first()
        ])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
    }
    
    $department->update($validator->valid());
    return response()->json(['code' => 0, 'msg' => 'success']);
  • 旧文章

    利用接近2天的时间,整理了从2009年到2019年10年间的近500篇旧文章,并发布到了网站上,这真的是一个体力活。

    纯手工整理,整理完发布完后,手腕都酸了,需要好好休息一下。

    整理的大部分文章都是原创,还有相当多的文章是从网上收集的,这些就不放上来了,没有什么意义。

    至此,“技术点滴”基于汇集了我的绝大部分原创文章,以后新的文章也会尽量更新上来。

    虽然很多文章都不成系统,技术点都很零碎,但这都是在开发过程中随手记的,所以没有那么多的时间写成系列的文章,很多的文章甚至都只有代码。

    整理文章的这两天,有时一边整理一边在想,这些年来做的这些都有什么意义?有时夜深了还在电脑前,这么多的付出,值得吗?

    现在想来,最大的意义就是把时间换了钱,养了家糊了口,仅此而已。

    现在整理出来,分享出来,希望能帮助更多的人,就像曾经的我。

    这个站,也算是对自己15年编程生涯的一个交代。

  • Laravel表单验证返回JSON

    新增时的验证:

    $validator = validator($request->all(), [
        'name' => 'required|unique:departments',
    ]);
    
    if ($validator->fails()) {
        return response()->json([
            'code'=>-1,
            'msg'=> $validator->errors()->first()
        ])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
    }
    
    Department::create($validator->valid());
    return response()->json(['code'=>0]);

    获取已验证的数据:$validator->valid()

  • Laravel使用laravel-permission进行权限管理

    安装

    composer require spatie/laravel-permission

    发布迁移文件:

    php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

    在config/app.php 中,Providers 数组里添加:

    'providers' => [
        // ...
        Spatie\Permission\PermissionServiceProvider::class,
    ];

    发布配置文件:

    php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

    迁移数据库

    php artisan migrate

    在User Model 引用 HasRoles trait:

    use Spatie\Permission\Models\Role;
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable, HasRoles;
    }

    用法:

    创建角色:$role=Role::create(['name'=>'超级管理员']);

    创建权限:$permission=Permission::create(['name'=>'*']);

    给角色赋予权限:$role->givePermissionTo($permission);

    给用户一个角色:$user->assignRole('超级管理员');

    在blade页面获取用户的第一个角色:{{ Auth()->user()->getRoleNames()->first() }}

  • Laravel Eloquent 中的一对一,一对多,多对多

    一对一使用 hasOne   反向 belongsTo
    一对多使用 hasMany反向 belongsTo
    多对多使用 belongsToMany反向 BelongsToMany

  • Laravel网站根目录权限设置

    for directories

    find . -type d -print0 | xargs -0 chmod 0755

    for files

    find . -type f -print0 | xargs -0 chmod 0644
    chown -R www-data:www-data *

    把当前文件夹也加入php-fpm用户组

    chown -R www-data:www-data .

    更改 storage 文件夹权限

    chmod -R 0755 storage

     

  • 网站启用新域名

    今天,新的域名jsdd.net备案通过了,域名是“技术点滴”的拼音首字母,更契合这个网站。以后就使用这个新域名了,不再更换。

    从此,jsdd.net将作为我的小窝,用来记录和分享一些编程技术。


    2025年2月4日,启用了新域名www.lwbj.cn,详情见:https://lwbj.cn/domain-change-and-website-rebranding/

  • WordPress 修改附件元数据

    今天修改了一张图片的名字,以为在数据库里同步修改就行了,结果不是那么回事,在wp_postmeta表中有个meta_key字段保存了一个附件的元数据,meta_key的值是_wp_attachment_metadata,对应的meta_value是附件的元数据,如下图所示:

    这个元数据是不能直接编辑的,要用代码生成,代码如下:

    // 获取附件ID
    $attachment_id = 3261; // 请根据实际的附件ID修改
    
    // 获取附件元数据
    $metadata = wp_get_attachment_metadata( $attachment_id );
    
    // 修改文件路径和文件名
    $new_file = '2023/08/zaochencongzhongwukaishi.jpeg'; // 新的文件路径
    $metadata['file'] = $new_file;
    
    // 修改各个尺寸的路径(如果有需要)
    foreach ( $metadata['sizes'] as $size => $size_data ) {
        $metadata['sizes'][$size]['file'] = str_replace('zaochenchongzhongwukaishi', 'zaochencongzhongwukaishi', $size_data['file']);
    }
    
    // 更新附件元数据
    wp_update_attachment_metadata( $attachment_id, $metadata );

    注意在执行这段代码前,不要动原来的元数据。

    可以把这面代码放在functions.php里执行,或者放到某个插件代码文件里执行都行。执行完了记得删除。

    补充:附件ID需要到wp_posts表找。

  • 关于FreshRSS的一些记录

    Freshrss推荐的API是 Google Reader API

    移动客户端可以用 Fluent Reader Lite

    FreshRSS自动更新订阅,需要用到系统定时任务。

    使用以下命令编辑 www-data 用户的 crontab:

    sudo crontab -u www-data -e

    在打开的 crontab 编辑器中,添加以下行:

    10 * * * * php -f /var/www/freshrss.wujie.me/app/actualize_script.php > /tmp/FreshRSS.log 2>&1

    保存并退出编辑器,这样,定时任务就会每小时的第 10 分钟运行,并将输出记录到 /tmp/FreshRSS.log 文件中。