2013-05-01 66 views
3

我有一个基本控制器,所有其他控制器将扩展它。 我想做一些主题和验证,并在其Before函数中加载小部件。Laravel 4控制器之前和之后功能

我知道我可以用路由过滤器来处理这个,但是我不想把我的代码放在路由器里我想让每个控制器的动作先执行“Before function”然后执行这个Base控制器的“After function” Laravel 3.

class FrontController extends \BaseController { 
    protected $layout = 'home.index'; 
    public function __construct() { 
    } 

    public function before() { 
     // Do some theme and validation 
    } 


    public function __call($method, $parameters) { 

     return Response::abort('404'); 
    } 

更新:我正在寻找一种方式,例如,我可以基于页面的配置或负载侧边栏小工具更换主题后,主控制器完成了它的功能和......因为我想访问$ this。

回答

8

根据documentation,您可以通过两种方式在控制器中的方法前后定义。

随着过滤器名称:

$this->beforeFilter('auth'); 
$this->afterFilter('something_else'); 

或封闭:

$this->beforeFilter(function() { 
    // code 
}); 

这些会去你的基地控制器的方法__construct

这里有一个完整的例子:

class BaseController extends Controller { 

    public function __construct() 
    { 
     // Always run csrf protection before the request when posting 
     $this->beforeFilter('csrf', array('on' => 'post')); 

     // Here's something that happens after the request 
     $this->afterFilter(function() { 
      // something 
     }); 
    } 

    /** 
    * Setup the layout used by the controller. 
    * 
    * @return void 
    */ 
    protected function setupLayout() 
    { 
     if (! is_null($this->layout)) 
     { 
      $this->layout = View::make($this->layout); 
     } 
    } 

} 
+0

谢谢本杰明但问题是,当我们使用封闭,我们不能使用$,因为我们不在对象范围内。 例如,这将引发异常: 公共函数__construct(){$ 这 - >后过滤器(功能(){ 的var_dump($这个 - >布局); }); } – 2013-05-01 14:04:58

+1

@MiladRey您可以将参数传递给封闭 – 2013-05-01 16:03:02

+0

我尝试这样做: 公共职能__construct(){$ 这 - > beforeFilter(函数($ OBJ)使用($这个){ 的var_dump($ obj- > layout); }); } 但它抛出 “编译错误:无法使用$该词法变量” – 2013-05-01 18:31:28

相关问题