composer self-update && composer clearcache

2021年6月23日 laravel

The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems)
    Unzip with unzip command failed, falling back to ZipArchive class

好好的composer install死活不成功,提示上面信息,

又是

composer self-update

又是清除vendor重新安装的,没有效果


一顿google后,发现composer clearcache解决

laravel orderBy使用指定的自定义字符串顺序排序

2021年4月1日 laravel

laravel 使用 orderByRaw() 自定义排序

一般的排序 orderBy('column', 'asc')

现在要求按指定的字符串顺序排序:"FIELD(column,'". implode("','", array_reverse([‘aa’,’bb’,’cc’]))."') desc";

array_reverse 是将数组反序排序后再 desc ,最后得到的还是正序,目的是让不在指定范围内的往后排

假如记录中的column字段存在以下值:[‘cc’,’bb’,’dd’,’aa’,’ff’]

如果使用"FIELD(column,'". implode("','", [‘aa’,’bb’,’cc’])."')";

则得到的是'dd','ff'排在前面,然后才是'aa','bb','cc'

implode("','", [])是为了得到带‘号的拼接数组串,指定字符串列排序需要带上单引号,否则报错(数字则不用)

错误:FIELD(column, aa, bb, cc)

正确:FIELD(column, 'aa', 'bb', 'cc')

读CSV文件解决中文乱码问题

2021年1月7日 PHP

$file  = $_FILES[‘file’];
        $file_name = $file[‘tmp_name’];
        if($file_name == '') {
            $this->error("请选择要上传的csv文件");
        }
        // 以只读的方式打开文件
        $handle = fopen($file_name, 'r');
        if($handle === FALSE) {
            $this->error("打开文件资源失败");
        }
        // 删除上传文件
        unlink($file_name);
        // setlocale() 函数设置地区信息(地域信息)。
        @setlocale(LC_ALL, 'zh_CN');
        // CSV对应的字段名
        $csv_val = array('name', 'email', 'mobile', 'department', 'feedback_name', 'feedback_email', 'feedback_mobile', 'feedback_department', 'level');
        $data = array();
        while(($row = fgetcsv($handle)) !== FALSE) {
            //解决中文乱码
            $row = eval('return '.iconv('gbk','utf-8',var_export($row,true)).';');

            //这里需要检查和给的字段数是否一致,如果不一致,则不能写入
            $tmp_row = array();
            foreach ($csv_val as $k => $v) {
                $row_value = ltrim($row[$k], '`');
                $encode = mb_detect_encoding($row_value, array("ASCII", "UTF-8", "GB2312", "GBK", "BIG5"));
                if( $encode!="UTF-8" ){
                    $tmp_row[$v] = trim(iconv($encode,'UTF-8//IGNORE', $row_value));
                }else{
                    $tmp_row[$v] = trim($row_value);
                }
            }
            $data[] = $tmp_row;
        }
        // 关闭资源
        fclose($handle);

关于Laravel Passport一些踩坑记录

2020年9月3日 laravel

1、当Laravel使用多用户表api认证时,极容易因为默认guard为api导致认证失败(本人admin)

方案一:修改auth.defaults.guard 为 'admin'

      此方案导致我的web默认变成admin用户验证,还需要再做一堆处理…于是…

方案二:添加认证中间件

    public function handle($request, Closure $next, ...$guards)
    {
        if( strpos($request->route()->getName(), 'passport')!==false ) {
            config(['auth.defaults.guard' => 'admin']);
        }

        $this->authenticate($request, $guards);

        return $next($request);
    }

2、前后分离小应用

