Php Slim 3渲染控制器

Php Slim 3渲染控制器,php,slim,Php,Slim,我曾经使用Slim 2,但当我切换到Slim 3时,我在控制器中呈现页面时遇到问题: namespace controller; class Hello { public function index(){ $this->app->render('web/pages/hello.phtml'); } } 这是routes.php中控制器的调用 $app->get('/test3', '\controller\Hello:index'); 这

我曾经使用Slim 2,但当我切换到Slim 3时,我在控制器中呈现页面时遇到问题:

namespace controller;

class Hello
{
    public function index(){
        $this->app->render('web/pages/hello.phtml');
    }
}
这是routes.php中控制器的调用

$app->get('/test3', '\controller\Hello:index');
这是我的控制器:

namespace controller;

class Hello
{
    public function index(){
        $this->app->render('web/pages/hello.phtml');
    }
}
对于控制器,我只是将其添加到composer.json中:

"autoload": {
    "psr-0": {
        "controller": "web/"
    }
}
文件夹“控制器”和“页面”位于同一文件夹“web”中 我得到以下错误:

PHP Notice:  Undefined property: controller\Hello::$app
PHP Fatal error:  Call to a member function render() on a non-object

我遗漏了什么吗?

您如何将控制器操作绑定到路由器?使用类似“Hello::index”或数组('Hello','index')的东西


如果要将应用程序变量用作控制器类中的属性,则需要

首先,必须将渲染器添加到依赖项容器中

$container = $app->getContainer();

$container['renderer'] = function ($c) {
    return new Slim\Views\PhpRenderer(__DIR__ . '/../templates/');
};
Slim将容器实例传递给控制器构造函数。将其保存在实例变量中:

private $container;

public function __construct($container) {
    $this->container = $container;
}
然后,您可以从容器中获取渲染器并返回如下响应:

public function index($request, $response, $args) {
    $this->container->renderer->render($response, 'hello.phtml', $args);
}
$app->get('/test3','\controller\Hello:index');