duanjianxu4288 2019-02-28 11:07
浏览 89
已采纳

在Slim中向路由添加中间件时出错

I wrote this code in Slim and it works fine but when I add the middleware I get the following error!!! Can not figure out what is happening, could any one please help me.

PHP Catchable fatal error:  Argument 3 passed to fileFilter() must be callable, array given FILENAME in line 90

This middleware filters unsupported file types

use Slim\Http\Request;
use Slim\Http\Response;
use Api\ErrorList as ErrorList;

function fileFilter(Request $request, Response $response, callable $next){
        $allowedFiles = ['image/jpeg', 'image/png', 'application/pdf'];
        $files = $request->getUploadedFiles();
        $flattened =array_flatten($files);

        foreach ($flattened as $key=> $newFile){
            $newFileType = $newFile->getClientMediaType();

            if(!in_array($newFileType, $allowedFiles)) {
                return ResponseHelper::createfailureResponse($response, HTTPStatusCodes::BAD_REQUEST, ErrorList::UNSUPPORTED_FILE_TYPE);
            }

        }
        return $next($request, $response); // line 90
    }

And here I add the middleware to my route.

 $app->group('/test/api/v1', function () {
        // other routes here
        $this->post('/resume/edit','fileFilter', ResumeController::class. ':edit')->setName('Resume.edit');


    });
  • 写回答

1条回答 默认 最新

  • dsf5989 2019-03-04 06:25
    关注

    You should remove 'fileFilter' from

    $this->post('/resume/edit', ...
    

    and change it to something like

    $this->post(...)->add((Request $request, Response $response, callable $next){
        $allowedFiles = ['image/jpeg', 'image/png', 'application/pdf'];
        $files = $request->getUploadedFiles();
        $flattened =array_flatten($files);
    
        foreach ($flattened as $key=> $newFile){
            $newFileType = $newFile->getClientMediaType();
    
            if(!in_array($newFileType, $allowedFiles)) {
                return ResponseHelper::createfailureResponse($response, HTTPStatusCodes::BAD_REQUEST, ErrorList::UNSUPPORTED_FILE_TYPE);
            }
    
        }
        return $next($request, $response); // line 90
    });
    

    or as invokable class

    class MyMiddleware
    {
        public function __invoke(Request $request, Response $response, callable $next){
            $allowedFiles = ['image/jpeg', 'image/png', 'application/pdf'];
            $files = $request->getUploadedFiles();
            $flattened =array_flatten($files);
    
            foreach ($flattened as $key=> $newFile){
                $newFileType = $newFile->getClientMediaType();
    
                if(!in_array($newFileType, $allowedFiles)) {
                    return ResponseHelper::createfailureResponse($response, HTTPStatusCodes::BAD_REQUEST, ErrorList::UNSUPPORTED_FILE_TYPE);
               }
    
            }
            return $next($request, $response); // line 90
        }
    }
    

    and in route

    $this->post(...)->add(MyMiddleware::class);
    

    Slim Middleware

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题