写给thinkphp开发者的laravel系列教程(七)视图

相对于 MC;
laravel的视图V可能是最容易上手的;
但是如果想用好;
那也是我们 phper 最难掌握的部分;
因为它涉及到了领域叫前端;
laravel 和 node.js 有着非常紧密的结合;
这也正是 laravel 强大的原因之一;
它不仅仅是一个 php 框架;
它更是一个全栈框架;
不熟悉 node.js 的童鞋很难发挥出它巨大的威力;
不过没关系;
它的基础功能就够我们用了;
先入门;
高深的部分咱边用边学;

thinkphp 的视图模板文件就是以.html为后缀的;
写 html 的童鞋会很熟悉;
而 laravel 全框架则一个 html 文件都木有;
laravel 的前端模板用的是 blade ;
所有的模板文件都是以.blade.php为后缀;
稍微吐槽下;
作为一个喜欢精简的处女座;
有目录作为限制;
我是不喜欢这种啰嗦一长串的方式;
这给我有种 thinkphp 控制器的 .class.php 后缀的既视感;
不过这都不是问题;
就当 .blade.php.html 就行了;
该怎么写 html 还怎么写;

先来说在 html 写 php 的控制结构;
thinkphp 中把 php 的 foreach 、 if 等都定义成 html 标签的形式;
我当年还写文章讲解怎么自定义标签来着;
thinkphp 自定义模板标签 (一)
拿循环数据的 foreach 举个栗子;
thinkphp 中有 foreach 和 volist ;
写出来是下面这个样子的;

<p>下面是 foreach 标签</p>
<foreach name="list" item="vo" key="k" >
    {$k}|{$vo}
</foreach>

<p>下面是 volist 标签</p>
<volist name="list" id="vo" offset="5" length='10'>
    {$vo.name}
</volist>

吐槽完了 laravel 咱来吐槽下 thinkphp 呗;
首先 thinkphp 这种标签的形式给大家增加了学习成本;
循环个数据都有两个标签;
这就算了标签中的属性名还都不一样;
反正我是经常代码敲到要循环数据的时候;
我得先想下我是要用 foreach 还是 volist 呢?
然后再想下定义 value 的属性是 item 还是 id 呢?
最后还要考虑下这个 offset 和 length 的用法;
还有就是这些标签和 html 混搭不是很好分辨;
laravel 在这方面做的就比较优雅了;
只是加个@符号就行了;
代码就是下面这个样子了;

<p>下面是 foreach 标签</p>
@foreach($list as $k => $v)
    {{ $v['name'] }}
@endforeach

而控制循环的起止个数可以用$loop
通过上面代码;
我们也可以很容易就发现了;
thinkphp 在 html 中输出变量使用的是一个花括号{}
laravel 使用的是两个花括号{{}};

接着来讲下模板继承;
一般网站开发的时候都是有大面积的公共部分;
比如说我的博客;
顶部的导航菜单、右侧、底部都是通用的;
只有左侧是变化的;
模板继承功能就是处理这种场景的;
thinkphp 使用的是 block;
laravel 这次则反过来有两种情况;
在父级模板中;
只有简单纯文字的时候就用 yield 比如说网站 title ;
如果是大段代码的话就用 section
点到为止;详细的看文档;

有了模板文件;
就是要分配数据了;
父级模板中的那些公共部分的数据大多也是通用的;
还是比如说顶部的导航菜单、右侧、底部的数据也都是通用的;
如何共用这部分数据呢?
thinkphp 中我们是通过使用控制器继承的方式分配数据;
laravel 可以使用 View::composer ;
可以先看下官方文档 HTTP 层 —— 视图 ;
主要是通配符;
比如说我们要给前端 home 模块分配分类 category 数据;
在 /app/Providers/AppServiceProvider.php 文件的 boot 中;

// 分配前台通用的 category 数据
view()->composer('home/*', function ($view) {
    // 获取配置项
    $category = Category::all();
    $assign = [
        'category' => $category
    ];
    $view->with($assign);
});

