3

我有一个基本控制器,所有其他控制器都会扩展它。我想做一些主题和验证,并在它的 Before 函数中加载小部件。

我知道我可以使用 Routes 过滤器来处理这个问题,但我不想将我的代码放在路由器中,我希望每个控制器操作首先执行“之前功能”,然后执行这个基本控制器(如 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.

4

1 回答 1

8

根据文档,您可以通过两种方式在控制器中定义 before 和 after 方法。

使用过滤器名称:

$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);
        }
    }

}
于 2013-05-01T12:10:36.760 回答