Slim Framework添加全局功能

时间:2016-10-31 22:57:47

标签: php slim

我想在我的路由器中提供以下功能。

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);
});

3 个答案:

答案 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(以及其他函数)。