2016-09-12 52 views
1

嗨我有一个包含两种方法的类。 其中之一是初始化会话,另一个是重定向网页 我写了这样的类,它可以被重复调用。定义类方法而不需要保持调用顺序的方法

$obj->setSession(key,value)->redirect(url); 

在此模式下,会话首先被初始化,然后重定向到下一页。 但如果它是这样写的

$obj->redirect(url)->setSession(key,value); 

它只是重定向到定义的位置QND会话不再被初始化.. IT方面的Cuz当resirect方法被调用时,页面的变化及时,它会导致第二方法不被调用.. 有没有什么办法可以反复调用方法而不需要考虑它们的顺序?

+0

我会说是的,但是你必须要加更多的代码来检查你想要的条件是真还是假 –

+0

快速的问题,是'setSession'可选还是你总是需要在重定向之前调用它? –

+0

moethod是可选的 – user3754884

回答

0

当我通常遇到的问题,我想补充的$obj对象的方法叫render()done()或东西来检查我可能以前定义的所有标记,它们的作用。其中一个标志可能是header标志,这是redirect方法通常的做法header(Location: $yourDestUrl)

所以,你最终的东西,如:

$obj->redirect(url)->setSession(key,value)->render(); 
+0

使用渲染方法使代码更长,我已经看到这些方法invokeings在laravel – user3754884

0

当你调用一个方法,如redirectsetSession,把这些行为在“堆栈”你类的属性。

然后,当您调用所有方法时,调用一个名为exec(例如)的方法,该方法将执行“堆栈”中的所有操作。

下面是使用魔术方法基于这一想法基类:

class Stack { 

    private $_stack = array(); 

    public function __call($method, $args) { 

     // Adding method to stack 
     $this->_stack[$method] = $args; 

     return $this; 
    } 

    public function __isset($name) { 

     // Checks if method is in stack 
     return isset($this->_stack[$name]; 
    } 

    public function exec() { 

     // setSession is executed first 
     if (isset($this->setSession)) 
      call_user_func_array('setSessionMethod', $this->_stack['setSession']); 


     // redirect is executed second 
     if (isset($this->redirect)) 
      call_user_func_array('redirectMethod', $this->_stack['redirect']); 

    } 
} 

要使用这个类,你会怎么做:

$stack = new Stack; 
$stack->redirect('arg') 
     ->setSession('arg1', 'arg2') 
     ->exec(); 
+0

许多次使用exec方法使代码更长,我已经看到这些类型的方法调用laravel多次 – user3754884

+0

@ user3754884好吧,没有其他的方式来做你正在问的东西,这些方法总是按照他们写的顺序来调用。因此,如果您的'redirect'方法在调用setSession之前退出执行,它将重定向您的页面,稍后调用方法将不会执行。此外,“堆栈方法”并不杂乱,它只会向exec方法中添加一个必需的调用,并且会为您的类添加几行内容,但它会确保按您想要的顺序执行执行操作该命令用于用户代码调用方法。 – TheKitsuneWithATie