Laravel 文档阅读:视图
创建视图
视图将业务逻辑和表现层分离。视图文件位于 resources/views
目录下。一个简单的视图文件看起来是这样的:
<!-- View stored in resources/views/greeting.blade.php -->
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>
我们可以用全局 view
辅助函数返回这个视图:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
传递给 view
函数的第一个参数是视图文件的路径,这个路径是相对于 resources/views
这个目录的;第二个参数是传递给视图文件的数据,是一个数组,数组里的数据可在视图文件中取得。在上面的例子里,我们给 greeting.blade.php
这个视图文件传递了一个 name
变量,在 Blade 模板里使用 {{ }}
符号解析、显示了这个变量值。
当然,如果视图文件是保存在 resources/views
这个目录下的子目录里的,我们就要用点(.
)符号引用视图了。例如,如果视图文件地址是 resources/views/admin/profile.blade.php
,你就要这样引用它。
return view('admin.profile', $data);
判断视图是否存在
使用 View
门面的 exists
方法,判断视图文件是否存在。该方法返回一个布尔值,true
表示文件存在,false
表示文件不存在。
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
返回第一个可用视图
使用 first
方法,返回给定的数组列表里,第一个可用的视图文件。这对于要自定义
或重写视图文件的应用程序和包非常有用:
return view()->first(['custom.admin', 'admin'], $data);
当然,也可以通过 View
门面调用这个方法:
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
向视图传递数据
之前的例子中已经演示过,你可以以数组的形式向视图传递数据:
return view('greetings', ['name' => '维多利亚']);
以这种方式传递的数据,都是键值对的形式。在视图文件里,使用键来获得对应的值,比如:<?php echo $key; ?>
。如果传递给视图的只有一条数据,那么使用 view
辅助函数上的 with
方法吧!
return view('greeting')->with('name', 'Victoria');
视图共享数据
偶尔,所有视图里可能都使用了同样的一些数据,我们称这些数据是「视图共享数据」。共享数据使用的是 View::share()
方法,你可以在服务提供者的 boot
中设定这些共享数据。下面,我们在 AppServiceProvider
中设定了一条共享数据:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
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()
{
//
}
}
视图 Composers
「视图 Composers」这个名字听起来很酷炫,但是必须要解释一番才知道意思。
视图 Composers 是在视图渲染时,调用的一个回调函数或者类方法(没错,就干这个的)。你可能会在视图渲染、并为视图绑定数据时用到它,一个视图 Composer 能把这些视图渲染时,做的绑定逻辑维护在一个地方。
我们在服务提供者中注册视图 Composer。我们使用 View
门面访问底层 Illuminate\Contracts\View\Factory
契约实现。记住,Laravel 没有为视图 Composer 创建默认目录,你可以自由组织。例如,你可以创建一个 app/Http/ViewComposers
目录。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// Using Closure based composers...
View::composer('dashboard', function ($view) {
//
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
注意!如果你是在一个新的服务提供者中注册视图 Composer 的,不要忘记在
config/app.php
配置文件的providers
数组里,添加该服务提供者。
注册好 Composer 后,每次 profile
视图渲染的时候,都会调用 ProfileComposer@compose
方法。
<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use App\Repositories\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)
{
// Dependencies automatically resolved by 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());
}
}
就在视图渲染之前,Illuminate\View\View
实例就会调用 Composer 的 compose
方法。在此,你可以使用 with
方法向视图绑定数据。
提示! 视图 Composer 都是通过服务容器解析的,所以可以在 Composer 的构造函数里使用依赖注入。
把一个 Composer 附加给多个视图
你可以给 composer
方法传递第一个数组参数,数组是视图列表,通过这种方式,把一个 Composer 附加给多个视图。
View::composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
composer
方法也接受星号(*
)通配符,把一个 Composer 附加给所有视图:
View::composer('*', function ($view) {
//
});
视图 Creators
视图 Creator 和视图 Composer 几乎是一样的,只是调用时机不同。视图 Creator 是在视图实例化后立即执行的,视图 Composer 是在视图即将渲染时执行的。注册一个视图 Creator,使用 creator
方法:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
本作品采用《CC 协议》,转载必须注明作者和本文链接