Laravel 5.4 官方文档摘记:View类

来源:互联网 发布:永无止境 知乎 编辑:程序博客网 时间:2024/06/02 00:46

视图

调用视图

调用视图只需要view()方法就可以了,该方法的第一个参数是所要调用的视图,第二个参数则是传入该视图的参数:

Route::get('users/{name}',function($name){    return view('viewName',['name'=>$name]);});

判断视图是否存在

直接使用函数exists()

if(view()->exists('viewName')){    //code...}

视图间传递数据

视图间传递数据可以使用函数share()

view()->share('key','value');

注意上面不是数组形式!!!

视图结构

默认的视图文件是放在resource/views目录下的,但是如果你想嵌套更深一层的目录,那么可以在调用视图时使用.表示目录结构:

如你的视图文件是resource/views/admin/show.blade.php文件,那么你在调用视图的时候就要这么写,这里拿在路由中设置调用视图为例:

Route::get('user/',function(){    return view('admin.show');});

定义视图统一处理函数

想为某一视图创建一个全局有效的处理函数,就需要为该视图注册一个服务提供者。所以接下来会先介绍服务提供者相关信息,再来是如何在该服务提供者中视图处理函数。

服务提供者

创建服务提供者文件

所有的服务提供者文件都被保存在app\Providers下,所有的服务提供者都继承自Illuminate\Support\ServiceProvider类,且都会自动调用其中的boot()方法。所以你先创建一个自定义的服务提供者文件,这里就拿文档上的ComposerServiceProvider为例,创建该文件,namespace App\Providers;

注册新建的服务提供者文件

所有的服务提供者文件都被配置在config/app.php中,具体代码可以看下面:

/*    |--------------------------------------------------------------------------    | Autoloaded Service Providers    |--------------------------------------------------------------------------    |    | The service providers listed here will be automatically loaded on the    | request to your application. Feel free to add your own services to    | this array to grant expanded functionality to your applications.    |    */    'providers' => [        //这里随便举一个例子        Illuminate\Auth\AuthServiceProvider::class,    ]

所以这里把我们新建的服务提供者加入进配置文件中。

到此为止,自建的服务提供者就能运行了,当Laravel开始运行之后,我们自建的服务提供者中的boot()方法就会自动调用。

接下来就是如何使这个新建的服务提供者和我们的视图扯上关系了。

视图view类

这里我的能力暂时解决不了,但是先看文档上写在服务提供者的boot()方法中。

public function boot()    {        // 使用基于类的composers...        View::composer(            'profile', 'App\Http\ViewComposers\ProfileComposer'        );        // 使用基于闭包的composers...        View::composer('dashboard', function ($view) {});    }

看这段代码的时候我是没有弄懂他到底干了啥,于是接下来的内容纯属我猜测的。

首先来看View::composer,我看过View类的源码了,如下:

<?phpnamespace Illuminate\Support\Facades;/** * @see \Illuminate\View\Factory */class View extends Facade{    /**     * Get the registered name of the component.     *     * @return string     */    protected static function getFacadeAccessor()    {        return 'view';    }}

根本就没有composer类的静态方法,于是我就去看他继承的父类Facade,但是发现这里面的内容已经超越我现有的知识水平了。结合我们所需要调用的类:'App\Http\ViewComposers\ProfileComposer'的源码:

<?phpnamespace App\Http\ViewComposers;use Illuminate\View\View;use Illuminate\Repositories\UserRepository;class ProfileComposer{    protected $users;    //这里的UserRepository类不是重点,只是为了表示能在其中传入任何参数    public function __construct(UserRepository $users)    {        $this->users = $users;    }    public function compose(View $view)    {        $view->with('count', $this->users->count());    }}

我们发现其中也有一个composer方法,来处理业务逻辑。所以接下来就是我的猜测了:

  1. View类中根本没有composer这个方法
  2. 在服务提供者中设置的View::composer( 'profile','App\Http\ViewComposers\ProfileComposer' );表示调用App\Http\ViewComposers\ProfileComposer中的composer方法来进行处理
  3. profile表示的是将Illuminate\View\View类的一个实例profile传入该方法中作为参数

既然都说是猜了,那就很有可能是错误的,迟一点研究一下Facade类的原理,再来详细解释这个,这里,就当给自己立个Flag吧。