peyman3d/laravel-share

Laravel 共享数据包

1.3.1 2018-06-18 06:20 UTC

This package is not auto-updated.

Last update: 2024-09-24 16:50:41 UTC


README

Laravel Share 是一种轻松通过请求共享任何数据的方法。

简介

使用 Laravel Share,您可以通过请求共享任何数据以供以后使用。您可以将其视为无处不在的数组。我的意思是!从服务提供者到路由、中间件、控制器和视图。

安装

使用 Composer 安装

$ composer require peyman3d/laravel-share

安装完成后,您应在 config/app.php 文件中添加提供者和别名。如果您正在使用 Laravel 5.5 或 5.6,则可以跳过此步骤,因为 Laravel 可以自动发现此包。

  • 添加到提供者数组
Peyman3d\Share::class,
  • 添加到别名数组
'Share' => Peyman3d\Share\ShareFacade::class,

用法

使用 Laravel Share 简单如切蛋糕。只需想象一个人,您就可以这样共享数据

Share::make('Person')
	   ->add('name', 'Peyman')
	   ->add('email', 'salam@peyman.me')
	   ->add('job', 'Web developer')
	   ->edit('title', 'Mr');

当您想要这些数据时,只需使用 Share::get('Person');;

如您所见,您可以使用 make() 方法创建一个项目。然后,您可以通过使用 add($key, $value)edit($key, $value) 添加参数到它。您还可以使用 share() 辅助函数代替 Share 门面。

share()->make('asset.js')->add('react', 'https://cdnjs.cloudflare.com/ajax/libs/react/16.4.0/umd/react.production.min.js')

有一些基本方法用于处理数据数组

// Change key
share()->key('menu');

// Make new item with key and value
share()->make($key, $value, $single);

// Create new item to current key
share()->make('menu')->item('dashboard');

// Prepend an item to current key
share()->make('menu')->prepend('posts');

// Add a child to array
share()->make('menu')->item('users')->child('users-list');

// Check if key exists
share()->key('menu')->has('dashboard');

// Get from array with key
// Second parameter is for get result as single value or collection
share()->key('menu')->get('users', true);

// Pull data from array and delete it
share()->key('menu')->pull('users', true);

// Get all data
share()->all();

// Delete data for current key
share()->key('menu.users')->delete();

// Delete all data
share()->reset();

可以共享哪些数据?

几乎任何东西。您可以共享任何字符串、数字、对象和闭包。

share()->make('user')->add('profile', auth()->user());
share()->menu('posts')->add('filter', function($value){
    return '<h3>'.$value.'</h3>';   
});

甚至更好的辅助函数

Laravel Share 有更多辅助函数来创建更好的语法。您可以使用这些辅助函数的任何组合。

share()->make('Job')->title('Senior Developer');

如您所见,title() 方法接受一个值并像 add('title', 'Senior Developer') 一样工作。

在此处查看所有辅助函数

  • id()
  • title()
  • subtitle()
  • label()
  • icon()
  • link()
  • route()
  • route_attributes()
  • href()
  • fallback()
  • callback()
  • order()
  • class()
  • desc()
  • type()
  • default()
  • options()
  • name()
  • placeholder()
  • children()
  • file()
  • src()
  • active()
  • config()
  • format()
  • permission()
  • count()
  • attributes()
  • field()
  • blade()

除了这些参数辅助函数之外,我们还有一些用于部分和类型的辅助函数

  • menu()
  • view()
  • asset()
  • js()
  • css()
  • script()
  • style()

您可以查看一些示例

// Create new menu with items
share()->menu()->item('dashboard')->label('Dashboard')->href('/admin/');
share()->menu()->item('users')->label('Users')->route('admin.users');
share()->menu('users')->child('users-profile')->label('Profile')->route('admin.users.profile');
share()->menu('users')->child('users-list')->label('All users')->route('admin.users.index');
share()->menu('users')->child('users-create')->label('Add new user')->route('admin.users.create');

// Manage Assets
share()->js('jquery')->link('https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js')->order(500);
share()->js('react')->link('https://cdnjs.cloudflare.com/ajax/libs/react/16.4.0/umd/react.production.min.js')->order(300);

自定义辅助函数

我添加了一些对我有用的基本辅助函数,但您也可以添加您自己的。您还可以删除或编辑项目。下面是一些示例

// Arguments
share()->addArg('avatar');
share()->removeArg('icon');
share()->editArg('subtitle', 'second-title');
if( share()->hasArg('config') ){
    share()->editArg('config', 'setting');
}

// Keys
share()->addKey('table');
share()->removeKey('view');
share()->editKey('asset', 'libraries');
if( share()->hasKey('menu') ){
    share()->editKey('menu', 'menus');
}

只是一个示例

想象一下,您有一个具有侧边栏菜单的仪表板。此菜单有多个项目,每个项目可能有子项目。现在,我们在菜单中添加一些项目

// Add dashboard
share()->menu()->item('dashboard')->label('Dashboard')->icon('fa fa-dashboard')->route('admin.dashboard');

// Add posts and it's sub items
share()->menu()->item('posts')->label('Posts')
               ->icon('fa fa-file-text-o')->route('admin.posts');
share()->menu('posts')->child('posts-list')->label('All posts')
                      ->route('admin.posts.index');
share()->menu('posts')->child('posts-create')->label('Add new post')
                      ->route('admin.posts.create');

// Add setting
share()->menu()->item('settings')->label('Settings')->icon('fa fa-cogs');
foreach($setting_pages as $page){
    share()->menu('settings')->child('setting-page-'.$page['id'])->label($page['label'])
                          ->route('admin.settings')
                          ->route_attributes(['slug'=>$page['slug']]);
}

这些代码可以在任何地方:服务提供者、路由、中间件、控制器、模型,甚至是 blade 视图。如果您想的话,您还可以激活一个菜单项,如下所示

// PostController.php

public function index(){
    share()->key('menu.posts')->activate();
    share()->key('menu.posts.children.posts-list')->activate();
}

您可以使用 order() 方法对项目进行排序。您可以在添加项目或任何其他时间和地点进行此操作。

// AdminMiddleware.php

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        share()->key('menu.posts')->order(100);
    
	    return $next($request);
    }
}

如果您没有设置顺序,它将计为 100。

最后,您可以在 blade 视图中使用这些数据,如 sidebar.blade.php,就像这样简单

<aside id="sidebar">

    <ul class="menu">
    
        @foreach( share()->menu()->get() as $item )
        
            <li class="menu-item @if( array_has($item, 'children') ) has-child @endif @if(array_get($menu_item, 'active', false)) active @endif">
            
                <a href="{{ make_menu_link($item) }}">
                    <i class="{{ array_get($item, 'icon') }}"></i>
                    <span class="title">{{ array_get($item, 'label') }}</span>
                </a>

                @if( array_has($item, 'children') )
                    <ul class="sub-menu" @if(array_get($menu_item, 'active', false)) style="display: block;" @endif>
                        @foreach( $item['children'] as $subitem )
                            <li><a href="{{ make_menu_link($subitem) }}">{{ $subitem['label'] }}</a></li>
                        @endforeach
                    </ul>
                @endif

            </li>
        
        @endforeach
    
    </ul>

</aside>

这就是全部!只有一个事情。我使用了一个名为 make_menu_link() 的辅助函数,我编写了它来根据它具有的内容创建项目链接。它不在包中,因为它可能对您没有用处。但您可以在此链接中获取它。