我想在我的路由器中提供以下功能。
public function getAll($request, $response, $args, $table, $prefix, $order, $PermRead) {
// retrieve all records
// WORKING... Security questions
// 1. First, check to make sure authenticated (via JSESSION_ID, etc.)
// 2. Automatically apply site_id to ALL queries
// 3. Apply sch_id to this query
// 4. Get permissions
$status = null;
$site_id = $sch_id = 1;
if (!$PermRead) {
$status = 403; // 403 Forbidden
} else {
$sql =
"SELECT * from " . $table .
" WHERE " . $prefix . "_site_id = " . $site_id .
" AND " . $prefix . "_sch_id = " . $sch_id .
" AND " . $prefix . "_deleted_timestamp IS NULL " .
" ORDER BY " . $order;
$rows = $this->dbw->run($sql);
}
if (!$status) {
$status = 200; // 200 OK
}
return $response->withStatus($status)->withJson($rows);
}
但是,我收到以下错误:Fatal error: Using $this when not in object context in C:\Wamp\www\ravine\server\src\routes.php on line 26
我应该如何使这个功能可用,以便我可以在我的路线中调用它,如下所示:
// retrieve all classroom records
$app->get('/classrooms', function ($request, $response, $args) {
$PermRead = true; // check permissions
return getAll($request, $response, $args, "classroom", "room", "room_name", $PermRead);
});
答案 0 :(得分:1)
我建议使用应用程序containers来简化您的应用程序结构。 Slim 3设计用于与应用容器配合使用。
将容器传递给您的类方法 - 然后您将通过(共享)容器提供请求和响应对象,因为Slim会自动将这些(请求和响应)分配给容器对象。
您甚至可以向容器添加/分配数据库连接(以及您希望其他类可用的任何其他内容),然后您只需将同一容器传递给需要数据库功能的所有功能。
这个想法是你可以编写可以在其他项目中重复使用的类,即使你下次决定使用与Slim不同的东西。只要框架使用应用程序容器,您就可以重用类。
例如:在你index.php
$container = $app->getContainer();
$container['db'] = $myDbConnection;
$container['request']
和$container['response']
由框架自动分配。
E.g MyClass.php
use Interop\Container\ContainerInterface;
class MyClass {
public function getAll(ContainerInterface $container) {
// ...
$myDb = $container['db'];
// ... do DB stuff
$response = $container['response'];
return $response->withStatus($status)->withJson($rows);
}
}
答案 1 :(得分:1)
$this
在您的函数中不可用,最简单的方法是将其添加为参数。
类似的东西:
public function getAll($request, $response, $args, $table, $prefix, $order, $PermRead, $app) {
[..]
$app->dbw->...;
然后在参数
中使用$this
进行调用
return getAll($request, $response, $args, "classroom", "room", "room_name", $PermRead, $this);
答案 2 :(得分:0)
实施Werner建议使用应用程序的容器:
我在 /lib/common.php 中创建了一个名为Common的类:
<?php
namespace lib;
use Interop\Container\ContainerInterface;
class Common {
protected $ci;
private $site_id = 1;
//Constructor
public function __construct(ContainerInterface $ci) {
$this->ci = $ci;
}
public function getAll($table, $prefix, $order, $PermRead) {
// retrieve all records
// WORKING... Security questions
// 1. First, check to make sure authenticated (via JSESSION_ID, etc.)
// 2. Automatically apply site_id to ALL queries
// 3. Apply sch_id to this query
// 4. Get permissions
$status = null;
$site_id = $sch_id = 1;
if (!$PermRead) {
$status = 403; // 403 Forbidden
} else {
$sql =
"SELECT * from " . $table .
" WHERE " . $prefix . "_site_id = " . $site_id .
" ORDER BY " . $order;
$rows = $this->ci->dbh->run($sql);
$this->ci->response->withJson($rows);
}
if (!$status) {
$status = 200; // 200 OK
}
return $this->ci->response->withStatus($status);
}
}
然后,我将课程添加到 /src/dependencies.php
<?php
require __DIR__ . '/../lib/common.php';
$container = $app->getContainer();
// common router functions
$container['common'] = function ($c) {
$common = new lib\Common($c);
return $common;
};
现在,在我的个人路由器文件中,我可以在 /routers/classroom.router.php 中调用这样的常用函数:
// retrieve all classroom records
$app->get('/classrooms', function ($request, $response, $args) {
$PermRead = true; // check permissions
return $this->common->getAll("classroom", "room", "room_name", $PermRead);
});
容器带有$ request,$ response和$ args(以及其他函数)。