我正在尝试为我的基于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();
}
*/
答案 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; 中的授权,而不是其他任何地方。
直接在前端控制器中检查授权有点过早。
此处仅在需要时执行授权检查。这是一个更多的代码,但也更有效,因为如果你不需要,你甚至不必使用数据库。
$(document.body).on('click', '.ui-datepicker-close', function (e) {
var value = $('.ui-datepicker-year :selected').text();
$('#feed-time_scheduled').val(value);
});
另一种方法是在中间件之前简单地尝试授权而不检查是否需要它。它与上面的代码相同,但没有处理程序检索。
$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()