前后分离后端:添加中间件,自动生成laravel_token

    protected $middlewareGroups = [
        'web' => [
            ...
            \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
        ],

前后分离前端请求示例(注意不要直接复制下面代码,wp的引号自动替换成中文引号,我自己被自己的复制坑了半天时间)

            $.ajax({
                type: "GET",
                url: '{{ url('/api/user') }}',
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
                dataType: 'json',
                success: function(res) {
                    console.log(res);
                }
            });
 
应用外请求token
            $.ajax({
                type: "POST",
                url: '{{ url('/oauth/personal-access-tokens') }}',
                data: {name: 'Token Name'},
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
                dataType: 'json',
                success: function(res) {
                    console.log(res);
                }
            });

3、关于api_token认证

需要做接口登录换取token过程

建议一步到位,直接laravel/passport,用法更普遍,更强大,更标准

4、关于client_uuids

开启client_uuids = true记得要把id字段设置为varchar,原有id是自增的bigint

同时当

php artisan passport:install

生成client_id时可能会要求 "128-bit integer; Moontoast\Math\BigNumber is required. "

composer require moontoast/math

5、redirect_uri是oauth必须验证的一个参数,所以一定要保持参数与client设置的一致

6、Oauth支持的5类 grant_type 及说明

    authorization_code — 授权码模式(即先登录获取code,再获取token)

    password — 密码模式(将用户名,密码传过去,直接获取token)

    client_credentials — 客户端模式(无用户,用户向客户端注册,然后客户端以自己的名义向’服务端’获取资源)

    implicit — 简化模式(在redirect_uri 的Hash传递token; Auth客户端运行在浏览器中,如JS,Flash)

    refresh_token — 刷新access_token

7、遇到直接使用php artisan passport:install生成的Clinet无法通过authorization_code认证,
默认生成:Personal Access Client 或 Password Grant Client
通过新建Client解决

php artisan passport:client

8、

9、

10、

 

 

其它未完待续

关于supervisor运行laravel-echo-server

2020年7月16日 laravel, nodejs

[program:project-laravel-echo-server]
process_name=%(program_name)s_%(process_num)02d
command=npx laravel-echo-server start –dir=/usr/local/www/project
directory=/usr/local/www/project/
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/home/username/log/enterprise4.laravel-echo-server.log
 

关键红色字段部分。正常本地测试直接npx laravel-echo-server start就完事,通过supervisor就不能直接起作用

laravel broadcast laravel-echo receive nothing from private channel

2020年7月16日 laravel

laravel broadcast laravel-echo receive nothing from private channel

使用laravel的广播系统来接收notification通知,折腾了2天。。。

无论广播怎么发送成功,前端就是没反应,获取不到广播,google了2天没有结果,最后不知道从哪个报错信息中发现实际监听的应该 是带前缀的频道名。。。

.env使用redis处理广播

BROADCAST_DRIVER=redis

默认配置config/database.php里redis.options.prefix由APP_NAME+_database_组成,导致所有redis key都是以laravel_database_为前缀的。

监听事件时Echo.private('channel-name') or Edho.channel('channel-name')就无法接收广播

需要监听Echo.private('laravel_database_channel-name') 或 Echo.channel('laravel_database_private-channel-name') ….具体你遇到什么情况,你的前缀是什么,替换就是

 

当然,也可以把config/database.php里redis.options.prefix设成空,一切按文档都没问题

laravel广播路由中间件 Client can not be authenticated, got HTTP status 401

2020年7月16日 未分类

Broadcast::routes(['middleware' => ['web','auth:admin']]);

默认路由

Broadcast::routes();

google一通,全说

Broadcast::routes(['middleware' => ['auth:admin']]);

得到的都是401

最后

php artisan route:list

发现其它路由都有web就

 broadcasting/auth 没有。因为我的应用是需要web端管理后台使用的广播,所以两个中间件都要。

记一次微信支付接口”签名错误“解决过程

2020年3月11日 支付接口

网站接入微信支付,各参数都完整正确填写,接口总是返回错误信息

接口返回:{"return_code":"FAIL","return_msg":"签名错误"}

排查一天,最终是因为手工设置的API密钥是手工输入的字符串,最后用随便一个MD5加密字符串32位重置就好了

PS. 中途遇到一个AppId和商户ID不匹配的问题,接口返回:appid和mch_id不匹配,原因是商户号要跟AppId进行绑定,绑定后解决

子目录存放react导致create-react-app build 后static路径不对

2020年3月5日 react&antd

用laravel6+react+antd创建一个项目

修改build目录到public子目录,导致服务器访问 

index

 找不到

static

 下面的资源
test.com/build/static/cs.css

变成

test.com/static/cs.css

解决方案在

package.json

中配置 

homepage

"homepage": "."

{
  "name": "member",
  "version": "0.1.0",
  "private": true,
  "homepage": ".",
...

 

给代码添加两个git的remote地址,实现代码两边PULL和PUSH

2020年3月4日 git

一般使用都是一个项目一个git的remote地址,当克隆github上的某个项目进行二次开发时,需要设置自己本地的git仓库,但同时又不想错过原github项目的更新,所以考虑设置两个remote

方法一:两边独立提交

在git A 项目中添加另一个git B远程的地址

git remote add origin2 git@github.com:xxxx/xxxx.git

origin2可以自定义

先拉取git B 该地址上的数据

git pull origin2 master --allow-unrelated-histories

–allow-unrelated-histories是为了解决冲突, 把两段不相干的 分支进行强行合并

在git A 项目中把项目内容同步到git B地址中

git push origin2 master

 此时,我们基本实现了可以把一个项目可以提交到两个git地址了,但是每次提交内容都需要进行如下两次提交,才能实现把一个项目同时提交到两个git地址。

git push origin  master
git push origin2 master

​查看当前的远端地址:

​git remote -v

方法二:两边同时提交

给origin 增加一个可以push的地址

git remote set-url --add origin git@xxxx:xxxx/xxxx.git

给origin添加一个远程push地址,这样一次push就能同时push到两个地址上面

查看当前的远端地址:

​git remote -v

至此,我们就可以直接一个push,同时推送到两个git地址。

git push origin master -f

如果第一次推不上去代码,可以使用强推的方式

注意:删除添加的路径的方法是

git remote set-url --delete origin git@xxxx.com:xxxx/xxxx.git