morningtrain/laravel-context

Laravel 的上下文辅助包

3.1.0 2023-06-28 09:50 UTC

README

安装

可以使用以下命令从 Packagist 安装 Laravel Context 包

composer require morningtrain/laravel-context

门面设置

有一个门面助手用于访问当前上下文。请使用以下片段将其添加为 config/app.php 的别名。

'Context' => MorningTrain\Laravel\Context\Context::class,

服务提供者

上下文配置在服务提供者中。在 app/Providers 中添加一个扩展 MorningTrain\Laravel\Context\ContextServiceProvider 的服务提供者

这可以是一个典型的启动器 ContextServiceProvider,同时也应该在 Laravel 的 config/app.php 配置文件中注册。

<?php

namespace App\Providers;

use App\Context\BaseContext;
use App\Context\App\AppContext;
use MorningTrain\Laravel\Context\ContextServiceProvider as ServiceProvider;
use MorningTrain\Laravel\Context\Plugins\Assets\AssetsPlugin;
use MorningTrain\Laravel\Context\Plugins\Env\EnvPlugin;
use MorningTrain\Laravel\Context\Plugins\Menus\MenusPlugin;
use MorningTrain\Laravel\Context\Plugins\Meta\MetaPlugin;
use MorningTrain\Laravel\Context\Plugins\Routes\RoutesPlugin;

class ContextServiceProvider extends ServiceProvider
{

    /**
     * Plugins to load
     *
     * @var array
     */
    protected $plugins = [
        AssetsPlugin::class,
        EnvPlugin::class,
        MenusPlugin::class,
        RoutesPlugin::class,
        MetaPlugin::class
    ];

    /**
     * Features to define
     *
     * @var array
     */
    protected $contexts = [
        'base'  => BaseContext::class,
        'app'   => AppContext::class,
    ];

    /**
     * Features to load
     *
     * @var array
     */
    protected $load = [
        'base'
    ];

}

它包含 3 个需要配置的属性。

插件是扩展上下文系统正常行为的功能性额外功能。

上面显示的插件是通常使用的插件 - 它们都包含在上下文包中。可以开发特定于项目的插件并将其连接到这里。

contexts 属性定义了系统中所有可用的上下文数组。它们将按配置名称引用。稍后将定义上下文类。

load 定义了应自动加载的上下文。上下文需要在此处定义或手动加载才能提供任何功能。

上下文类

这是一个基本 AppContext 类的示例。

<?php

namespace App\Context\App;

use MorningTrain\Laravel\Context\Context;

class AppContext
{

    public function load()
    {
        // Provide the app name to ENV
        Context::env(function () {
            return [
                'app' => [
                    'name' => config('app.name')
                ]
            ];
        });

        // Load assets
        Context::load(Assets::class);

    }

}

在闭包中添加到 env 方法的数组中的任何内容都将合并到该上下文的 env 变量中。它可以用于提供一组变量,例如 JavaScript。

注意最后的 Context::load(Asset::class) 调用。Asset 类是一个简单的类,包含一个加载方法。这不是必需的,但是一种将上下文加载分割成多个更小、更易于维护的类的方法。

这是 Asset 类的基本示例。

<?php

namespace App\Context\App;

use MorningTrain\Laravel\Context\Context;

class Assets
{

    protected $manifest = '';

    public function load()
    {
        Context::stylesheets([
            asset(mix('css/app.css', $this->manifest))
        ]);

        Context::scripts([
            asset(mix('js/manifest.js', $this->manifest)),
            asset(mix('js/vendor.js', $this->manifest)),
            asset(mix('js/app.js', $this->manifest))
        ]);
    }

}

在这里配置样式表和 JavaScript,并将其提供给 HTML blade 视图。这允许更动态地加载脚本,并保持基础 HTML 模板整洁。

上下文提供者

上下文提供者是在版本 2.5.0 中添加的,是一种更新上下文类结构的做法。

新功能包括直接从任何上下文提供者注册插件的能力,这意味着可以删除 ContextServiceProvider 中的插件。这种将插件注册从服务提供者中分离出来的转变将使插件依赖项归因于实际实现它们的类。

上面的 Asset 示例和类似的类现在称为 部分,可以从任何上下文提供者自动加载。

建议这些部分也扩展 ContextProvider 基类以获得对插件的支持。

注意,鼓励将上下文类拆分为部分,而不是在上下文类中放置自定义逻辑。

AppContext 示例将如下所示(不包含 app 名称示例)。

<?php

namespace App\Context\App;

use MorningTrain\Laravel\Context\ContextProvider;

class AppContext extends ContextProvider
{

    protected $partials = [
        Assets::class,
    ];

}

和 Assets 类如下所示

<?php

namespace App\Context\App;

use MorningTrain\Laravel\Context\Context;
use MorningTrain\Laravel\Context\ContextProvider;
use MorningTrain\Laravel\Context\Plugins\Assets\AssetsPlugin;

class Assets extends ContextProvider
{

    public static $plugins = [
        AssetsPlugin::class
    ];
    
    protected $manifest = '';

    public function load()
    {
        Context::stylesheets([
            asset(mix('css/app.css', $this->manifest))
        ]);

        Context::scripts([
            asset(mix('js/manifest.js', $this->manifest)),
            asset(mix('js/vendor.js', $this->manifest)),
            asset(mix('js/app.js', $this->manifest))
        ]);
    }

}

中间件

请记住将上下文中间件添加到 app\Http\Kernel.php

以下片段应作为路由中间件添加。

'context' => \MorningTrain\Laravel\Context\Middleware\LoadFeatures::class,

要与上下文提供者一起工作,应使用更新的版本

‘context’ => \MorningTrain\Laravel\Context\Middleware\LoadContexts::class,

为了保持向后兼容性,目前仍然保留旧的中间件。

加载上下文

除了在服务提供程序中加载上下文外,人们还会使用上下文中间件来加载上下文。

将此中间件添加到任何路由组中,以在加载这些路由时加载 app 上下文。

'context:app'

这样,该组下的任何路由都将能够访问添加到app上下文中的任何信息。

包括脚本和样式表

{!! Context::stylesheets() !!} 添加到文档的头部,以生成所有已排队的样式表的HTML标签。

{!! Context::scripts() !!} 添加到HTML的底部,以生成所有已排队的JavaScript文件的脚本标签。

向JavaScript提供ENV

请使用以下脚本在您的blade HTML模板中自动生成一个JavaScript对象类 env

它将是一个表示加载的上下文中构建的整个环境的对象。

{!! Context::env() !!}

致谢

此包由Morningtrain开发和积极维护。

 _- _ -__ - -- _ _ - --- __ ----- _ --_  
(         Morningtrain, Denmark         )
 `---__- --__ _ --- _ -- ___ - - _ --_ ´ 
     o                                   
    .  ____                              
  _||__|  |  ______   ______   ______ 
 (        | |      | |      | |      |
 /-()---() ~ ()--() ~ ()--() ~ ()--() 
--------------------------------------