BaseController.php 2.45 KB
Newer Older
Scott committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
<?php
/*
	Question2Answer by Gideon Greenspan and contributors
	http://www.question2answer.org/

	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

namespace Q2A\Controllers;

21 22
use Q2A\Middleware\BaseMiddleware;

Scott committed
23 24
abstract class BaseController
{
25 26 27 28 29 30 31 32
	/** @var BaseMiddleware[string] */
	private $middleware;

	public function __construct()
	{
		// TODO: constructor taking Database class parameter
		$this->middleware = array();
	}
33 34

	/**
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
	 * Attach a middleware to one action or an array of actions. Use '*' to match all actions.
	 *
	 * @param BaseMiddleware $middleware
	 * @param array|string $actions
	 */
	public function addMiddleware(BaseMiddleware $middleware, $actions = '*')
	{
		if (is_array($actions)) {
			foreach ($actions as $action) {
				$this->addMiddlewareToAction($middleware, $action);
			}
		} else { // If it is a string
			$this->addMiddlewareToAction($middleware, $actions);
		}
	}

	/**
	 * @param BaseMiddleware $middleware
	 * @param string $action
	 */
	private function addMiddlewareToAction(BaseMiddleware $middleware, $action)
	{
		if (!isset($this->middleware[$action])) {
			$this->middleware[$action] = array();
		}

		$this->middleware[$action][] = $middleware;
	}

	/**
	 * Execute the given action with the given parameters on this controller. after running all
	 * middleware for the action. This method is expected to return a qa_content array or throw an
	 * exception.
68 69 70 71 72 73 74 75
	 *
	 * @param string $action Action to execute
	 * @param array $parameters Parameters to send to the action
	 *
	 * @return mixed
	 */
	public function executeAction($action, $parameters)
	{
76 77 78
		$this->executeMiddlewareForAction('*');
		$this->executeMiddlewareForAction($action);

79 80
		return call_user_func_array(array($this, $action), $parameters);
	}
81 82 83 84 85 86 87 88 89 90 91 92 93 94

	/**
	 * @param string $action
	 */
	private function executeMiddlewareForAction($action)
	{
		if (!isset($this->middleware[$action])) {
			return;
		}

		foreach ($this->middleware[$action] as $middleware) {
			$middleware->handle();
		}
	}
Scott committed
95
}