/** * advisor를 추가한다. * * @param Advisor $advisor 추가하려는 advisor * @param null $relation 추가하려는 advisor의 before, after 관계에 있는 advisor 목록. 아래와 같은 형식이 될 수 있다. * ``` * ['before'=>'advisor1', 'after'=>['advisor2','advisor3']] * ``` * * @return void */ public function put(Advisor $advisor, $relation = null) { $name = $advisor->getName(); $pointCutStrList = $advisor->getPointCut(); // add advisor if (array_key_exists($name, $this->advisorArr)) { throw new AdvisorNameAlreadyExistsException(['name' => $name]); } $this->advisorArr[$name] = $advisor; foreach ($pointCutStrList as $pointCutStr) { list($class, $method) = explode('@', $pointCutStr); if (isset($this->aliases[$class])) { //$pointCutStr = $this->aliases[$class].'@'.$method; $class = $this->aliases[$class]; } $box = $this->getPointCutBox($class, $method); $box->advisorArr[] = $name; } // add relation $added = false; if (isset($relation['before']) && $relation['before'] !== null) { $this->sorter->add($name, Sorter::BEFORE, $relation['before']); $added = true; } if (isset($relation['after']) && $relation['after'] !== null) { $this->sorter->add($name, Sorter::AFTER, $relation['after']); $added = true; } if (!$added) { $this->sorter->add($name); } }
/** * @depends testCreate * */ public function testSetAdvice(Advisor $advisor) { $advisor->setAdvice(function ($target, $args) { return $target($args) . 'bar'; }); $advice = $advisor->getAdvice(); $this->assertEquals('foobar', $advice(function ($arg) { return $arg; }, 'foo')); }