Phalcon:如何获取控制器和动作名称

时间:2013-07-24 21:46:48

标签: model-view-controller phalcon

我正在尝试为我的基于Phalcon的应用程序构建一些授权。在我的bootstrap文件中,我实例化了我的Auth类(扩展了Component),并运行了我的authorize()函数。在该函数内部,我通过调用$Dispatcher = $this->di->getShared('dispatcher')来获取调度程序。

一切似乎都运行良好。但是,当我调用$Dispatcher->getControllerName()时,它返回NULL。

如何访问控制器名称?

这是我的引导程序文件:

$Debug = new \Phalcon\Debug();
$Debug->listen();

#try{
    # Create a Dependency Injection container
    $DI = new \Phalcon\DI\FactoryDefault();

    # Load config
    $Config = require '../app/config/config.php';
    $DI->setShared('config',$Config);

    # Register an autoloader
    $Loader = new \Phalcon\Loader();
    $Loader->registerDirs($Config->phalcon->load_dirs->toArray());
    $Loader->registerNamespaces($Config->phalcon->namespaces->toArray());
    $Loader->register();

    # Initialize Session
    $Session = new \Phalcon\Session\Adapter\Files();
    $Session->start();
    $DI->setShared('session',$Session);

    # Set up the View component
    $DI->set('view',function() use($Config){
        $View = new \Phalcon\Mvc\View();
        $View->setViewsDir($Config->dir->views_dir);
        $View->registerEngines(['.phtml'=> function($View,$DI) use ($Config){
                                            $Volt = new \Phalcon\Mvc\View\Engine\Volt($View,$DI);
                                            $Volt->setOptions([ 'compiledPath'  =>  $Config->dir->views_compile_dir,
                                                                'compileAlways' =>  $Config->app->views_compile_always
                                                              ]);
                                            return $Volt;
                                        }
                            ]);
        $View->Config = $Config;
        return $View;
    });

    # Check authorization
    $Auth = new Auth($DI);
    if($Auth->authorize()){
        $DI->setShared('user',$Auth->getUser());
    }
    else{
        $DI->get('view')->render('system','notallowed');
        exit();
    }


    # Set up connection to database
    $DI->set('db',function() use($Config){
        return new \Phalcon\DB\Adapter\Pdo\Mysql([  'host'      => $Config->database->host,
                                                    'dbname'    => $Config->database->database,
                                                    'username'  => $Config->database->username,
                                                    'password'  => $Config->database->password
                                                ]);
    });

    # Set up base URL
    $DI->set('url',function() use($Config){
        $URL = new \Phalcon\Mvc\Url();
        $URL->setBaseUri('/'.basename($Config->dir->app_dir_web));
        return $URL;
    });

    # Set up message flashing to use session instead of direct
    $DI->set('flash',function(){
        return new \Phalcon\Flash\Session();
    });

    # Handle the requested URL
    $App = new \Phalcon\Mvc\Application($DI);

    # Echo the output
    echo $App->handle()->getContent();
/*
}
catch(\Phalcon\Exception $e){
    echo 'Phalcon Exception: ',$e->getMessage();
}
*/

4 个答案:

答案 0 :(得分:3)

我认为,直到你拨打$app->handle()调度员将无法正确设置。

也许不是直接回复,但我已成功使用Vokuro应用程序成功实施授权:https://github.com/phalcon/vokuro

你的引导程序看起来没问题。

我在bootstrap文件中使用它:

/**
 * Handle the request
 */
$application = new \Phalcon\Mvc\Application();
$application->setDI($di);
if (!empty($_SERVER['REQUEST_URI'])) {
    $uriParts = explode('?', $_SERVER['REQUEST_URI']);
    $uri = $uriParts[0];
} else {
    $uri = '/';
}
echo $application->handle($uri)->getContent();

正如您所看到的,将$ uri参数传递给$application->handle()函数。 内部控制器:$this->dispatcher->getControllerName()工作正常。

答案 1 :(得分:1)

我正在使用Router对象,因此在->handle调用

之前,以下内容适用于我
/** @var $router \Phalcon\Mvc\Router */
$router = require APPLICATION_PATH.'/routes/default.php';
$router->handle($url);
$router->setUriSource(\Phalcon\Mvc\Router::URI_SOURCE_SERVER_REQUEST_URI);

/** @var $matched \Phalcon\Mvc\Router\Route */
$matched = $router->getMatchedRoute();
$paths = $matched->getPaths();

echo 'controller : ',$paths['controller'],"<br />";
echo 'action : ',$paths['action'],"<br />";

答案 2 :(得分:1)

这是一个旧帖子,但如果人们仍然需要它,我会告诉你两种方法来正确处理授权。

在这两种情况下,您都应该在中间件&#34;之前检查&#34; 中的授权,而不是其他任何地方。

直接在前端控制器中检查授权有点过早

1。通过检索处理程序,如您所要求的那样

此处仅在需要时执行授权检查。这是一个更多的代码,但也更有效,因为如果你不需要,你甚至不必使用数据库。

$(document.body).on('click', '.ui-datepicker-close', function (e) {
    var value = $('.ui-datepicker-year :selected').text();
    $('#feed-time_scheduled').val(value);
});

2。没有伏都教魔法

另一种方法是在中间件之前简单地尝试授权而不检查是否需要它。它与上面的代码相同,但没有处理程序检索。

$app = \Phalcon\Mvc\Micro;
$app->before(function() use ($app)
{
    /**
     * @var \Phalcon\Mvc\Controller $oHandler
     */
    $oHandler = null;
    $sAction = null;
    $aHandlerArr = (array)$app->getActiveHandler();
    if (!empty($aHandlerArr) && !empty($aHandlerArr[1]))
    {
        $oHandler = $aHandlerArr[0];
        $sAction = $aHandlerArr[1];
    }

    if ($oHandler && $oHandler->isAuthRequired($sAction))
    {
        // Do auth, and send an error if failed
    }
});

答案 3 :(得分:-1)

XD $这 - &GT;路由器 - &GT; getActionName()