Laravel5.1学习笔记7 视图

视图 (View)

 

#基本用法

视图里面包含了你应用程序所提供的 HTML 代码,并且提供一个简单的方式来分离控制器和网页呈现上的逻辑。视图被保存在 resources/views 文件夹内。

一个简单的视图看起来可能像这样:

<!-- 视图被保存在 resources/views/greeting.php -->

<html>
    <body>
        <h1>Hello, <?php echo $name; ?></h1>
    </body>
</html>

这个视图可以使用以下的代码传递到用户的浏览器:

Route::get(‘/‘, function()
{
    return view(‘greeting‘, [‘name‘ => ‘James‘]);
});

如你所见,view 辅助方法的第一个参数会对应到 resources/views 文件夹内视图文件的名称;传递到 view辅助方法的第二个参数是一个能够在视图内取用的数据数组。

当然,视图文件也可以被存放在 resources/views 的子文件夹内。举例来说,如果你的视图文件保存在resources/views/admin/profile.php,你可以用以下的代码来返回:

return view(‘admin.profile‘, $data);
传递数据到视图
// 使用传统的方法
$view = view(‘greeting‘)->with(‘name‘, ‘Victoria‘);

// 使用魔术方法
$view = view(‘greeting‘)->withName(‘Victoria‘);

在上面的例子代码中,视图将可以使用 $name 来取得数据,其值为 Victoria

如果你想的话,还有一种方式就是直接在 view 辅助方法的第二个参数直接传递一个数组:

$view = view(‘greetings‘, $data);

如果你使用上面的方法来进行数据传参, $data 必须是 键/值 对应的数组数据, 这样在视图里面, 你可以使用对应的键来获取值, 如: {{ $key }} 会取得 $data[‘key‘] 对应的数据.

把数据共享给所有视图

有时候你可能需要共享一些数据给你的所有视图,你有很多个选择:view 辅助方法;Illuminate\Contracts\View\Factory 合约 (contract);在 视图组件 (view composer) 内使用通配符。

这里有个 view 辅助方法的例子:

view()->share(‘data‘, [1, 2, 3]);

你也可以使用 view 的 Facade:

View::share(‘data‘, [1, 2, 3]);

通常你应该在服务提供者的 boot 方法内使用 share 方法。你可以选择加在 AppServiceProvider 或者是新建一个单独的服务提供者来容纳这些代码。

备注:view 辅助方法没有带入任何参数调用时,它将会返回一个的 Illuminate\Contracts\View\Factory合约 (contract) 的实现 (implementation)。

确认视图是否存在

如果你需要确认视图是否存在,使用 exists 方法:

if (view()->exists(‘emails.customer‘))
{
    //
}
从一个文件路径产生视图

你可以从一个完整的文件路径来产生一个视图:

return view()->file($pathToFile, $data);

视图组件

视图组件就是在视图被渲染前,会调用的闭包或类方法。如果你想在每次渲染某些视图时绑定数据,视图组件可以把这样的程序逻辑组织在同一个地方。

定义一个视图组件

让我们在 服务提供者 内组织我们的视图组件。底下例子将使用 View Facade 来取得底层Illuminate\Contracts\View\Factory 合约的实现:

<?php namespace App\Providers;

