我看到了一件非常有趣的事情。我做了一个基于Slim框架的小型mvc / rest框架。
$app->put('/:id', function ($id) {
$app->halt(500, "Error") // Here this is working.
(new RestController)->editItem($id);
})->via('put');
所以我编写了一个扩展BaseController的RestController,我的BaseController扩展了Slim框架。
class BaseController extends \Slim\Slim {
/**
* @var \app\models\AbstractModel
*/
protected $model;
public function __construct() {
$settings = require(__DIR__ .'/../configurations/slim.php');
parent::__construct($settings);
}
}
所以我的BaseController可以使用Slim类的方法和属性。
class RestController extends BaseController {
public function editItem($id) {
$data = $this->getRequestBody();
$result = $this->model->update($id, $data['data']);
// This is absolutely not working, but it seems my application will die in this case.
// Because I cannot see any written message (with echo or print methods...)
// This will always return with a 200 staus code and blank page!
$this->halt(404, json_encode(array('status' => "ERROR")));
}
}
但是这样可以正常工作......我不明白,为什么?
class RestController extends BaseController {
public function editItem($id) {
$data = $this->getRequestBody();
$result = $this->model->update($id, $data['data']);
// This will work.
$app = Slim::getInstance();
$app->halt(204, json_encode(array('status' => "ERROR")));
}
}
任何人都有一个好的想法?
答案 0 :(得分:0)
您可以通过(new RestController)
在路线中构建一个新的RestController。虽然它在类层次结构中扩展了Slim / Slim,但它是它的一个新实例;它不是$app
的副本或引用,实际上正在运行的Slim应用程序。
这会导致第一种情况出现问题:你说$this->halt(...)
而$this
是新构造的RestController,它是Slim应用程序的新实例,而不是那个目前正在运行。因此,暂停调用对您的应用程序输出没有影响。
在第二种情况下,你说$app->halt(...)
其中$ app是Slim::getInstance()
,这是Slim应用程序的全局实例,它是实际运行的Slim应用程序。因此,暂停调用会影响您的应用程序的输出。
您可以通过使用第二种方法或通过将全局$app
变量实例化为RestController来解决问题,然后您可以执行以下操作:
$app->put('/:id', function ($id) use ($app) {
$app->halt(500, "Error") // Here this is working.
$app->editItem($id);
})->via('put');
<强> NB 强>;您忘了将use ($app)
放在发布到您问题的代码中,我在上面的代码中添加了它。它是否存在于您实际运行的代码中?否则,$app->halt()
调用在任何情况下都会导致错误。