[TYPO3] Namespace in eigener Extension & Could not analyse class

Anmerkung: Dies ist der erste Beitrag meines Kollegen Tommy, der nun ab und zu zu den Themen TYPO3, FLOW3 und co. schreiben wird. Hoffentlich 😉

Aufgrund des kommenden Releases von TYPO3 6.0 überarbeiten wir derzeit einige Extensions, wobei vor allem die Umstellung auf Namespaces einiges an Arbeit bedeutet.

Bei der Umstellung der Controller kommt es aber zu folgendem Problem bei der Auflösung des Request’s: es wird fälschlicherweise immer die Klasse

tx_myext_controller_mycontroller

anstatt

\Vendor\MyExt\Controller\MyController

gesucht. Da die Klasse wegen der Namespaces natürlich nicht mehr gefunden werden kann, gibt es folgende Fehlermeldung:

“Could not analyse class:Tx_MyExt_Controller_MyController maybe not loaded or no autoloader”

Nach etwas Debugging und einer Suche im TYPO3 Forge gibt es eine doch recht simple Lösung – dazu muss die Konfiguration des Plugins in der ext_localconf.php folgendermaßen angepasst werden:

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'VendorName.'. $_EXTKEY, $pluginName, $controllerActions
);

FLOW3 – wie erstelle ich eine Ajax Action mit json Rückgabe?

Ganz einfach:

im Controller folgende Klassenvariable setzen:

protected $supportedFormats = array("html", "json");
	protected $viewFormatToObjectNameMap = array(
		"json" => "\TYPO3\FLOW3\MVC\View\JsonView",
		"html" => "\TYPO3\Fluid\View\TemplateView"
	);

und in der Routes.yml (bzw. im Routing) einen Eintrag nach folgendem Muster vornehmen:

-
  name: '[name_der_route]'
  uriPattern: '[gewünschter_pfad]'
  defaults:
    '@package':    '[package_name]'
    '@action':     '[action_im_controller]'
    '@controller': '[controller]'
    '@format':     'json'

Mit der Klassenvariable sorgt ihr dafür, dass der Controller beim Format “json” auf ein Template verzichtet und den Return-Value einer Action direkt ausgibt (also im Normalfall per json_encode() formatiert). Mit der Konfiguration der Route legt ihr nur noch fest, dass die jeweilige Action an Stelle von HTML lieber JSON verwendet.

[Update]
Nach der Frage von Mario hier nochmal als Nachtrag eine entsprechende Beispiel-Action:

/**
 *
 * @param string $param
 *
 * @return json test data
 */
public function getDataAction($param) {
	$data = array("testKey"=>$param, "testKey2"=>"testValue2");
	return json_encode($data);
}