• 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);
     
     

    检查视图是否存在

    如果你需要检查views是否存在,你需要使用exists方法 , 在调用无参数view辅助方法之后使用,这个方法返回true ,如果视图存在,当无参数的view辅助方法调用后,一个IlluminateContractsViewFactory 实例被返回, 你可以使用实例里面的任何方法。

    if (view()->exists('emails.customer')) {
    //
    }

     

    #传递数据到视图

    // 使用传统的方法
    $view = view('greeting')->with('name', 'Victoria');

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

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

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

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

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

     

    #把数据共享给所有视图

    有时候你可能需要共享一些数据给你的所有视图,你有很多个选择:share辅助方法;

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

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

    你也可以使用 view 的 Facade:

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

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

    码。

    <?php

    namespace AppProviders;

    class AppServiceProvider extends ServiceProvider
    {
    /**
    * Bootstrap any application services.
    *
    * @return void
    */
    public function boot()
    {
    view()->share('key', 'value');
    }

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

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

    从一个文件路径产生视图

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

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

    #视图组件 View Composers

    View composers are callbacks or class methods that are called when a view is rendered. If you have data that you want to be bound to a view each time that view is rendered, a view composer can help you organize that logic into a single location.

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

    Let's register our view composers within a service provider. We'll use the view helper to access the underlying IlluminateContractsViewFactory contract implementation. Remember, Laravel does not include a default directory for view composers. You are free to organize them however you wish. For example, you could create anAppHttpViewComposers directory:

    让我们在 服务提供者 内组织我们的视图组件。底下例子将使用 View 辅助类来取得底层IlluminateContractsViewFactory 合约的实现:

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

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

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

    <?php

    namespace AppProviders;

    use IlluminateSupportServiceProvider;

    class ComposerServiceProvider extends ServiceProvider
    {
    /**
    * Register bindings in the container.
    *
    * @return void
    */
    public function boot()
    {
    // Using class based composers...
    view()->composer(
    'profile', 'AppHttpViewComposersProfileComposer'
    );

    // Using Closure based composers...
    view()->composer('dashboard', function ($view) {

    });
    }

    /**
    * Register the service provider.
    *
    * @return void
    */
    public function register()
    {
    //
    }
    }
     
    记住,如果你创建一个新的服务提供者来包含你的view composer registrations,你将需要把服务提供者添加到config/app.php  配置文件的providers  数组中
     
    我们现在已经注册了composer,  那么 ProfileComposer@compose方法就会在每次profile渲染的时候被执行, 让我们定义composer类
    <?php namespace AppHttpViewComposers;

    use IlluminateContractsViewView;
    use IlluminateUsersRepository 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 方法就会被调用,并且传入一个 IlluminateContractsViewView 实例。你可以使用 with 方法来把数据绑定到 view

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

     

     

    在视图组件内使用通配符

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

    View::composer('*', function($view)
    {
    //
    });

    同时对多个视图附加视图组件

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

    View::composer(['profile', 'dashboard'], 'AppHttpViewComposersMyViewComposer');

    定义多个视图组件 (5.1文档删除了这个部分)

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

    View::composers([
    'AppHttpViewComposersAdminComposer' => ['admin.index', 'admin.profile'],
    'AppHttpViewComposersUserComposer' => 'user',
    'AppHttpViewComposersProductComposer' => 'product'
    ]);

     

    视图创建者

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

    View::creator('profile', 'AppHttpViewCreatorsProfileCreator');

  • 相关阅读:
    umeng社交分享最新版5.0的跨进程使用崩溃的问题及解法-Android
    AlertDialog禁止返回键
    一个男人想经商,不读 100本商人自传,怎么会了解商人的思维状态
    Android中使用Gson解析JSON数据的两种方法
    DevExpress gridControl控件动态绑定列 zt
    获得WCF Client端的本地端口 z
    log4net.dll配置以及在项目中应用 zt
    系统交易策略 hylt
    判斷作業系統為 64bit 或 32bit z
    路徑 z
  • 原文地址:https://www.cnblogs.com/grkin/p/4609582.html
Copyright © 2020-2023  润新知