/** * Obtains a new instance of $modelClassName, using a dependency injection * container if possible. * * @param string $modelClassName name of the model * * @return object */ public function factory($modelClassName) { if ($this->dependencyInjector) { return $this->dependencyInjector->getInstance($modelClassName); } $model = new $modelClassName(); return $model; }
/** * Test dependency injection with RedBeanPHP. * * @return void */ public function testDependencyInjection() { // base scenario $geek = R::dispense('geek'); list($coffee, $cocoa) = $geek->getObjects(); asrt($coffee instanceof Dependency_Coffee, FALSE); asrt($cocoa instanceof Dependency_Cocoa, FALSE); // Base scenario with empty container, don't fail $di = new RedBean_DependencyInjector(); $geek = R::dispense('geek'); list($coffee, $cocoa) = $geek->getObjects(); asrt($coffee instanceof Dependency_Coffee, FALSE); asrt($cocoa instanceof Dependency_Cocoa, FALSE); // Succesfull scenario, one missing $di = new RedBean_DependencyInjector(); $di->addDependency('Coffee', new Dependency_Coffee()); RedBean_ModelHelper::setDependencyInjector($di); $geek = R::dispense('geek'); list($coffee, $cocoa) = $geek->getObjects(); asrt($coffee instanceof Dependency_Coffee, TRUE); asrt($cocoa instanceof Dependency_Cocoa, FALSE); // Success scenario $di = new RedBean_DependencyInjector(); $di->addDependency('Coffee', new Dependency_Coffee()); $di->addDependency('Cocoa', new Dependency_Cocoa()); RedBean_ModelHelper::setDependencyInjector($di); $geek = R::dispense('geek'); list($coffee, $cocoa) = $geek->getObjects(); asrt($coffee instanceof Dependency_Coffee, TRUE); asrt($cocoa instanceof Dependency_Cocoa, TRUE); // Don't fail if not exists $di->addDependency('NonExistantObject', new Dependency_Coffee()); $geek = R::dispense('geek'); $geek = R::dispense('geek'); list($coffee, $cocoa) = $geek->getObjects(); asrt($coffee instanceof Dependency_Coffee, TRUE); asrt($cocoa instanceof Dependency_Cocoa, TRUE); // Can we go back to base scenario? RedBean_ModelHelper::clearDependencyInjector(); $geek = R::dispense('geek'); list($coffee, $cocoa) = $geek->getObjects(); asrt($coffee instanceof Dependency_Coffee, FALSE); asrt($cocoa instanceof Dependency_Cocoa, FALSE); }
/** * Obtains a new instance of $modelClassName, using a dependency injection * container if possible. * * @param string $modelClassName name of the model * * @return object */ public static function factory($modelClassName) { if (self::$dependencyInjector) { return self::$dependencyInjector->getInstance($modelClassName); } return new $modelClassName(); }