use View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider {

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // 使用类来指定视图组件
        View::composer(‘profile‘, ‘App\Http\ViewComposers\ProfileComposer‘);

        // 使用闭包来指定视图组件
        View::composer(‘dashboard‘, function($view)
        {

        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }

}

备注: Laravel 没有默认的文件夹来放置类形式的视图组件。你可以自由的把它们放在你想要的地方。举例来说,你可以放在 App\Http\ViewComposers 文件夹内。

记得要把这个服务提供者添加到 config/app.php 配置文件的 providers 数组中。

现在我们已经注册了视图组件,并且在每次 profile 视图渲染的时候,[email protected] 都将会被执行。接下来我们来看看这个类要如何定义:

<?php namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Users\Repository as UserRepository;

class ProfileComposer {

    /**
     * The user repository implementation.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * Create a new profile composer.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // service container 会自动解析所需的参数
        $this->users = $users;
    }

    /**
     * Bind data to the view.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with(‘count‘, $this->users->count());
    }

}

在视图被渲染之前,视图组件的 compose 方法就会被调用,并且传入一个 Illuminate\Contracts\View\View 实例。你可以使用 with 方法来把数据绑定到 view

备注: 所有的视图组件会被 服务容器 (service container) 解析,所以你需要在视图组件的构造器类型限制你所需的任何依赖参数。

在视图组件内使用通配符

Viewcomposer 方法可以接受 * 作为通配符,所以你可以对所有视图附加 composer 如下:

View::composer(‘*‘, function($view)
{
    //
});
同时对多个视图附加视图组件

你也可以同时针对多个视图附加同一个视图组件:

View::composer([‘profile‘, ‘dashboard‘], ‘App\Http\ViewComposers\MyViewComposer‘);
定义多个视图组件

你可以使用 composers 方法来同时定义一群视图组件:

View::composers([
    ‘App\Http\ViewComposers\AdminComposer‘ => [‘admin.index‘, ‘admin.profile‘],
    ‘App\Http\ViewComposers\UserComposer‘ => ‘user‘,
    ‘App\Http\ViewComposers\ProductComposer‘ => ‘product‘
]);
视图创建者

视图 创建者 几乎和视图组件运作方式一样;只是视图创建者会在视图初始化后就立刻执行。要注册一个创建者,只要使用 creator 方法:

View::creator(‘profile‘, ‘App\Http\ViewCreators\ProfileCreator‘);
时间: 2024-10-13 18:33:37

Laravel5.1学习笔记7 视图的相关文章

iOS学习笔记——滚动视图(scrollView)

滚动视图:在根视图中添加UIScrollViewDelegate协议,声明一些对象属性 @interface BoViewController : UIViewController<UIScrollViewDelegate> //滚动视图对象 @property (retain, nonatomic) UIScrollView *scrollView; //视图中小圆点,对应视图的页码 @property (retain, nonatomic) UIPageControl *pageContr

MySQL学习笔记之视图

视图是对磁盘上保存的表数据的抽象,即抽取一个表或多个表的部分行或列的数据,展示给使用者. 首先列举下MySQL中最简单的对视图操作的语法: 1.创建视图: create view 视图名 as select语句 例如: create view v_fruit as select name,place,weight from t_fruit where weight<=12; 据我所知,“as”后面的语句肯定都是以“select”开头的,可以理解成视图的创建结果就是一张新的表格,表格里面有哪些东西

Djang学习笔记3视图和URL配置

1. 页面内容 : 一个网页通过一个视图函数(view function)来展示, 如何把它放到网站服务器中呢,通过url (定义在URLconf)中 View: 视图有时候非常简单都是完整的函数和导入声明 from django.http import HttpResponse def hello(request): return HttpResponse("Hello world") 首先,我们从 django.http 模块导入(import) HttpResponse 类.和

django book学习笔记——高级视图和URL配置

1.URLconf技巧 1).流线型化函数导入 在 URLconf 中的每一个入口包括了它所联系的视图函数,直接传入了一个函数对象. 这就意味着需要在模块开始处导入视图函数.但随着 Django 应用变得复杂,它的 URLconf 也在增长,并且维护这些导入可能使得管理变麻烦. 为了避免这种麻烦,Django 提供了一种方法可以在 URLconf 中为某个特别的模式指定视图函数: 你可以传入一个包含模块名和函数名的字符串,而不是函数对象本身.例如: from django.conf.urls.d

学习笔记-mysql_视图

视图: create [or replace] [algorithm ={undefined|merge|temptable}] view view_name [(column_list)] as select_statement [with [cascaded|local] check option] replace 替换已经创建的视图 algorithm 视图选择的算法 undefind mysql将自动选择算法 merge将使用的视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对

Laravel5.1学习笔记6 响应

基本响应 附加头信息到响应 附加Cookie到响应 其他响应 View视图响应 JSON响应 File下载 重定向 重定向到命名路由 重定向到控制器Action 附带闪回Session数据重定向 响应宏   #基本响应 从路由返回字串 最基本的响应就是从 Laravel 的路由返回字串: Route::get('/', function(){ return 'Hello World';}); 建立自定义响应 但是以大部分的路由及控制器所执行的动作来说,你需要返回完整的 Illuminate\Ht

Laravel5.1 学习笔记1, 目录结构和命名空间(待修)

自从用 Laravel4做了个小网站,使用了数据库ORM Eloquent, 就放下了一段时间,想不到这个与Asp.net MVC 有着异曲同工之妙的框架已经出了下个版本,而且还有不小的改动,因此不得不从头过一次,顺便更新一下知识点. 下面内容摘自Laravel 5.0 系列, 目录结构和命名空间 Laravel从4升级到5 ,改变的不只是文件的组织方式,而且是思想上的重大转变. 废话不多说, 新版本的目录. app Console Commands Events Exceptions Http

Laravel5.1学习笔记8 Blade模板

简介 模板继承 定义一个页面布局模板 扩展一个页面布局模板 展示数据 控制语法的结构 Service Injection 扩展 Blade   简介 Blade 是 Laravel 提供的一个既简单又强大的模板引擎.和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图(view)中使用原生 PHP 代码.所有 Blade 视图页面都将被编译成原生 PHP 代码并缓存起来,除非你的模板文件被修改了,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何额外负担.Bla

backbone学习笔记:视图(View)

Backbone 视图对象主要用来渲染数据,监听事件. Backbone的视图对象可以展示Model数据,也可以把用户编辑的Model数据传递到后台,可以通过监听事件操作视图里的DOM元素 举例: var PreviewInvoiceItemView=Backbone.View.extend({ el:'#itemList', template: _.template($('#InvoiceItem').html()), initialize:function(){ this.template=