2

我正在尝试在基于 Phalcon 的应用程序中建立一些授权。在我的引导文件中,我实例化了我的 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

4 回答 4

4

我认为在您调用$app->handle()调度程序之前不会正确设置。

也许不是直接的回应,但我已经成功地使用 Vokuro 应用程序实现了授权:https ://github.com/phalcon/vokuro 。

你的引导程序看起来不错应该可以工作。

我在引导文件中使用它:

/**
 * 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()工作正常。

于 2013-07-25T11:26:06.943 回答
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 />";
于 2013-07-31T11:38:03.650 回答
1

这是一个旧线程,但如果人们仍然需要它,我将向您展示两种正确处理授权的方法。

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

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


1.通过检索处理程序,如你所问

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

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

2.没有巫毒魔法

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

$app = \Phalcon\Mvc\Micro;
$app->before(function() use ($app)
{
    // Do auth ...
    // Set member in your app, if auth succeeded.
    // Then in your controller actions, simply check for the member in your app
});
于 2015-10-19T03:19:13.947 回答
-3

XD $this->router->getActionName()

于 2015-02-23T01:18:23.080 回答