2016-11-27 3 views
0

Angenommen, ein Kunde auf ihr Konto anmelden können, wo sie ihre Aufträge anzeigen, verwalten Zahlungen, Sicherheitseinstellungen ändern, usw. Admins können das gleiche tun, aber ihre Front-End (dh Ansichten) unterscheiden sich von denen der Kunden, da sie einen privilegierten Zugang und eine bessere Kontrolle der Daten benötigen. JetztOrganisation der Controller-Logik in Laravel

, mit RESTful design, empfiehlt Laravel Routen von Einheiten aufgeteilt, die sie darstellen:

// Orders 
Router::get('orders', '[email protected]'); 
Router::get('orders/{order}', '[email protected]'); 
// Payments 
Router::get('payments', '[email protected]'); 
Router::get('payments/{payment}', '[email protected]'); 
// etc. 

Wenn ich folgen diesem Muster, dann

  • jedes Controller-Methode (zB [email protected], [email protected]) wird ein if-else Konstrukt haben - eins, um die Logik zu handhaben, wenn Auth::user() ein Kunde ist, und das andere - wenn ein Admin; diese
  • einige Methoden in Code Redundanz führen kann nie von Kunden genutzt werden (z delete oder put), während sie wahrscheinlich erforderlich für Administratoren sind; dies wird nur hinzufügen Verwirrung

Eine Alternative, die ich denken kann, Code von ist, so etwas zu haben:

// Customer routes 
Router::get('account/orders', '[email protected]_orders'); 
Router::get('account/payments', '[email protected]_payments'); 
// Admin routes 
Router::get('admin/orders', '[email protected]_orders'); 
Router::get('admin/payments', '[email protected]_payments'); 
// etc. etc. 

Das Problem bei diesem Ansatz ist, dass Controller verworren und groß werden wird all die verschiedenen Methoden für verschiedene Entitäten (zB Order, Payment, etc.).

Schließlich kann ich denke an die followind 3. Option:

// Customer routes 
Router::get('orders', '[email protected]'); 
Router::get('payments', '[email protected]'); 
// Admin routes 
Router::get('a/orders', 'Admins/[email protected]'); 
Router::get('a/payments', 'Admins/[email protected]'); 
// etc. etc. 

/* dir structure: */ 
/app 
    /Http 
     /Controllers 
       /Admins 
        OrderController.php   -- admins only 
        PaymentController.php  -- admins only 
       OrderController.php  -- customers 
       PaymentController.php -- customers 

Das mit dem RESTful Design erfüllt und trennt admins in ihre eigene Route-Gruppe (mit admin/ Präfix vor jeder Route). Das Problem besteht eindeutig darin, dass einige Steuerungslogik dupliziert wird.

Was ist der beste Ansatz, um damit umzugehen? Irgendwelche anderen Möglichkeiten, es zu tun? Vielen Dank!

Antwort

1

Die letzte Option ist eine bessere Idee. Die meiste Strukturierung ist bevorzugt, aber viele werden zustimmen, dass ein separater Namespace und eine Routengruppe für die Admin-Aktionen eine gute Idee ist. Sie können auch Route::resource() verwenden, die Ihnen einige Standardmethoden für einen REST-API-Endpunkt bietet (Sie können auch die nicht benötigten entfernen). Es wäre im Grunde das Gleiche sein, wie Sie für die dritte Option haben, aber mit einer Route-Gruppe und Ressourcensteuerungen:

// Customer routes 
Route::resource('orders', 'OrderController'); 
Route::resource('payments', 'PaymentController'); 

// Admin routes 
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() { 
    Route::resource('orders', 'OrderController'); 
    Route::resource('payments', 'PaymentController'); 
}); 

und die Verzeichnisstruktur wie folgt aussehen würde:

app/ 
└── Http/ 
    └── Controllers/ 
     ├── Admin/ 
      ├── OrderController.php  -- Admins 
      └── PaymentController.php  -- Admins 
     ├── OrderController.php   -- Customers 
     └── PaymentController.php   -- Customers 

Edit: Didn Ich sehe nicht, dass Sie bereits von den Ressourcencontrollern wussten. Ich empfehle es immer noch so.