Blog

Composer Autoload mit Code Igniter

Veröffentlicht am 27.07.2014

Möchte man Composer in einem Code Igniter (CI) Projekt verwenden muss lediglich die "index.php" folgendermaßen erweitert werden:

// Composer
include_once './vendor/autoload.php';

require_once BASEPATH.'core/CodeIgniter.php';

Falls in dem bestehenden Code Igniter bereits eine __autoload Funktion definiert wurde kollidiert diese mit dem Autoload von Composer und entsprechende Klassen werden nicht gefunden. Üblicherweise werden eigene Autoload Funktionen in eine der Config Dateien von CI definiert beispielsweise in der "config.php":

function __autoload($class)
{
	if (strpos($class, 'CI_') !== 0)
	{
		if (file_exists($file = APPPATH . 'core/' . strtolower($class) . EXT))
		{
			include $file;
		}
		else if (file_exists($file = APPPATH . 'orm/' . strtolower($class) . EXT))
		{
			include $file;
		}
	}
}

Das geschilderte Problem kann mit Hilfe der Funktion "spl_autoload_register" behoben werden. Dazu kann die alte Autoload Funktion einfach umbenannt und unter einem beliebigen Namen als Autoload Funktion registriert werden:

function customCIAutoload($class)
{
    if (strpos($class, 'CI_') !== 0)
    {
        if (file_exists($file = APPPATH . 'core/' . strtolower($class) . EXT))
        {
            include $file;
        }
        else if (file_exists($file = APPPATH . 'orm/' . strtolower($class) . EXT))
        {
            include $file;
        }
    }
}

spl_autoload_register('customCIAutoload');

Mongy, eine leichtgewichtige PHP MongoDB Klasse

Veröffentlicht am 20.01.2014

Aktuell beschäftige ich mich mit NoSQL Datenbanken, insbesondre MongoDB im PHP Kontext. PHP bietet mit MongoClient eine solide Basisklasse mit der alle fundamentalen Operationen möglich sind. Die Klasse liefert beliebige Dokumente als array inklusive eingebetteter Dokumente. Diese arrays können beispielsweise problemlos mit der json_encode() Funktion in JSON überführt werden. Durch die Verwendung von arrays als Datentyp zur Parameterübergabe kann der Source-Code für komplexere Operationen schnell umfangreicher sowie unübersichtlich werden. Hinzu kommt, dass die Klasse Exceptions zur Fehlerbehandlung vorsieht und keine Shortcut- bzw. Helfer-Methoden bietet. Aus diesem Grund wollte ich für einen möglichen Projekteinsatz mit einer Abstraktion der MongoClient Klasse arbeiten. Auf der MongoDB Website findet man einige Klassen und Libraries darunter auch Doctrine ODM (Object Document Mapper). Ich fand den Mapper Ansatz spannend jedoch wollte ich den Pflege- sowie Laufzeit-Overhead durch das Mapping vermeiden. Nach weiteren Recherchen fand ich die Mongo_Db Klasse des Fuel Frameworks. Die Fuel Klasse ist leichtgewichtig und bietet viele nützliche Helfermethoden. Da ich das Fuel Framework nicht verwende jedoch mit dieser Klasse arbeiten wollte, beschloss ich die entsprechende Klasse abzuändern. Ich habe die Abhängigkeiten zu Fuel eliminiert, wenige Verbesserungen vorgenommen und die Source-Code Konventionen auf camelCase angepasst. Das Ergebnis ist die Klasse Mongy. 

Diese kann von dem GitHub Repository Mongy geladen werden.

Beispiele

<?php

require_once('Mongy.php');

// Create a Mongy object
$m = Mongy::createMongyConnection(array(
    'hostname'   => 'localhost',
    'database'   => 'cooking'
));

// Create a object
$recipe = array(
    'name' => 'Spaghetti Bolognese Gran Gusto',
    'time' => '0:45 Minuten',
    'desc' => 'Zwiebeln in Scheiben schneiden, in eine Pfanne geben, salzen und in Öl gl...',
    'creationDate' => new MongoDate(),

    'ingredients' => array(
        array(
            '_id' => new MongoId(),
            'amount' => '20g',
            'name' => 'Zwiebel'
        ),
        array(
            '_id' => new MongoId(),
            'amount' => '500g',
            'name' => 'Hackfleisch'
        )
    )
);

// Insert a object
echo var_dump( $m->insert('recipes', $recipe) );

echo '<br>----<br>';
//

// Read collection
echo var_dump( $m->get('recipes') );

echo '<br>----<br>';
//

// Update only the name with a new object / array
$recipe2 = array(
    'name' => 'Spaghetti Bolognese Gran Gusto Sepcial'
);

$m->where(array('_id' => new MongoId($recipe['_id'])))->update('recipes', $recipe2, array(), false);
//

// Read one
echo var_dump( $m->where(array('_id' => new MongoId($recipe['_id'])))->getOne('recipes') );

echo '<br>----<br>';
//

// Delete all
$m->deleteAll('recipes');
//

// Read collection
echo var_dump( $m->get('recipes') );

echo '<br>----<br>';
//

Das Refactorn war für mich eine gute Übung die grundlegenden Operationen und Verwendungsweisen von MongoDB kennen zu lernen. Gegenwärtig bin ich MongoDB sehr aufgeschlossen...