Registry/Singleton in Extbase Extensions
| Autor | Nachricht |
|---|---|
|
Verfasst am: 14. 02. 2010 [18:19]
|
|
|
fragile74
Themenersteller
Dabei seit: 24.07.2006
Beiträge: 126
|
Hallo, ich code gerade eine extbase/fluid-basierte Extension, die die PHPExcel-Klassen verwendet. Diese sind ja für TYPO3 in der PHPExcel-Extension gekapselt. Diese ist vom Typ "Service". Wie binde ich diese Extension jetzt richtig in mein MVC-Modell ein ? Habe leider in entsprechenden Referenzen/Tutorials nichts derartiges gefunden bzw. fehlt mir momentan etwas das Verständnis Thx 4 tipps... |
|
Verfasst am: 14. 02. 2010 [20:59]
|
|
|
fragile74
Themenersteller
Dabei seit: 24.07.2006
Beiträge: 126
|
Nochmal zur Erläuterung: Ich habe ein Model Tx_MyExtension_Domain_Model_Sheet und einen Controller Tx_MyExtension_Controller_Start. Mein Model sieht so aus: PHP class Tx_MyExtension_Domain_Model_Sheet extends Tx_Extbase_DomainObject_AbstractEntity {
/**
* Some title.
*
* @var string
* @identity
*/
protected $title, $ExcelSheet = null;
/**
* Sheet constructor
*
*/
public function __construct() {
set_include_path(get_include_path() . PATH_SEPARATOR . t3lib_extMgm::extPath('phpexcel_library').'phpexcel/Classes/');
require_once 'PHPExcel.php';
require_once 'PHPExcel/Writer/Excel2007.php';
}
/**
* Inits the sheet
*
* @param string $title
* return void
*/
public function initSheet($title) {
$ExcelSheet = t3lib_div::makeInstance('PHPExcel');
$ExcelSheet->getProperties()->setCreator("Myself"<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />;
$ExcelSheet->getProperties()->setLastModifiedBy("MySelf"<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />;
$ExcelSheet->getProperties()->setTitle($title);
$ExcelSheet->getProperties()->setSubject($title);
$ExcelSheet->setActiveSheetIndex(0);
$ExcelSheet->getActiveSheet()->SetCellValue('A1', 'Hello');
$ExcelSheet->getActiveSheet()->SetCellValue('B2', 'world!');
$ExcelSheet->getActiveSheet()->SetCellValue('C1', 'Hello');
$ExcelSheet->getActiveSheet()->SetCellValue('D2', 'world!');
echo ('Sheet initiated');
return $ExcelSheet;
}
/**
* Save Excel sheet
*
*@param string $Name
*/
public function saveSheet($Name, $ExcelObj) {
$objWriter = new PHPExcel_Writer_Excel2007($ExcelObj);
$objWriter->save('../../'.$Name.'.xlsx');
echo ('Saved');
}
}Mein Controller so: PHP class Tx_MyExtension_Controller_StartController extends Tx_Extbase_MVC_Controller_ActionController {
public $TestObj;
/**
* Initializes the current action
*
* @return void
*/
public function initializeAction() {
}
/**
* Index action for this controller.
*
* @return string The rendered view
*/
public function indexAction() {
$this->view->assign($message,'Process initiated.');
}
public function saveAction() {
$start = t3lib_div::makeInstance('Tx_Efempty_Domain_Model_Start');
$TestObj = $start->initSheet('MeinSheet');
$start->saveSheet('Testing', $TestObj);
$this->view->assign($message,'ExcelSheet saved.');
}
}Ich möchte aber EINMAL in meiner Extension ein Objekt vom Typ PHPExcel anlegen und dies dann im GESAMTEN Klassenraum (zumindest im Controller) in diversen Funktionen nutzen können -> ist ja der Sinn einer Extension, die mit PHPExcel arbeitet Danke - auch ein "das verstehe ich nicht, erklärs mir mal anders" etc. würde mir schon weiterhelfen [Dieser Beitrag wurde 1mal bearbeitet, zuletzt am 14.02.2010 um 21:00.] |
|
Verfasst am: 15. 02. 2010 [16:04]
|
|
|
fragile74
Themenersteller
Dabei seit: 24.07.2006
Beiträge: 126
|
Niemand ? Ist das Thema zu neu oder zu unklar formuliert ? Soweit ich es verstanden habe, wäre das ein klassischer "Singleton" UseCase. Frage: Wo in der Klassenhierarchie von Extbase/Fluid instanziere ich dann die PHPExcel-Klasse am besten ? Bisher gehe ich davon aus, dass die Model-Klasse die richtige ist. Oder muss ich nochmal eine Helper-Klasse als 2. Model-Objekt(Klasse) implementieren ? Ich checke im Moment einfach nicht, wie ich eine Instanz über die gesamte Laufzeit der Extension am Leben erhalte |
|
Verfasst am: 25. 03. 2010 [09:50]
|
|
|
Ranger
Dabei seit: 26.05.2006
Beiträge: 16
|
Das würde mich auch brennend ineressieren, da ich meine Daten per SOAP von einem anderen System hole. Die SOAP-Instanz möchte ich auch von überall ansprechen können. Im Idealfall auch irgendwie die daten in meine Models übertragen, aber steh ich auch wie der Ochs vorm Berg....alles noch ziemliches Neuland für mich. |
|
Verfasst am: 25. 03. 2010 [11:57]
|
|
|
fragile74
Themenersteller
Dabei seit: 24.07.2006
Beiträge: 126
|
Hi, das Thema ist eigentlich OO-typisch und kann entweder mit einer Singleton-Klasse oder z.b. über Injections gelöst werden. In meinem Fall habe ich einfach im Konstruktor der Model-Klasse ein "t3lib_div::makeInstance('<deineKlasse>');" eingefügt. Dadurch steht mir diese Klasse in meiner Model-Klasse zur Verfügung. Ich warte auch gespannt auf das O'Reilly Buch der beiden Extbase/Fluid-Macher, in dem hoffentlich solche Konstruktionen erklärt/aufgeklärt werden PS: Natürlich musst du vorher deine Klasse z.b. über require_once für die Modelklasse verfügbar machen... [Dieser Beitrag wurde 1mal bearbeitet, zuletzt am 25.03.2010 um 11:57.] |
|
Verfasst am: 25. 03. 2010 [13:11]
|
|
|
Ranger
Dabei seit: 26.05.2006
Beiträge: 16
|
So ähnlich habe ich es auch gemacht, nur dass ich die Klassen-Instanz nicht im model mache sondern in der Repository-Klasse, da ich in dieser eh die Funktionen um die SOAP-Metoden erweitern musste. Aber im endefekt ist es ja gehüpft wie gesprungen....jo, das Buch erwarte ich auch voller Spannung...dauert nur noch n guten Monat, glaub ich. Dank Dir aber für das Feedback! |
|
Verfasst am: 13. 07. 2010 [15:31]
|
|
|
zeradun
Dabei seit: 03.05.2008
Beiträge: 11
|
Bin in einer ähnlichen Situation auch auf das Problem gekommen. In eigenen Systemen könnte man die Definitionen entsprechend coden: PHP class xyz {
private static $instance;
private function __construct() {
// Construct
}
public static function getInstance() {
if(empty(xyz::$instance)) {
xyz::$instance = new xyz();
}
return xyz:$intstance;
}
public function do_something() {
// do some action
}
}
// Objekt instanzieren
$obj = xyz::getInstance();
$obj->do_something();Das objekt ist überall das gleiche egal woher man es holt. Man kann es nur nicht neu konstruieren da der konstruktor privat ist. Mit PHP t3lib_div::makeInstance('xyz');Da hat TYPO3 das Interface 'Singleton' TYPO3 supports singleton pattern for classes. Singletons are instantiated only once per HTTP request regardless of the number of calls to the t3lib_div::makeInstance(). To use singleton pattern class must implement t3lib_Singleton interface: PHP require_once(PATH_t3lib . 'interfaces/interface.t3lib_singleton.php');
class tx_myext_mySingletonClass implements t3lib_Singleton {
…
}Entsprechend kann man alle Klassen vom Typ singleton mit t3lib_div::makeInstance('xyz'); aufrufen. Quelle: Typo3.org Core Documentation [Dieser Beitrag wurde 2mal bearbeitet, zuletzt am 13.07.2010 um 15:32.] |



