Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Slim 3如何在中间件功能中使用记录器_Php_Logging_Slim - Fatal编程技术网

Php Slim 3如何在中间件功能中使用记录器

Php Slim 3如何在中间件功能中使用记录器,php,logging,slim,Php,Logging,Slim,在使用官方软件创建所有内容后,我编写了此路由器: $php composer.phar创建项目slim/slim skeleton[我的应用程序名] 这是我的routes.php文件 <?php require_once(__DIR__."/../bootstrap.php"); // Routes class OwnsPost { /** * Example middleware invokable class * * @param \Psr\Http\Mes

在使用官方软件创建所有内容后,我编写了此路由器:

$php composer.phar创建项目slim/slim skeleton[我的应用程序名]

这是我的
routes.php
文件

<?php

require_once(__DIR__."/../bootstrap.php");
// Routes

class OwnsPost
{
  /**
   * Example middleware invokable class
   *
   * @param  \Psr\Http\Message\ServerRequestInterface $request  PSR7 request
   * @param  \Psr\Http\Message\ResponseInterface      $response PSR7 response
   * @param  callable                                 $next     Next middleware
   *
   * @return \Psr\Http\Message\ResponseInterface
   */
  public function __invoke($request, $response, $next)
  {


    if($request->getQueryParams() && $request->getQueryParams()['pid']){
      $pid = intval($request->getQueryParams()['pid']);
      if($pid == 0){
        $this->logger->info("illegal pid call");
        return false;
      }
      $cpost = get_post($pid);
      if($cpost->post_author != get_current_user()){
        $this->logger->info("wrong current user, tried accessing postid " . $cpost->ID . " with user ". get_current_user());
        return false;
      }
    }else{
      $this->logger->info("illegal pid call");
      return false;
    }
//    $response->getBody()->write('BEFORE');

    $response = $next($request, $response);
//    $response->getBody()->write('AFTER');

    return $response;
  }
}


$app->get('/campaignedit/setcharitable/{id}', function ($request, $response, $id) {
    // Sample log message
    $this->logger->info("setcharitable '/' route " . $id);

    // Render index view
    return $this->renderer->render($response, 'index2.php', $id);
})->add( new OwnsPost() );

我显然需要打电话给

global$app

中间件类中没有成员变量
$logger
。所以,首先添加一个

protected $logger;
接下来,添加一个接受
$logger
作为参数的构造函数

public function __construct($logger) 
{
    $this->logger = $logger;
}
最后,在初始化中间件时,传递记录器的实例

$ownsPost = new OwnsPost($this->logger);

按照@Mikey的建议,这是一个更好的解决方案。如果你已经在用类和对象进行OO编程,永远不要混入
global
-所以我必须在每个对象中传递一个日志?如果是同一个对象,这对您有什么意义?说真的,您有多少中间件?您可以让所有路由类(控制器)从您拥有的基础控制器上的基础控制器继承
静态公共$app
。在
middleware.php
中设置此值一次,如
BaseController::$app=$app
然后它将对您的所有控制器可用。@Michael使用
\uu get
的原因是什么?我以前从未使用过它。我真的可以重用
$ownsPost
?因为如果没有,这将非常不安全。或者您希望我为每个实例创建
$ownsPost
?每个路由都有一条额外的线路通过记录器?因此基本上:将细长容器交给中间件,否则我们根本无法访问服务。是的,您可以重新使用中间件。是的,您可以通过容器而不是记录器。