超薄3通过额外的参数控制器

时间:2018-03-25 13:07:44

标签: php slim-3

这是我的原始代码:

E

注意 $app->post('/api/user', function (Request $request, Response $response, array $args) use ($tokenAuth) { $tokenAuth->parseHeaders(); // validate token //...do stuff with $tokenAuth data $response->getBody()->write(json_encode(...))); return $response; }); 这允许我在方法中使用这个对象。

我如何以同样的方式使用此方法?

use ($tokenAuth)

当路由在UserController类中命中时,它可以正常工作:

$app->post('/api/user', \UserController::class . ':add');

如何将class UserController { public function add($request, $response, $args) { ...} } 传递给此人?

3 个答案:

答案 0 :(得分:1)

您可以将$tokenAuthUserController注册到依赖关系管理器,并通过依赖注入机制将$tokenAuth传递给UserController。例如:

<?php 
namespace Your\Own\NameSpace;

use Your\Own\NameSpace\TokenAuth;

class UserController 
{
    private $tokenAuth;

    public function __construct(TokenAuth $tokenAuth) 
    {
        $this->tokenAuth = $tokenAuth;
    }

    public function add($request, $response, $args) 
    {
        $this->tokenAuth->parseHeaders();
        ... 
    }
}

在您的依赖注册码中(假设使用Pimple):

<?php

use Your\Own\NameSpace\TokenAuth;
use Your\Own\NameSpace\UserController;

$container[TokenAuth::class] = function ($c) {        
    return new TokenAuth();
};

$container[UserController::class] = function ($c) {
    $tokenAuth = $c->get(TokenAuth::class);
    return new UserController($tokenAuth);
};  

答案 1 :(得分:0)

我最终使用中间件在路线上进行身份验证:

$mw = function($request, $response, $next){
    $tokenAuth = new \TokenAuth();
    $tokenAuth->parseHeaders();
    $response = $next($request, $response);
    return $response;
};

$app = new \Slim\App();

$app->post('/api/user', \UserController::class . ':add')->add($mw);

$app->run();

答案 2 :(得分:-1)

看一下您的原始代码,您可以使用$tokenAuth(并且它有效),这意味着您之前已全局定义它。

因此,在您的add方法中,只需将其声明为全局变量:global $tokenAuth;然后使用它;

public function add($request, $response, $args) { 
    global $tokenAuth;
    $tokenAuth->parseHeaders();
    ...
}