将控制器变量发送到视图的功能

时间:2017-01-09 10:07:32

标签: php function variables frameworks set

为了设置一个小型主页框架,我想将变量发送到视图,但我必须找到无效的解决方案。

有问题的代码:

SRC /控制器/ Controller.php这样

<?php

namespace App\Controller;
use App\Network\Request;

class Controller {
    protected $viewPath = ROOT . VIEW;
    protected $template = ROOT . TEMPLATE;
    protected $layout = "default";


    public function __construct()
    {
        $request = new Request();
        $this->render($request->controller().'/'. $request->action());
    }

    public function layout($template) {
        if($template != $this->layout) {
            require $this->template . $template . '.php';
        }
    }

    public function render($view) {

        ob_start();
        require $this->viewPath . '/' . str_replace('.', '/', $view). '.php';
        $content = ob_get_clean();
        require $this->template .$this->layout . '.php';
    }

    public function set($varname) {
        extract($varname);
        return $varname;
    }
}
?>

应用/控制器/ PostsController.php

<?php
namespace App\Controller;

class PostsController extends Controller {
    public function index() {
        $posts = [
            "id"    => "1",
            "ids"    => "2"
        ];
        $this->set(compact('posts'));
    }
}
?>

使用PostsController中的$this->set函数返回未定义的变量:回显后的帖子。

我也尝试将ob_startob_get_clean置于集合函数中,但也不起作用。

即,我不想在渲染中包含函数集,因为我动态处理视图的视图(参见__construct ())。

另一个问题:

如何将View类与我的视图相关联,从而使用$this->method ()

谢谢

1 个答案:

答案 0 :(得分:0)

您的变量仅限于函数set范围。所以你无法在渲染功能中看到它 为什么不将数组值发送到渲染函数中,就像那样

public function render($view, array $params = []){
    extract($params, EXTR_OVERWRITE);
    ob_start();
    require $this->viewPath . '/' . str_replace('.', '/', $view). '.php';
    $content = ob_get_clean();
    require $this->template .$this->layout . '.php';
}

然后你就像这样称呼它

$this->render('hello', [
    'name' => 'Mikołaj',
    'surname' => 'Woźniak'
]);