视图
调用视图
调用视图只需要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
类的源码了,如下:
<?php
namespace 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'
的源码:
<?php
namespace 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
方法,来处理业务逻辑。所以接下来就是我的猜测了:
- View类中根本没有
composer
这个方法 - 在服务提供者中设置的
View::composer( 'profile','App\Http\ViewComposers\ProfileComposer' );
表示调用App\Http\ViewComposers\ProfileComposer
中的composer
方法来进行处理 profile
表示的是将Illuminate\View\View
类的一个实例profile
传入该方法中作为参数
既然都说是猜了,那就很有可能是错误的,迟一点研究一下Facade
类的原理,再来详细解释这个,这里,就当给自己立个Flag吧。