Инжектиране на променлива в конструктора

Замени resolve метода с това
Код:
public function resolve($class, $method= NULL)
	{
		$reflector = new \ReflectionClass($class);

		if( ! $reflector->isInstantiable())
 		{
 			throw new \Exception("[$class] is not instantiable");
 		}

 		$constructor = $reflector->getConstructor();
		

		if($method && $reflector->hasMethod($method)) {
				$reflectionMethod = new ReflectionMethod($class, $method);
				$methodParams = $reflectionMethod->getParameters();
				$methodDeps = $this->getDependencies($methodParams);
		}
		if(is_null($constructor))
 		{
 			$instance = new $class;
 		}
		else {
			$parameters = $constructor->getParameters();
 			$dependencies = $this->getDependencies($parameters);
			$instance = $reflector->newInstanceArgs($dependencies);
		}
		if(isset($reflectionMethod)) {
			return $reflectionMethod->invokeArgs($instance, $methodDeps);
		}
 		return $instance;
	}
PS: Може да се поизчисти много този код, ама набързо толкова
 
Нещо не ми се получава. Имам това във фронт контролера. Така работи само за конструктора. Тука трябва ли да сменям нещо?
Код:
$this -> _file = $this -> _namespace . DIRECTORY_SEPARATOR . ucfirst($this -> _controller);
        $this -> _load = $this -> _container -> resolve($this -> _file);
        $this -> _load -> { $this -> _method }();
 
Ами да, трябва да подадеш и метода, не виждаш ли, че вече приема 2 параметъра.
Втория ред става това:
Код:
 $this -> _load = $this -> _container -> resolve($this -> _file, $this->_method);
и махаш последния, защото ти вика метода автоматично
 
Добре, така как да разберем какъв е проблема? Кой е loader класа, код? каква грешка "мята"?
 
Ето това ми е класа а грешката е от incFile() метода. Един вид пътя става грешен с втория параметър.

Код:
namespace application;

final class Loader {

    private static $_instance = NULL;
    private $_namespace = array();
    private $_file;

    private function __construct() {
        
    }





    /** @return \application\Loader */
    public static function getInstance() {

        if (self::$_instance === NULL) {
            self::$_instance = new self();
        }

        return self::$_instance;
    }





    public function regAutoload() {

        spl_autoload_register(array(DIRECTORY_SEPARATOR . __CLASS__, 'autoload'));
    }





    public function autoload($class) {

        foreach ($this -> _namespace as $key => $val) {

            if (strpos($class, $key) === 0) {

                $this -> _file = realpath(substr_replace(str_replace('\\', DIRECTORY_SEPARATOR, $class), $val, 0, strlen($key)) . '.php');

                $this -> incFile($this -> _file);

                break;
            }
        }
    }





    private function incFile() {

        if ($this -> _file != FALSE && is_file($this -> _file) && is_readable($this -> _file)) {

            require_once $this -> _file;
        }
        else {

            throw new \Exception('This Exception Is Executed Before FrontController Exceptions: ' . __METHOD__, 404);
        }
    }





    public function regNamespace($name, $path) {

        if (strlen(trim($name)) > 0 && strlen(trim($path)) > 0) {

            $path = realpath($path);

            if ($path != FALSE && is_dir($path) && is_readable($path)) {

                $this -> _namespace[$name . '\\'] = $path . DIRECTORY_SEPARATOR;
            }
            else {

                throw new \Exception('Loader Directory Read Error In: ' . __METHOD__, 500);
            }
        }
        else {

            throw new \Exception('Invalid Name Or Path Param In: ' . __METHOD__, 500);
        }
    }
 
Това което се опитваме да направиме всъщност няма как да се получи. Пренаписвах кода няколко пъти и винаги стигам до там че иска конструктор. Попрочетох малко из нета и се оказва че другия вариант е setter injection, а той се реализира по друг начин. За сега ще оставя нещата така, и без това навсякъде се препоръчва да се избягва setter injection ако може.

Благодаря +1
 

Back
Горе