这里需要提醒下;
第一个参数的 home/*
指的是 resources/views/home 目录;
此目录下的所有模板文件都将分配 category 数据;

控制器中分配数据和载入模板文件前面文章讲了点;
thinkphp中的分配数据是使用 assign;
以文章首页的方法为例;

public function index(){
    $assign = [
        'title' => '白俊遥文章的标题',
        'content' => '白俊遥文章的内容'
    ]
    $this->assign($assign);
    $this->display('Home/Index/index');
}

如果当前的方法要引入的html页面跟控制器目录结构一致;
那 display 是可以不传参数的;
Home 模块下的 IndexController 的 index 方法中;
display 不传参数跟传'Home/Index/index'是一样的;

$this->display()
$this->display('Home/Index/index');

到了 laravel 中就是这个样子的了;

public function index(){
    $assign = [
        'title' => '白俊遥文章的标题',
        'content' => '白俊遥文章的内容'
    ]
    return view('home.index.index', $assign);
}

laravel 用 view 函数可以实现分配和引入页面两个功能;
第一个参数是要引入的页面相对于resources/view的路径;
如果习惯 thinkphp 的用斜线分割的方式;
laravel 也是支持的;下面这两种写法是相等的;

return view('home.index.index', $assign);
return view('home/index/index', $assign);

这里推荐使用点 . 分割;
因为 phpstorm 默认是可以识别laravel项目的.分割的;
在控制器中按着 ctrl 点 'home.index.index' 是可以直接打开该文件的;
相当之方便;
如果完全复制之前文章的话;
那不是显得太懒了;
这里讲个小技巧;
可以通过 compact 函数组合 $assign 数组;
再举个栗子吧;

public function index()
{
    $article = Article::all();
    $category = Category::all();
    $tag = Tag::all();
    $assign = [
        'article' => $article,
        'category' => $category,
        'tag' => $tag
    ];
    return view('home.index.index', $assign);
}

上面代码等同于下面代码;

public function index()
{
    $article = Article::all();
    $category = Category::all();
    $tag = Tag::all();
    $assign = compact('article', 'category', 'tag');
    return view('home.index.index', $assign);
}

好了;
去掉相同的代码;
不用我说童鞋们应该也知道 compact 的作用了;
实在不明白;
查下php手册吧;

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共17条评论
白俊遥博客

:写的可以

2018-03-21 13:56:24 回复

白俊遥博客

股票买不爱:ceeef6cb32fc2027316004cb3cea94a8来看看

2018-02-04 10:32:29 回复

白俊遥博客

41802679白俊遥博客一口气 看了7篇,感觉laravel离我不远了

2018-02-03 22:37:17 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 41802679:它就在你的面前;
  • 2018-02-05 00:25:51 回复
白俊遥博客

:看看

2017-09-27 14:36:28 回复

白俊遥博客

阿根廷大大华人网:非常实用

2017-09-22 16:29:48 回复

白俊遥博客

楠楠:有微信开发吗?

2017-09-16 13:17:49 回复

白俊遥博客

...白俊遥博客博主,我想问一下你这个代码片段的效果是怎么弄得

2017-09-09 12:50:35 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 ...:http://prismjs.com/
  • 2018-02-05 00:26:37 回复
白俊遥博客

为人民服务:alert("xss")

2017-09-08 15:00:59 回复

白俊遥博客
  • 朱总 回复 为人民服务白俊遥博客测试评论
  • 2017-12-03 11:47:55 回复
白俊遥博客

十月桂花香:laravel用了一年习惯了,还是有点不舍的;现在转战ci了,不要问什么,因为跳槽了,233

2017-09-07 17:01:07 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 十月桂花香:自己写个博客接着用;
  • 2017-09-09 00:13:47 回复
白俊遥博客

楠楠:微信开发博客做吗?

2017-09-07 13:39:40 回复

白俊遥博客

爱便流通于世:代码逻辑远远比业务逻辑难。

2017-09-07 09:39:56 回复

白俊遥博客

爱便流通于世白俊遥博客

2017-09-07 09:38:33 回复

白俊遥博客

Free&quiet:想学PHP

2017-09-05 21:33:24 回复

白俊遥博客

Free&quiet:厉害了

2017-09-05 21:33:10 回复

白俊遥博客

云枫·园白俊遥博客

2017-09-05 18:24:06 回复

白俊遥博客

手贱+嘴贱白俊遥博客

2017-09-05 16:23:48 回复

白俊遥博客
  • Free&quiet 回复 手贱+嘴贱:是同行吗
  • 2017-09-05 21:33:35 回复
白俊遥博客
  • Free&quiet 回复 Free&quiet:科技化工
  • 2017-09-05 21:34:15 回复
白俊遥博客

至死方休白俊遥博客

2017-09-05 15:25:49 回复