Laravel 5.2 - 所有控制器和视图的通用对象

时间:2016-07-13 22:47:09

标签: controller views laravel-5.2 intranet laravel-facade

我是Laravel的新手,目前正在编写一个内部网应用程序,它基本上是一个包含大量信息的仪表板,使用Laravel 5.2,其中一个要求是能够导航到不同的商店。该应用的每个页面都需要商店的CODE。

目前我的所有表中都有一个列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>

每当有人选择&#34; Store1&#34;或者&#34; Store2&#34;,我想使用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的内容,我对所有这些内容感到非常困惑。

3 个答案:

答案 0 :(得分:1)

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

分享数据:

打开app/Http/Controllers/Controller.php并添加如下的aconstructor函数:

<?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

答案 1 :(得分:1)

您还可以从提供商处共享公共数据,例如。 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;

答案 2 :(得分:0)

我想知道,如果可能的话:

-- StoreController

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

或者可能使用服务