2016-08-01 9 views
1

Ich versuche, eine Klasse zu schreiben, die die Routen liest, die von dem Konstruktor angegeben werden, mit dem es erstellt wird. Aber selbst nach 1h Googeln habe ich nichts gefunden, wie man auf die getRouter Methode des Laravel Controllers zugreifen kann - weil it's a static function. Ich habe viele Dinge ausprobiert, aber die meiste Zeit habe ich folgende Fehlermeldung:Zugriff auf die statische Eigenschaft von Laravel Controller in PHPSpec?

Uncaught Error: Using $this when not in object context in
vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php(49) :
eval()'d code:13
Stack trace: #0 [internal function]: Double\Illuminate\Routing\Controller\P4::getRouter()

Wie kann ich dies erreichen, oder ist dies möglich, nur nicht mit PhpSpec?

Mein Spec:

use Illuminate\Routing\Controller; 
use PhpSpec\ObjectBehavior; 
use Prophecy\Argument; 

class OptionDescriberSpec extends ObjectBehavior 
{ 

    function let(Controller $controller) 
    { 
     $this->beConstructedWith($controller); 
    } 

    function it_should_read_the_aviable_routes_of_the_controller() 
    { 
     $this->getController()->getRouter()->shouldReturn('Router'); 
     $this->render()->shouldReturn('Router'); 
    } 
} 

Meine Klasse:

use Illuminate\Routing\Controller; 

class OptionDescriber 
{ 

    /** 
    * @var Controller 
    */ 
    protected $controller; 

    /** 
    * OptionDescriber constructor. 
    * 
    * @param Controller $controller 
    */ 
    public function __construct(Controller $controller) 
    { 
     $this->controller = $controller; 
    } 

    public function render() 
    { 
     return $this->controller->getRouter(); 
    } 
} 

Antwort

0
function it_should_read_the_aviable_routes_of_the_controller(Controller $controller, Router $router) 
{ 
    $this->getController()->willReturn($controller); 
    $controller->getRouter()->willReturn($router); 

    $this->render()->shouldReturn($router); 
} 

alltough ist es nicht spec Controller empfohlen. Machen Sie den Controller so dünn wie möglich und bewegen Sie das "Fleisch" in einen Service, der vom Controller verwendet wird.