Slim框架 - 如果控制器扩展Slim类,为什么不停止方法工作?

时间:2014-09-26 17:24:22

标签: response slim

我看到了一件非常有趣的事情。我做了一个基于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")));
        }
    }

任何人都有一个好的想法?

1 个答案:

答案 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()调用在任何情况下都会导致错误。