Einzelnen Beitrag anzeigen
  #8  
Alt 14.05.2009, 09:04:39
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: Abhängigkeiten und Voraussetzungen speichern (best practice)

Ich sehe keine Möglichkeit das zu vereinheitlichen. Zumindest nicht alles.


Warenkorb:
Fall 1: Eignet sich recht gut zur Vereinheillichung.
Ein Container mit Inhalt. Da kann man sich jetzt noch überlegen ob der Inhalt Wissen um den Container haben darf. Oder besser nicht.
Wenn nicht, könnte das so aussehen:
PHP-Code:
interface MyContainer
{
  function 
add(ContainerInhalt $element);
}
 
interface 
ContainerInhalt
{
  function 
needs(); // return Dependency;

Fall 2: Ist eine Abhängigkeit ohne Bezug zum aktuellen Container.
Dazu ist eine ganz andere Logik nötig.

Abrechungsoftware:
Kein Container weit und breit. Also evtl mit Warenkorb Fall2 vergleichbar.

Browsergame Rechtesystem
und Warenkorb Fall2
Scheinen sich sehr ähnlich, scheint aber auch nur.

Das Zend_Acl ist in der Hinsicht sehr schön gemacht. Da kann man sich was abschauen. Hat aber den heftigen Nachteil. Dass immer ALLES, also die gesammt Struktur geladen werden muß. Bei zunehmender Applikationskomplexität ein Klotz am Bein.

------------------------------------------------------------------

Schlußendlich:
Du versuchst die Applikationslogik aus der Applikation heraus zu abstrahieren. Das wird nicht gehen.
Die Niere macht Stoffwechsel.
Die Lunge macht Stoffwechsel.
Die Leber macht Stoffwechsel.
Ja, alle machen Stoffwechsel. Haben also Input und Output. Das wars aber auch schon mit den Gemeinsamkeiten.


-------------------------------------------

Zitat:
@DokuLeseHemmung
Danke für den Tipp mit dem pattern.
Da kann ich eine Lösung für php5.3 anbieten. Evtl. kannst du sie ja auf einen Teil der Probleme anwenden.

Eine Kombination aus Registry, Factory und Dependency Injection Pattern.
Besonderheit: Die Abhängigkeiten werden erst zur Laufzeit aufgelöst.



PHP-Code:
<?php
// DIContainer.php
class DIContainer
{
  protected 
$values = array();

  public function 
__construct($file)
  {
    include 
$file;
  }

  public function 
__set($id$value)
  {
    
$this->values[$id] = $value;
  }
  
  public function 
__get($id)
  {
    if (!isset(
$this->values[$id]))
      throw new 
InvalidArgumentException("Value '$id' is not defined.");
    
$val $this->values[$id];
    return 
$this->is_lambda($val)?$val($this):$val;
  }

  public function 
__call($id,Array $params=array())
  {
    
$val $this->__get($id);
    if (!
is_callable($val))
      throw new 
InvalidArgumentException("Value '$id' is not callable.");
    return 
call_user_func_array($val,$params);
  }
  
  public function 
__isset($id)
  {
      return isset(
$this->values[$id]);
  }

  public function 
__unset($id)
  {
      unset(
$this->values[$id]);
  }

  protected function 
asSingleton(Closure $factory)
  {
    return  function (
DIContainer $di) use ($factory)
            {
              static 
$object null;
              if (
is_null($object)) $object $factory($di);
              return 
$object;
            };
  }
  
  protected function 
asLambda(Closure $lambda)
  {
    return  function () use (
$lambda)
            {
              return 
$lambda;
            };
  }
  
  protected function 
is_lambda($var)
  {
    return 
is_object($var) && 'Closure' === get_class($var);
  }
}
?>
PHP-Code:
<?php
// DIConfig.php
$this->alphadsn 'mysql://user:test@localhost/test';

$this->db1 $this->asSingleton(
                                  function (
DIContainer $di)
                                  {
                                    return new 
PDO($di->alphadsn);
                                  }
                               );
                                  
                                  
                                  
$this->Multiplikation $this->asLambda(
                                          function (
$a,$b)
                                          {
                                            return 
$a*$b;
                                          }
                                       );


$this->transform 'nl2br';

                                  
?>
PHP-Code:
<?php
// index.php5_3
error_reporting(E_ALL E_STRICT);
ini_set('display_errors'TRUE);

require_once 
"./DIContainer.php";

$di = new DIContainer('./DIConfig.php');


echo 
'Meldung: '.$di->db1->getAttribute(PDO::ATTR_CONNECTION_STATUS).'<br>';


echo 
$di->Multiplikation(3,5).'<br>';

// Alternativ:
$mul $di->Multiplikation;
echo 
$mul(3,5).'<br>';


echo 
$di->transform("a\nb").'<br>';
Mit Zitat antworten