如何在slim3中实现php函数

如何在slim3中实现php函数,php,rest,api,slim,slim-3,Php,Rest,Api,Slim,Slim 3,我刚刚学习了slim 3,我想将我的slim 2项目转换为slim 3,但仍然停留在PHP函数中,尤其是带有参数的函数中。我不知道如何创建带参数的函数以及如何传递它 例如,我有一个重要的函数来获取我的用户详细信息,我不知道如何转换为Slim 3 多谢各位 函数internalUserDetails($input){ 试一试{ $db=getDB();//转换为slim 3时,我在dependencies中声明了db,因此必须使用“$this->db”调用db $sql=“从username=:

我刚刚学习了slim 3,我想将我的slim 2项目转换为slim 3,但仍然停留在PHP函数中,尤其是带有参数的函数中。我不知道如何创建带参数的函数以及如何传递它

例如,我有一个重要的函数来获取我的用户详细信息,我不知道如何转换为Slim 3

多谢各位

函数internalUserDetails($input){
试一试{
$db=getDB();//转换为slim 3时,我在dependencies中声明了db,因此必须使用“$this->db”调用db
$sql=“从username=:input或email=:input的用户中选择用户标识、名称、电子邮件、用户名”;
$stmt=$db->prepare($sql);
$stmt->bindParam(“输入”,$input,PDO::PARAM_STR);
$stmt->execute();
$usernameDetails=$stmt->fetch(PDO::fetch_OBJ);
$usernameDetails->token=apiToken($usernameDetails->user\u id);
$db=null;
返回$usernameDetails;
}捕获(PDO$e){
回显“{”错误“:{”文本“.$e->getMessage().}}”;
}

}
为数据库创建一个类:

<?php

class Database
{
    /**
     * Database username
     *
     * @var string
     */
    protected $username;

    /**
     * Database password
     *
     * @var string
     */
    protected $password;

    /**
     * Database host
     *
     * @var string
     */
    protected $host;

    /**
     * Database name
     *
     * @var string
     */
    protected $name;

    /**
     * Database constructor;
     */
    public function __construct()
    {
        try {

            // iniate $c... I'm not sure how you're getting the value..
            $c = [
                'settings' => [
                    'db' => [
                        'host'   => '',
                        'dbname' => '',
                        'user'   => '',
                        'pass'   => '',
                    ],
                ],
            ];
            $this->host     = $c['settings']['db']['host'];
            $this->name     = $c['settings']['db']['dbname'];
            $this->username = $c['settings']['db']['user'];
            $this->password = $c['settings']['db']['pass'];

            return $this->connect();
        }
    }

    /**
     * Connect to your database
     *
     * @return pdo
     */
    public function connect()
    {
        try{
            $pdo = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name,
            $this->username, $this->password);

            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

            return $pdo;   
        } catch (Exception $ex){
            return $ex->getMessage();
        }

    }

}

然后将分配您的
$this->db
,因此您可以在方法中使用它

在Slim 3中,您应该使用容器来获取数据库实例

在config/settings.php文件中插入并调整必要的连接设置

// Database settings
$config['db']['host'] = '127.0.0.1';
$config['db']['username'] = 'root';
$config['db']['password'] = '';
$config['db']['database'] = 'test';
$config['db']['charset'] = 'utf8';
$config['db']['collation'] = 'utf8_unicode_ci';
为PDO连接添加容器条目

$container['db'] = function (Container $container) {
    $settings = $container->get('settings');
    $host = $settings['db']['host'];
    $dbname = $settings['db']['database'];
    $username = $settings['db']['username'];
    $password = $settings['db']['password'];
    $charset = $settings['db']['charset'];
    $collate = $settings['db']['collation'];
    $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_PERSISTENT => false,
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES $charset COLLATE $collate"
    ];

    return new PDO($dsn, $username, $password, $options);
};
然后将PDO实例注入控制器类,并通过成员变量访问它

protected $db;

public function __construct(Container $container)
{
    $this->db = $container->get('db');
}

public function internalUserDetails(Request $request, Response $response)
{
    $this->db ...
}
如果使用route回调,则按如下方式访问PDO实例:

$app->get('/', function (Request $request, Response $response, array $args) {
    $db = $this->get('db');
    // do something

    return $response;
});

当我使用$this'在不在对象上下文中使用$this'时,我在上面的代码中看不到任何
$this
?在slim 3中,我的getDB()函数将放在'dependencies'中,我应该用$this->db调用;请添加您遇到问题的代码,这会显示错误消息。我添加了slim 3 dependencies,您的数据库类将抛出“Undefined variable$c”。您可能还应该将数据库连接绑定到容器。如果在每个需要使用数据库的类中执行
newdatabase
,每次都会创建一个新连接,这是不好的。而应该重用连接。
$app->get('/', function (Request $request, Response $response, array $args) {
    $db = $this->get('db');
    // do something

    return $response;
});