, wie man gemeinsame Funktion in Helfer und Komponente in CakePHP verwendet

8

Wir kennen Komponenten und Helfer in CakePHP.

Ich habe eine ABC-Komponente und XYZ-Helfer und beide haben die gleiche Funktion (etwa 2000 Zeilen insgesamt 4000 Zeilen). Es gibt eine Möglichkeit, dieselbe Funktion in Controller- und CTP-Dateien zu verwenden. Es ist nicht gut, dieselbe Funktion 2 mal zu benutzen.

jede Methode, damit ich Component / Helper-Funktion in Helper / Component ohne Neu schreiben verwenden kann?

gleiche Methode in Komponente und Helfer & gt; & gt;

Komponente

class DATAComponent erweitert die Komponente {

%Vor%

Helfer

%Vor%     
Yogesh Saroya 17.06.2014, 10:27
quelle

5 Antworten

7

Nun, Sie müssen etwas neu schreiben, es wird sich nicht selbst lösen.

CakePHP ist immer noch PHP, Sie können also leicht gängige Muster anwenden, um DRY zu bewahren. Der einfachste Weg wäre wahrscheinlich, die gemeinsame Funktionalität in eine Dienstprogrammklasse zu verschieben, die Ihre Komponente und Ihr Helfer beide intern verwenden können, während sie ihre öffentliche API unverändert lassen.

Einige CakePHP-Helfer machen etwas Ähnliches, zum Beispiel den Zeithelfer.

Merkmale können ebenfalls eine Option sein, je nachdem, wie viele Funktionen geteilt werden und wie viel es ist gebunden an die Verwendung in einer Komponente / Helfer.

    
ndm 17.06.2014 16:21
quelle
2

Ich wollte eine Komponente in einem Helfer verwenden. So kam ich mit der folgenden Lösung heraus.

%Vor%     
gmponos 02.11.2014 12:58
quelle
2

Ich würde mit einer Klasse im Lib-Ordner gehen. Es ist ziemlich klar, wie man mit einer Bibliotheksklasse umgeht, die nur statische Methoden hat. Also, ich lasse diesen Fall weg. Eine praktikable Lösung für die Instanziierung der Klasse könnte darin bestehen, sie im Controller zu erstellen und sie in die Registrierung einzutragen. Wenn Sie wirklich auf CakeRequest, CakeResponse und CakeSession zugreifen müssen (beachten Sie, dass CakeSession viele statische Methoden verwendet, so dass Sie oft keine Instanz dieser Klasse benötigen), können Sie diese über den Controller setzen:

%Vor%

Von der Ansicht oder einem anderen Ort aus würden Sie dann eine Instanz von MyLib aus der Registrierung erhalten:

%Vor%

oder einfach

%Vor%

Also, Ihre Klasse wäre so etwas wie:

%Vor%     
bancer 03.11.2014 20:15
quelle
1

ok Sie wollen eine einzelne Funktion in Komponente und Helfer verwenden, ich kann mir 3 Dinge vorstellen, die Sie tun können:

  1. Aufruf einer Funktion von der Komponente in Ihrem Helfer.
  2. Aufruf einer Funktion von einem Helfer in Ihrer Komponente.
  3. Erstellen Sie ein Modell oder verwenden Sie ein vorhandenes Modell, in das Sie die Funktion einfügen, und Sie können diese Funktion in Ihrer Komponente oder in Ihrer Hilfe verwenden.

Option Nr. 3: In Ihrem Hilfsprogramm und in Ihrer Komponente müssen Sie ein Modell importieren, wenn Sie davon ausgehen, dass sich Ihre Funktion in einem Modell "StateList" befindet:

Wie Sie die Funktion des Modells "StateList" in Ihrem Helfer aufrufen, also:

%Vor%

Wie Sie die Funktion des Modells "StateList" in Ihrer Komponente aufrufen, also:

%Vor%

ans, wenn Sie die gleiche Funktion in einem Controller nur verwenden möchten:

%Vor%     
CoolLife 03.11.2014 13:05
quelle
1

Einfache Antwort

Fügen Sie für allgemeine Funktionen in Ihrer Anwendung eine Lib- oder Dienstprogrammklasse hinzu.

app / Lib / MeineKlasse.php

%Vor%

Fügen Sie das oben in der Datei hinzu, auf die Sie auf die Funktion zugreifen möchten:

%Vor%

Und rufe deine Funktion an, wo immer du willst:

%Vor%

Bessere Antwort

Es sieht für mich so aus, als ob Ihr spezifisches Problem darin besteht, dass Sie in der Lage sein wollen, eine Liste von US-Staaten sowohl in Ihrem Controller als auch in Ihrer Sicht zu erhalten. Der beste Weg, dies zu tun, ist eine Datenbanktabelle der US-Bundesstaaten.

  1. Erstellen Sie eine Tabelle in Ihrer Datenbank namens us_states .

    Beispiel SQL:

    %Vor%
  2. Fügen Sie alle Zustände als Daten in diese Tabelle ein. Sie können SQL-Dumps im Internet finden, die das für Sie bereits haben (zB Like this one ).

  3. Erstellen Sie ein USState-Modell in CakePHP.

    %Vor%

Was Sie dann tun können, ist den Zugriff auf die Zustände von Ihrem Controller aus, indem Sie einfach das Modell verwenden.

%Vor%

Und wenn Sie auf diese Zustände in Ihrer Ansicht zugreifen möchten, sollten Sie diese Daten wie normalerweise andere Variablen weitergeben.

Ich könnte mir vorstellen, dass Sie das tun möchten, damit Sie vielleicht ein ausgewähltes Menü mit US-Bundesstaaten haben.

%Vor%

Und aus Ihrer Sicht können Sie so ein Auswahlmenü anzeigen:

%Vor%     
BadHorsie 05.11.2014 15:49
quelle