ThinkPHP5.0入门教程4之控制器传递变量

by kingzcheung on August 14, 2016

到目前为止,我们搞定了博客的首页模板,但是怎么往模板传递数据呢?答案就是控制器。在MVC模式中,M(model)负责数据处理(比如从数据库中获取数据),V(view)负责数据展示,如果把M的数据传递到V,就需要C(controller)来做了。

TP5的控制器定义比较灵活,可以无需继承任何的基础类,也可以继承官方封装的thinkController类或者其他的控制器类。

定义控制器

以首页的控制器application/index/controller/index.php为例,TP5的控制器定义如下:

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
        return view('index/index');
    }
}

默认的命名空间为namespace app\index\controller;,类名必须与文件名称保持一致。

渲染模板

上文中,我们渲染模板使用了view()函数,其实view()是助手函数,正常的渲染模板也可以使得下面的方式:

<?php
namespace app\index\controller;

use think\View;

class Index
{
    public function index()
    {
        $view = new View();
        return $view->fetch('index/index');
        //return view('index/index');
    }
}

助手函数view()只是帮我们实例化了View类并调用了fetch方法而已。

传递数据到视图

向模板传递变量有很多种,第一种,向fetch方法的第二个参数直接传入数组:

<?php
namespace app\index\controller;

use think\View;

class Index
{
    public function index()
    {
        $view = new View();
        return $view->fetch('index/index',['name'=>'Kingz Cheung']);
        //return view('index/index');
    }
}

第二种,直接继承thinkController类,就不需要自己实例化View类了:

<?php
namespace app\index\controller;

use think\Controller;
use think\View;

class Index extends Controller
{
    public function index()
    {
        return $this->fetch('index/index',['name'=>'Kingz Cheung']);
        //return view('index/index');
    }
}

第三种,助手函数的第二个参数也可以传入一个数组。

return view('index/index',['name'=>'Kingz Cheung']);

如果需要传递的变量很多,以上的方法就不太合适了,那么我们可以采用以下的方法:

<?php
namespace app\index\controller;

use think\Controller;
use think\View;

class Index extends Controller
{
    public function index()
    {
        //如果直接继承了think\controller类,就直接用$this
        //如果是直接实例化View类,就直接采用$view->assgin()
        $this->assign('age',18);
        $this->assign('site','www.kingzcheung.com');
        //下面这种为对象赋值
        $this->abc = 'abc';

        return $this->fetch('index/index',['name'=>'Kingz Cheung']);
        //return view('index/index');
    }
}

模板变量

上面讲的是控制器如何向模板传递变量,那么模板中如果显示变量呢?在模板中输出变量的方法很简单,例如:

return $this->fetch('index/index',['name'=>'Kingz Cheung']);

我们直接在模板中,使用大括号包含,像使用php变量一样使用$开头:

{$name}

如果这个变量是一个数据怎么办?

$data['name'] = 'Kingz Cheung';
$data['email'] = 'kingzcheung@gmail.com';
$view->assign('data',$data);

我们可以采用点语法,也可以采用PHP语法访问:

Name:{$data.name}
Email:{$data.email}
或者
Name:{$data['name']}
Email:{$data['email']}

模板这一块后面还会讲到,这里我们只讲最简单的使用。