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
?每个路由都有一条额外的线路通过记录器?因此基本上:将细长容器交给中间件,否则我们根本无法访问服务。是的,您可以重新使用中间件。是的,您可以通过容器而不是记录器。