5

Ich arbeite an einer Überarbeitung einer CakePHP App, die ich unter CakePHP 1.2 gebaut habe. Ich habe ein Upgrade auf 1.3 durchgeführt und erwäge, mich von dem Paradigma der Administratorweiterleitung für meine Anwendung zu entfernen. Ich finde, dass einige meiner Controller wegen der doppelten Funktionen für Frontend und Admin extrem groß werden. Meine Intuition ist, dass es viel sauberer ist, nur eine Reihe von Admin-Controllern zu erstellen und das Admin-Routing alle zusammen fallen zu lassen, aber ich wollte etwas darüber erfahren, was andere tun und welche Funktionalität ich verpasse Löschen des RoutingsCakePHP Best Practice: Admin mit oder ohne Routing

Was werden in dieser Hinsicht als Best Practices für eine stabile CakePHP-App (oder ein anderes MVC-Framework) angesehen?

+0

Ich habe zwei Vorschläge bekommen das Routing fallen, was ich zu tun geneigt bin, aber sobald ich anfing, dies auszuprobieren, fühle ich mich, als ob ich gegen eine Mauer stoße. In einer nicht gerahmten Anwendung würde ich einfach ein neues Verzeichnis "admin" erstellen und alle meine adminspezifischen Controller dort einfügen, von denen viele den gleichen Namen wie die Front-End-Controller haben würden und somit auf sie zugreifen würden: "/ admin/Benutzer/hinzufügen ". Ich finde keine Möglichkeit etwas Ähnliches mit Cake zu machen. Ist meine einzige Option/admin_users/hinzufügen? – seth

Antwort

0

Stören Sie nicht mit Admin-Routing, wenn es nicht zu Ihrem Szenario passt. Ich benutze es auch nicht, Admin-Pfade passen nicht zu meiner App. Das Duplizieren von Code ist eine Verschwendung von Aufwand.

Sie können ACL-Regeln für feinkörnige Rollen verwenden oder einfach die Rolle (admin-Flag) im Controller beforeFilter() oder in der ersten Zeile einer Aktion überprüfen.

Ich habe eine Komponente Funktion checkRole (array()), die in der ersten Zeile meiner Aktionen aufgerufen wird. Wenn der aktuelle Benutzer nicht über die bereitgestellten Rollen verfügt, wird die Anforderung protokolliert und beendet.

0

Ich würde zweite ACL/Rollen für echte Admin-Sachen, und wahrscheinlich nicht mit Admin-Routing in der Produktion. Manchmal behalte ich ein Gerüst (also minimalen Extra-Code) Admin-Routing für Low-Level-Admin-Zeug, nur für mich zugänglich, aber das ist wahrscheinlich nicht klug in einer robusten Produktions-App.

Nach dem Kommentar bearbeiten: Es ist nicht optimal, aber Sie können möglicherweise etwas zusammenstellen, das wie Sie es in den URLs erscheinen möchten, und auch in Ordnern organisiert werden. Ich konnte es noch nicht testen, aber hier ist die Idee:

Erstellen Sie einen Ordner "admin" in Ihrem Controller-Ordner und für die Benutzer admin, erstellen Sie eine users_admin_controller.php Controller-Datei. Sie reduzieren die Ordnerstruktur, sodass Sie immer noch nicht die gleichen Namen wie Ihr Stammverzeichnis haben, aber Sie können sie dennoch in einen Ordner trennen.

Dies wird standardmäßig tun, um eine /admin_users/add Typ Situation, aber das kann mit dem zweiten Teil gezwickt werden, einige Routing:

Router::connect('/admin/users/:action', array('controller'=>'admin_users')) 

Dies würde für jeden Admin-Bereich getan werden müssen - nicht ideal, aber ich kann keinen besseren Weg finden, ohne Cake-Code zu ändern.

+0

Wie sehen Ihre URLs für den Admin-Bereich aus? Ich denke, das wäre ein Kinderspiel, außer dass es keine gute Möglichkeit gibt, Controller in Unterverzeichnisse zu setzen, auf die über/subdir/control/action zugegriffen wird (z. B./admin/users/add). Benennen Sie einfach alle Ihre Admin-Controller mit "admin" voran (z. B./admin_users/add)? – seth

+0

