In deinem Beispiel nutzt du schon die Connection, also einen Service via Dependency Injection.
Services verstehen sich als Objekte, welche du von überall instanziieren kannst, quasi Gelbe-Seiten / 11880 in der Objektorientierung.
Ich versuchs mal an einem echt alten Beispiel von Contao für das OptIn (Hier auch eine statische Methode, die keine weiteren Parameter als das Kommentar braucht)
PHP-Code:
public static function addCommentsSubscription(CommentsModel $objComment)
{
$objNotify = \CommentsNotifyModel::findBySourceParentAndEmail($objComment->source, $objComment->parent, $objComment->email);
// The subscription exists already
if ($objNotify !== null)
{
return;
}
$time = time();
// Prepare the record
$arrSet = array
(
'tstamp' => $time,
'source' => $objComment->source,
'parent' => $objComment->parent,
'name' => $objComment->name,
'email' => $objComment->email,
'url' => \Environment::get('request'),
'addedOn' => $time,
'ip' => \System::anonymizeIp(\Environment::get('ip')),
'tokenConfirm' => md5(uniqid(mt_rand(), true)),
'tokenRemove' => md5(uniqid(mt_rand(), true))
);
// Store the subscription
$objNotify = new \CommentsNotifyModel();
$objNotify->setRow($arrSet)->save();
$strUrl = \Idna::decode(\Environment::get('base')) . \Environment::get('request');
$strConnector = (strpos($strUrl, '?') !== false) ? '&' : '?';
// Send the activation mail
$objEmail = new \Email();
$objEmail->from = $GLOBALS['TL_ADMIN_EMAIL'];
$objEmail->fromName = $GLOBALS['TL_ADMIN_NAME'];
$objEmail->subject = sprintf($GLOBALS['TL_LANG']['MSC']['com_optInSubject'], \Idna::decode(\Environment::get('host')));
$objEmail->text = sprintf($GLOBALS['TL_LANG']['MSC']['com_optInMessage'], $objComment->name, $strUrl, $strUrl . $strConnector . 'token=' . $objNotify->tokenConfirm, $strUrl . $strConnector . 'token=' . $objNotify->tokenRemove);
$objEmail->sendTo($objComment->email);
}
Das wurde in einen Service ausgelagert, sodass man die ganze OptIn-Logik nun auch überall verwenden kann (Das ist nur ein Teil des Codes, da kommt noch bisschen mehr dazu).
Heutzutage sieht es so aus:
PHP-Code:
$optIn = System::getContainer()->get('contao.opt_in');
$optInToken = $optIn->create('com', $objComment->email, ['tl_comments_notify'=>[$objNotify->id]]);
$optInToken->send(...)
Wenn du es mehrfach verwenden möchtest und du mehr als nur ein bisschen Logik brauchst... also mit einer statischen Methode klar kommst (Ohne ein Objekt zu erstellen), dann versuche es darüber.
Ansonsten musst du halt wie im oben genannten Beispiel:
- Den passenden Kommentar finden
- Ein OptIn-Notification-Objekt erstellen
- Die Daten setzen
- Es speichern
- Ein E-Mail Objekt erstellen
- Die Daten reinschreiben
- Die E-Mail versenden
Der Service übernimmt das für dich und macht dann nur noch:
- Erstelle mir bitte das nötige Objekt mit den Daten
- Sende es ab / Logik / Mach dies und jenes
Alles jetzt ein bisschen einfach erklärt und ja... vorher lief das doch auch alles über die SuperGlobals und.. und.. und.
Warum 50 Zeilen Code, wenn es auch mit einer bis 3 Zeilen geht? Warum nicht bestehenden Code wiederholen