2016-07-13 26 views
1

Ich bin neu in Laravel, und derzeit Codierung einer Intranet-App, die im Grunde ein Dashboard mit vielen Informationen ist, mit Laravel 5.2, und eine der Anforderungen ist in der Lage sein um die verschiedenen Geschäfte zu navigieren. Für jede Seite der App wird der CODE des Geschäfts benötigt.Laravel 5.2 - Gemeinsame OBJECT zu allen Controllern und Ansichten

Zur Zeit habe ich eine Spalte store_id in allen meinen Tabellen, und ich verwende mit Routen GET diesen Wert abzurufen, wie:

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 

Ich möchte meine STORE_ID aus dem GET entfernen, und verwenden Sie einen DROPDOWN wählen Sie mit allen Filialen in meinem topbar.blade.php, zum Beispiel:

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

Jedes Mal, wenn jemand wählen Sie „STORE1“ oder „Store2“, würde Ich mag Store Informationen erhalten, mit StoreController und machen diese Variablen zur Verfügung alle Controller und Ansichten. Wo ich die folgende URL verwenden können

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" 

Ich habe über View Composer lesen, Fassaden, ServiceProvide, und ich habe wirklich verwirrt über alle von ihnen.

Antwort

1

Es ist nicht wirklich schwer. Es gibt auch andere Methoden, aber ich ziehe es auf diese Weise zu tun:

Gemeinsame Nutzung von Daten:

öffnen app/Http/Controllers/Controller.php und fügen aconstructor Funktion wie folgt aus:

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

Verwenden von Daten:

1. In Controllern:

Alle Controller erweitern den obigen Controller. So ist die Eigenschaft ist für alle Regler zur Verfügung:

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

2. In Aufrufe:

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

EDIT:

Wenn Sie möchten, dass andere als Controller Daten an Orte teilen und Ansichten, ist die beste Methode vielleicht zu verwenden AppServiceProvider:

Öffnen app/Providers/AppServiceProvider.php und aktualisieren Sie die boot() Methode:

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

    ... 

} 

Verbrauch:

dd(app('sharedVariable')); // anywhere in the application 
+0

Ich mochte dieses, aber das einzige "Problem" (zumindest für mich hehe) ist, das Plugin Widgets zu verwenden, das ein AbstractWidget erweitert. Wäre es auch dort verfügbar? –

+1

Bitte beachten Sie die Bearbeitung – Naveed

+0

Großartig, vielen Dank. Also führte es mich zu einer anderen Frage. Zum Beispiel, wenn jemand Store 1 auswählt, werde ich als POST/GET den StoreController aufrufen, um alle Daten aus diesem Store abzurufen, und wie teile ich diese Informationen dynamisch mit? Wie kann ich ein Objekt als Parameter an den ServiceProvider übergeben? –

1

Sie auch gemeinsame Daten von einem Anbieter zum Beispiel gemeinsam nutzen können. AppServiceProvider oder ein eigener Anbieter. Ich verwende hier zum Beispiel AppServiceProvider. In AppServiceProvider Boot-Methode:

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

Jetzt in der Methode schreiben:

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')); 
} 

In diesem Beispiel habe ich zu verwenden:

use App\Language; 
use App\Setting; 
+0

Hallo, Danke für deine Antwort. Wenn ich in der top.blade.php ein Geschäft auswähle, wie rufe ich diesen ServideProvider mit einer Variablen auf? öffentliche Funktion boot() { $ this-> ShareStore(); } geschützte Funktion passCommonDataToEverywhere ($ id) { // Teile Einstellungen $ this-> app-> Singleton ('Store', function() {return Shop :: wo ('id', $ id); }); view() -> share ('speichern', app ('speichern')); } –

+0

'public function Boot (Router $ Router) { $ Router-> bind ('id', function ($ id) { $ this-> ShareStor ($ id); }); } ' Aber ich denke, Sie sollten es vorsichtig verwenden, da es jetzt abhängig von {$ ID} -Param ist –

0

Iam fragen würden, wenn die folgende möglich sein, :

-- StoreController 

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

Oder vielleicht unter Verwendung von Diensten