Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有多个变量的Laravel 5视图生成器_Php_Laravel_Laravel 5 - Fatal编程技术网

Php 具有多个变量的Laravel 5视图生成器

Php 具有多个变量的Laravel 5视图生成器,php,laravel,laravel-5,Php,Laravel,Laravel 5,有没有更优雅的方式: abstract class Controller extends BaseController { use DispatchesJobs, ValidatesRequests; function __construct() { view()->composer('includes.topbar', function ($view) { $view->with('nav', $this->topNa

有没有更优雅的方式:

abstract class Controller extends BaseController
{
    use DispatchesJobs, ValidatesRequests;

    function __construct() {
        view()->composer('includes.topbar', function ($view) {
            $view->with('nav', $this->topNav());
        });
        view()->composer('includes.sidebar', function ($view) {
            $view->with('sidebar', $this->sidebar());
        });
    }
    ...
}
?


使用视图生成器:

NavigationComposer

 namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;

class NavigationComposer
{
    protected $user;

    public function __construct()
    {
        $this->user = Auth::user();
    }

    public function compose(View $view)
    {
        $view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }

    public function sidebar()
    {
        return 'sidebar';
    }
}
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        view()->composer(
            'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
        );
        view()->composer(
            'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
        );
    }
    ...
}
...
public function boot()
    {
        // Using class based composers...
        view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
        view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
    }
...
...
public function compose(View $view)
    {
        $view->with('nav', $this->topNav());
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }
...
...
public function compose(View $view)
    {
        $view->with('sidebar', $this->sidebar());
    }

    public function sidebar()
    {
        return 'sidebar';
    }
...
Composer服务提供商

 namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;

class NavigationComposer
{
    protected $user;

    public function __construct()
    {
        $this->user = Auth::user();
    }

    public function compose(View $view)
    {
        $view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }

    public function sidebar()
    {
        return 'sidebar';
    }
}
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        view()->composer(
            'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
        );
        view()->composer(
            'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
        );
    }
    ...
}
...
public function boot()
    {
        // Using class based composers...
        view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
        view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
    }
...
...
public function compose(View $view)
    {
        $view->with('nav', $this->topNav());
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }
...
...
public function compose(View $view)
    {
        $view->with('sidebar', $this->sidebar());
    }

    public function sidebar()
    {
        return 'sidebar';
    }
...

根据@Gal的建议,我已将它们一分为二

Composer服务提供商

 namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;

class NavigationComposer
{
    protected $user;

    public function __construct()
    {
        $this->user = Auth::user();
    }

    public function compose(View $view)
    {
        $view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }

    public function sidebar()
    {
        return 'sidebar';
    }
}
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        view()->composer(
            'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
        );
        view()->composer(
            'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
        );
    }
    ...
}
...
public function boot()
    {
        // Using class based composers...
        view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
        view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
    }
...
...
public function compose(View $view)
    {
        $view->with('nav', $this->topNav());
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }
...
...
public function compose(View $view)
    {
        $view->with('sidebar', $this->sidebar());
    }

    public function sidebar()
    {
        return 'sidebar';
    }
...
TopNavigationComposer

 namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;

class NavigationComposer
{
    protected $user;

    public function __construct()
    {
        $this->user = Auth::user();
    }

    public function compose(View $view)
    {
        $view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }

    public function sidebar()
    {
        return 'sidebar';
    }
}
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        view()->composer(
            'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
        );
        view()->composer(
            'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
        );
    }
    ...
}
...
public function boot()
    {
        // Using class based composers...
        view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
        view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
    }
...
...
public function compose(View $view)
    {
        $view->with('nav', $this->topNav());
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }
...
...
public function compose(View $view)
    {
        $view->with('sidebar', $this->sidebar());
    }

    public function sidebar()
    {
        return 'sidebar';
    }
...
SidebarComposer

 namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;

class NavigationComposer
{
    protected $user;

    public function __construct()
    {
        $this->user = Auth::user();
    }

    public function compose(View $view)
    {
        $view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }

    public function sidebar()
    {
        return 'sidebar';
    }
}
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        view()->composer(
            'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
        );
        view()->composer(
            'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
        );
    }
    ...
}
...
public function boot()
    {
        // Using class based composers...
        view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
        view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
    }
...
...
public function compose(View $view)
    {
        $view->with('nav', $this->topNav());
    }

    public function topNav()
    {
        $nav['Dashboard'] = [
            'route' => 'dashboard'
        ];
        $nav['Sales'] = [
            'route' => 'sales',
            'subitems' => [
                'Enquiries' => 'sales.enquiries',
                'Quotes' => 'sales.quotes',
                'Orders' => 'sales.orders'
            ]
        ];
        $nav['CRM'] = [
            'route' => 'crm',
            'subitems' => [
                'Companies' => 'crm.companies',
                'Conversion report' => 'crm.conversion-report'
            ]
        ];
        return $nav;
    }
...
...
public function compose(View $view)
    {
        $view->with('sidebar', $this->sidebar());
    }

    public function sidebar()
    {
        return 'sidebar';
    }
...

如果只想在主布局中访问局部视图,可以执行以下操作

在主布局中,为局部视图创建剖面:

@section('partial_view_1')
@show
@section('partial_view_2')
@show
在控制器的构造函数中,执行此操作时,请确保声明
$layout

$this -> layout  = view('layouts.master');
$this -> layout -> partial_view_1 = view('includes.top_nav'); 
// -> with($data); if you want to pass data to the top nav. 
$this -> layout -> partial_view_2 = view('includes.side_nav');

public function index(){
    $this -> layout -> main_content = view('contents.main');
    return $this -> layout;
 }
现在,如果希望在调用视图时将数据绑定到视图,则可能需要使用
视图生成器
。 希望这有帮助

试试这个。这是我的工作。
您可以在view composer函数中使用multiple with chain来检索变量

//For all views
\View::composer('*', function($views){
           $views->with('users', App\User::all())
           ->with('roles', App\Role::all())
           ->with('publishers', Publisher::all());
        });

有关更多信息:

您所做的一切都没有问题。您正在将不同的变量绑定到不同的视图。我不会将view composer放在一个控制器中,而是创建一个服务提供程序,以便在您似乎将所有“全局”内容都放在主控制器中的那一刻使其更有条理。@Gal我已经这样做了,它正在工作,但我不确定boot()服务提供者中的节。我真的需要将同一个东西绑定到两个视图上两次吗?@imperium2335我不这么认为,这就是为什么我还要将
NavigationComposer
文件一分为二,一个用于topbar,一个用于侧栏,正如您发送到
topbar
查看
sidebar
变量和
sidebar
查看
nav
变量时一样。我不知道您的函数做了什么,但您可能会做一些事情两次。@Gal我有一些函数根据用户角色在其中生成导航,有关NavigationComposer的完整版本,请参见我的编辑