monospice/laravel-view-composers

Laravel 视图组合器和视图创建器的直观抽象

1.0.1 2015-10-01 15:00 UTC

This package is auto-updated.

Last update: 2024-09-21 20:13:29 UTC


README

Build Status

Laravel 视图组合器和视图创建器的直观抽象。

Laravel 中的视图组合器通过整合视图的独立于控制器的数据绑定逻辑来改进应用程序结构。

此包提供了一种可读的样板框架,可轻松定义 Laravel 应用程序中的视图组合器和视图创建器绑定。

兼容 Laravel 4 和 5+。有关视图组合器和视图创建器的更多信息,请参阅Laravel 文档

简单示例

在以下示例中,应用程序将使用 MyViewComposer 组合 myview,使用 UserComposer 组合 user.profileuser.image 视图,并使用 UserComposerFavoritesComposer 组合 user.favorites 视图。

class ViewComposerServiceProvider extends ViewBinderServiceProvider
{
    protected function bindViews()
    {
        $this->compose('myview')->with('MyViewComposer');
    }

    protected function bindUserViews()
    {
        $this->setPrefix('user')
            ->compose('profile', 'image')->with('UserComposer')
            ->compose('favorites')->with('UserComposer', 'FavoritesComposer');
    }

    // ...and so on!
}

安装

简单通过 composer 安装

$ composer require monospice/laravel-view-composers

创建服务提供者

服务提供者负责在应用程序启动时处理视图绑定工作。只需在此包中扩展服务提供者即可

use Monospice\LaravelViewComposers\ViewBinderServiceProvider;

class ViewComposerServiceProvider extends ViewBinderServiceProvider
{
    // View Composer and View Creator bindings will go here
}

别忘了将新服务提供者添加到 app.config

...
    // Laravel >= 5.1:
    App\Providers\ViewComposerServiceProvider::class,
    // Laravel < 5.1:
    'App\Providers\ViewComposerServiceProvider',
...

无需声明 register()boot() 方法。包的服务提供者会处理这些。

绑定视图

在安装期间创建的服务提供者中定义视图组合器和视图创建器绑定。

定义必须放置在以 "bind" 开头并以 "Views" 结尾的方法中,例如 bindViews()bindAnythingGoesHereViews()。这种约定鼓励将相关的视图绑定组合成可读的组

class ViewComposerServiceProvider extends ViewBinderServiceProvider
{
    protected function bindCommentViews()
    {
        // all comment-related view bindings go here
    }
}

命名空间

为了使这些定义更简洁,请使用 setNamespace() 方法声明用于以下视图组合器或视图创建器类的命名空间。

...
    protected function bindCommentViews()
    {
        // The hard way
        $this->compose('view')->with('App\Http\ViewComposers\CommentComposer');

        // or just:
        $this->setNamespace('App\Http\ViewComposers')
            ->compose('view2')->with('CommentComposer')
            ->compose('view3')->with('AnotherComposer');
    }
...

在上面的示例中,服务提供者将 App\Http\ViewComposers 命名空间应用于 CommentComposerAnotherComposer 类。

可以通过再次调用 setNamespace() 来在任何时候更改命名空间。每个 bindViews() 方法结束时都会自动清除任何命名空间。

视图前缀

类似于上面的命名空间,可以通过调用 setPrefix() 为绑定的视图设置类似命名空间的名称前缀,以使代码更简洁

...
    protected function bindNavbarViews()
    {
        // The hard way
        $this->compose('partials.navbar.info.user')->with('NavbarComposer');

        // or just:
        $this->setPrefix('partials.navbar.info')
            ->compose('user', 'company')->with('NavbarComposer');
    }
...

如所示,应用程序将 partials.navbar.info.userpartials.navbar.info.company 视图绑定到 NavbarComposer

可以通过再次调用 setPrefix() 来在任何时候更改前缀。每个 bindViews() 方法结束时都会自动清除任何前缀。

视图组合器

使用 compose() 方法指定应用程序应将哪些视图绑定到特定的视图组合器,并使用 with() 指定要使用哪个视图组合器。在 with() 中指定的视图组合器可以是类名或匿名函数,如Laravel 文档中所述

...
    protected function bindProductViews()
    {
        $this->setNamespace('App\Http\ViewComposers')->setPrefix('product');

        $this
            ->compose('index', 'search')->with('ProductComposer')
            ->compose('show')->with(function ($view) {
                // view composer logic here
            });
    }
...

视图创建器

类似于视图组合器,使用 create() 方法指定应用程序应将哪些视图绑定到特定的视图创建器。

...
    protected function bindStudentViews()
    {
        $this->setNamespace('App\Http\ViewCreators')->setPrefix('dashboard');

        $this
            ->create('student', 'teacher')->with('DashboardCreator')
            ->create('feed')->with(function ($view) {
                // view creater logic here
            });
    }
...

测试

Laravel 视图组合器包使用 PHPSpec 来测试对象行为

$ vendor/bin/phpspec run

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅LICENSE 文件