2016-07-20 13 views
0

Ich habe Code mit einem View Composer erstellt, wo ich meine Route Collection in allen Ansichten an das Frontend übergebe, sodass ich über die mit ihnen verknüpfte Route auf alle meine Laravel-Routen in Vuejs zugreifen kann.Globale Variable in Javascript für Laravel Routen - Ist das eine gute Idee?

Zum Beispiel ein Bild mit einem vue Komponente hochladen, statt vorbei meine Upload Route in die Vue-Komponente, es als Teil einer globalen Variablen aufgeführt wird:

var uploadRoute  = _.find(globalRoutes, function(route) { return route.name == 'route-name.image.upload' }); 
$.post(uploadRoute, data) ... etc 

Meine Frage ist .. .ist das sinnvoll? Ich veröffentliche die Routen meiner gesamten App öffentlich.

Dank

Antwort

2

Ich denke, Ihre Vermutung über Ihre gesamte Apps Routen aussetzt legit ist. IMO sollten Sie explizit die Routen auswählen, die Sie benötigen. In diesem Fall sollten Sie nur route-name.image.upload freilegen. Sie könnten eine kleine Hilfsfunktion erstellen, um Routen zu suchen und sie zusammen mit der URL als JSON auszugeben.

function json_routes(array $routes) 
{ 
    $return = []; 

    foreach($routes as $route) 
    { 
     $return[$route] = route($route); 
    } 

    return new \Illuminate\Support\HtmlString(json_encode($return)); 

} 

Und die, in der Hauptansicht:

var routes = {{ json_routes(["route-name.image.upload"]) }}; 

eine Route zu bekommen ist einfach:

routes['route-name.image.upload']; 

Dies ist die einfachste exaple ich mir vorstellen kann. Sie können es ziemlich optimieren. Nur ein paar Ideen:

  • Legen Sie die Routen an einem zentralen Ort, fx. ein config-Element: json_routes(config('app.json_routes'))
  • Erstellen Sie einen Befehl, der eine statische .json-Datei generiert, so dass Sie die Routen bei jedem Laden der Seite nicht durchlaufen. Denken Sie daran, neu zu generieren, wenn Sie weitere Routen hinzufügen.
  • Erstellen Sie eine Funktion anstelle eines Objekts, um die Route zu erhalten. Das ermöglicht es Ihnen, in der Logik zu bauen und gibt eine Laravel-Atmosphäre in Ihrem js: function route(path){ return window.routes.hasOwnProperty(path) ? window.routes[path] : null ;}

  • (Advanced) Re-write Laravels Router Logik und in den Optionen Array Haken, so dass Sie so etwas wie Route::get('dashboard', '...', ['as'=>'dashboard', 'expose'=>true]); tun , dann dynamisch generieren Sie die zuvor erwähnte JSON-Datei auf allen Routen mit der expose Option.

+0

Gern geschehen, Ed :) – Dencker

+0

Ich mag den erweiterten Vorschlag - ich könnte das versuchen. –

+0

@Ed Das würde auch den Ärger erschweren, dass Sie Ihr Routen-Array manuell aktualisieren müssen, wenn Sie den Namen der Route ändern. – Dencker

Verwandte Themen