1

我是 Laravel 的新手,目前正在编写一个 Intranet 应用程序,它基本上是一个带有大量信息的仪表板,使用 Laravel 5.2,其中一个要求是能够浏览不同的商店。应用程序的每个页面,都需要商店的代码。

目前我的所有表中都有一个列 store_id ,我使用 GET 和路由来检索这个值,比如:

www.mysite.com/1/employees -> will list all employees from Store 1
www.mysite.com/1/employees/create -> will create employee to Store 1
www.mysite.com/2/financial -> will list all financial widgets with data from Store 2

我想从 GET 中删除我的 STORE_ID,并对我的 topbar.blade.php 中的所有商店使用 DROPDOWN 选择,例如:

<select>
  <option selected>Store1</option>
  <option>Store2</option>
</select>

每当有人选择“Store1”或“Store2”时,我想使用 StoreController 获取 Store 信息,并使该变量可用于所有控制器和视图。我可以在哪里使用以下网址

www.mysite.com/employees -> will list all employees from "Depending of the SELECT"
www.mysite.com/employees/create -> will create employee to "Depending of the SELECT"
www.mysite.com/financial -> will list all financial widgets with data from "Depending of the SELECT"

我已经阅读了 View Composer、Facades、ServiceProvide,但我对它们都感到非常困惑。

4

3 回答 3

2

您还可以共享来自提供商的公共数据,例如。AppServiceProvider或您自己的提供者。例如,我在AppServiceProvider这里使用。在AppServiceProvider引导方法中:

public function boot()
{
    $this->passCommonDataToEverywhere();
}

现在在方法中写入:

protected function passCommonDataToEverywhere()
{
    // Share settings
    $this->app->singleton('settings', function() {
        return Setting::first();
    });
    view()->share('settings', app('settings'));

    // Share languages
    $this->app->singleton('languages', function() {
        return Language::orderBy('weight', 'asc')->get();
    });
    view()->share('languages', app('languages'));
}

在这个例子中,我必须使用:

use App\Language;
use App\Setting;
于 2016-07-14T06:07:43.240 回答
1

真的没那么难。可能还有其他方法,但我更喜欢这样做:

共享数据:

打开app/Http/Controllers/Controller.php并添加一个构造函数,如下所示:

<?php

namespace App\Http\Controllers;

...

abstract class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function __construct()
    {
        $this->sharedVar = "I am shared.."; // to share across controllers
        view()->share('sharedVar',$this->sharedVar); // to share across views
    }
}

使用数据:

1. 在控制器中:

所有控制器都扩展了上述控制器。所以该属性对所有控制器都可用:

class YourController extends Controller
{
    public function index()
    {
        dd($this->sharedVar);
    }
...
}

2. 在视图中:

{{$sharedVar}} // your-view.blade.php

编辑:

如果您想将数据共享到控制器和视图以外的地方,最好的方法可能是使用AppServiceProvider

打开app/Providers/AppServiceProvider.php并更新boot()方法:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->app->singleton('sharedVariable', function () {
            return "I am shared";
        });
    }

    ...

}

用法:

dd(app('sharedVariable')); // anywhere in the application
于 2016-07-14T05:20:33.400 回答
0

我想知道,如果以下可能:

-- StoreController

public function BindStore($id)
{
    $store = Store::where('id', $id);
    App::singleton('store', $store);
}

或者也许使用服务

于 2016-07-14T12:33:52.523 回答