2016-09-12 4 views
1

Привет У меня есть класс, который включает в себя два метода. Один из них - инициализировать сеанс, другой - для перенаправления веб-страницы. Я написал класс, чтобы его можно было вызывать повторно.Способ определения методов класса без необходимости сохранения порядка их вызова

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

В этом режиме сеанс сначала инициализируется, а затем перенаправляется на следующую страницу. Но если это написано, как этот

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

Он просто перенаправляет на определенное место Qnd сеанс не инициализирован больше .. Это S Потому что, когда метод resirect называется, страница изменяется быстро, и это приводит к тому, второй метод не должен называться. Есть ли способ многократно вызывать методы, не требуя рассмотрения их заказа?

+0

Я бы сказал, да, но вы должны добавить намного больше кода, чтобы проверить, являются ли условия, которые вы хотите, истинными или ложными. –

+0

Быстрый вопрос, является ли 'setSession' необязательным или вам всегда нужно вызывать его перед перенаправлением? –

+0

, что moethod является необязательным – user3754884

ответ

0

Когда я обычно сталкиваюсь с этой проблемой, я добавляю метод в объект $obj с именем render() или done() или что-то в этом роде, которое проверяет все флаги, которые я мог определить ранее. Один из этих флагов может быть флагом header, что и делает метод redirect обычно header(Location: $yourDestUrl).

Таким образом, вы в конечном итоге с чем-то вроде:

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

с использованием метода рендеринга делает код более длинным, и я видел этот тип методов invokings много раз в laravel – user3754884

0

При вызове метода, такие как redirect или setSession, поставить эти действия в «стопке» как свойство вас класса.

Затем, когда вызываются все ваши методы, вызовите метод, называемый 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 делает код более длинным, и я видел подобные методы invokings много раз в laravel – user3754884

+0

@ user3754884 Ну, нет другого способа делать то, что вы просите, методы всегда будут вызываться в том порядке, в котором они написаны. Поэтому, если ваш метод «redirect» завершает выполнение до вызова 'setSession', он перенаправляет вашу страницу, а последующие вызовы методов не будут выполнены. Более того, метод «stack» не является беспорядочным, он добавляет только один требуемый вызов к методу 'exec' и добавляет несколько строк вашему классу, но он гарантирует, что выполнение выполняется в том порядке, в котором вы хотите, которые заказывают код пользователя, вызывающий методы. – TheKitsuneWithATie

Смежные вопросы