管理面板中的URL路由

时间:2018-06-13 07:46:55

标签: php authentication

我设计了这样的文件夹结构:

app
---admin
--------controller
------------------LoginController
------------------IndexController
------------------DashboardController
------------------ etc
--------models
--------view
--------language
---front
--------controller
------------------IndexController
------------------ProfileController
------------------UserController
------------------ etc
--------models
--------view
--------language
core
libs
data
docs
public

申请路线并创建网址:

class Application
{
    /** @var mixed Instance of the controller */
    private $controller;

    /** @var array URL parameters, will be passed to used controller-method */
    private $parameters = array();

    /** @var string Just the name of the controller, useful for checks inside the view ("where am I ?") */
    private $controller_name;

    /** @var string Just the name of the controller's method, useful for checks inside the view ("where am I ?") */
    private $action_name;

    /**
     * Start the application, analyze URL elements, call according controller/method or relocate to fallback location
     */
    public function __construct()
{
    // create array with URL parts in $url
    $this->splitUrl();

    // creates controller and action names (from URL input)
    $this->createControllerAndActionNames();

    // does such a controller exist ?
    if (file_exists(Config::get('PATH_CONTROLLER') . $this->controller_name . '.php')) {

        // load this file and create this controller
        // example: if controller would be "car", then this line would translate into: $this->car = new car();
        require Config::get('PATH_CONTROLLER') . $this->controller_name . '.php';
        $this->controller = new $this->controller_name();

        // check for method: does such a method exist in the controller ?
        if (method_exists($this->controller, $this->action_name)) {
            if (!empty($this->parameters)) {
                // call the method and pass arguments to it
                call_user_func_array(array($this->controller, $this->action_name), $this->parameters);
            } else {
                // if no parameters are given, just call the method without parameters, like $this->index->index();
                $this->controller->{$this->action_name}();
            }
        } else {
            // load 404 error page
            require Config::get('PATH_CONTROLLER') . 'ErrorController.php';
            $this->controller = new ErrorController;
            $this->controller->error404();
        }
    } else {
        // load 404 error page
        require Config::get('PATH_CONTROLLER') . 'ErrorController.php';
        $this->controller = new ErrorController;
        $this->controller->error404();
    }
}

    /**
     * Get and split the URL
     */
    private function splitUrl()
    {
        if (Request::get('url')) {

            // split URL
            $url = trim(Request::get('url'), '/');
            $url = filter_var($url, FILTER_SANITIZE_URL);
            $url = explode('/', $url);

            // put URL parts into according properties
            $this->controller_name = isset($url[0]) ? $url[0] : null;
            $this->action_name = isset($url[1]) ? $url[1] : null;

            // remove controller name and action name from the split URL
            unset($url[0], $url[1]);

            // rebase array keys and store the URL parameters
            $this->parameters = array_values($url);
        }
    }

    /**
     * Checks if controller and action names are given. If not, default values are put into the properties.
     * Also renames controller to usable name.
     */
    private function createControllerAndActionNames()
    {
        // check for controller: no controller given ? then make controller = default controller (from config)
        if (!$this->controller_name) {
            $this->controller_name = Config::get('DEFAULT_CONTROLLER');
        }

        // check for action: no action given ? then make action = default action (from config)
        if (!$this->action_name OR (strlen($this->action_name) == 0)) {
            $this->action_name = Config::get('DEFAULT_ACTION');
        }

        // rename controller name to real controller class/file name ("index" to "IndexController")
        $this->controller_name = ucwords($this->controller_name) . 'Controller';
    }
}

现在,对于front页面,我有这个网址并为我工作并加载控制器和操作:

/controller/action/param1/etc

但是,要访问管理员面板,我需要这个网址:

/admin/controller/action/param1/etc

在加载此网址时的操作,管理员名称是控制器/控制器是操作和........这对我不起作用!如何使用我的文件夹结构路由管理面板网址?!

0 个答案:

没有答案