Wenn ACL/Rollen verwendet werden, gibt es nur Seiten/Aktionen, die entweder nur für Administratoren zugänglich sind oder zusätzliche Funktionen mit Admins haben. Aber was ich denke, dass Sie fragen, ist, wenn Sie das Gerüst oder mit Admin-Abschnitten verwenden. Dort können Sie "admin routing" verwenden, um admin/users/add wie gewünscht zu setzen. Siehe das CakePHP-Handbuch: http://book.cakephp.org/view/46/Routes-Configuration#Prefix-Routing-544 Damit haben Sie nur eine 'admin_add'-Funktion in Ihrem Benutzer-Controller, auf den über zugegriffen wird '/ admin/users/add' und dann eine normale' add'-Funktion, auf die über '/ users/add' zugegriffen wird. – cincodenada

+0

Ich verstehe (und habe implementiert) ACL/Roles und verwende kein Scaffolding. Ich habe nur viele Front-End/Admin-Controller, die die gleichen wären. Ich möchte Admin-Controller in ein Unterverzeichnis "/ admin" setzen und URLs wie "/ admin" aussehen lassen, ohne Präfixe zu verwenden. – seth

0

Ich habe ACL für meine Anwendung verwendet und finde es viel besser als die Verwendung von Admin-Routing. Es ist viel einfacher. Wenn Sie wirklich ein Präfix wollen, können Sie das mit normalem Routing tun.

+0

Ich endete mit ACL + Präfix (das ist eigentlich nicht wirklich eine Änderung von meiner ursprünglichen Implementierung). Ich bin immer noch ziemlich genervt darüber, wie Kuchen Verzeichnisstrukturen und Dateinamen und Links behandelt. Es wäre ideal, wenn ein Controller in einem "admin" -Verzeichnis wäre, das Teil des URL-Pfads werden würde. – seth

1

Ich würde vorschlagen, Front-End-Anwendung und Admin in zwei separate Anwendungen (/app und /admin) einfach zu trennen. Denken Sie einfach an Admin als eine einfache Front-End-Anwendung, die alle "schmutzigen" Arbeit mit der Datenbank zu tun.

Auf diese Weise können Sie auf Ihren Administrator mit dem Präfix/admin in URL zugreifen oder DocumentRoot auf/admin/webroot setzen und admin mithilfe von Subdomain (d. H. Admin.myapp.com) zugreifen.

Um Modell-Code Doppelarbeit zu vermeiden, könnten Sie Ihre Modelle in einigen freigegebenen Ordner (das heißt /vendors/core/models) und fügen Sie diesen Pfad setzen Pfade in bootstrap.php Dateien (App::build('models' => array(VENDORS . 'core/models/')) für CakePHP 1.3, $modelPaths = array(VENDORS . 'core/models/') für CakePHP 1.2) zu modellieren.

Um weitere Server-Betreiber oder App spezielle Sachen zu Ihren Modellen hinzufügen, können Sie Ihre Core-Modelle in/Modelle erweitern könnten, durch Kernmodell zu laden und es erstreckt:

App::import('Model', 'CoreModelName'); 

class CustomCoreModelA extends CoreModelA 
{ 
    function specificMethod() {} 
} 

Das für gemeinsam genutzte Komponenten vorgenommen werden könnten, Verhaltensweisen usw.

+1

über die Verwendung von zwei Apps, würde ich zustimmen und ist etwas, über das ich habe. aber Ihre Putting-Modelle in Anbietern ist ein hässlicher Hack. Verwenden Sie stattdessen APP :: build in der einen App, um auf die Modelldateien in einer anderen App zu verweisen. Probleme gibt es insbesondere bei Plugins. sehr langsam in so vielen Verzeichnissen. – dogmatic69

+0

Sie haben Recht, geteilte Modelle in/vendors dir ist hässlich und hacky, mit anderen App-Modellen dir nach Modellen suchen klingt besser. Das einzige Problem ist das Fehlen von Namespaces, auf diese Weise müssen Sie allen Ihren Admin-Modellen vorangestellt werden. Was ist mit Leistung? Nun, Sie müssen wählen, ob Sie eine saubere und wartbare Architektur oder eine blitzschnelle App haben wollen, aber mit vielen architektonischen Nachteilen. – ljank

1

ive gebaut apps mit Admin-Routing und nicht, und die nicht Version ist immer ein Durcheinander. Wenn einige Ihrer Methoden identisch sind, können Sie Folgendes tun.

function add(){ 
$this->_add(); 
} 

function admin_add(){ 
$this->_add(); 
} 

function _add(){ 
... your code ... 
} 

i seine nicht alle Code wetten würde, dass die gleiche ist, und nicht die Server-Betreiber mit Routing Sie werden mit viel Code am Ende tut if(... is admin ...) { echo 'blaa'} else { echo 'foo'; }