Model view controller Phalcon:如何获取控制器和操作名称
我正试图在我基于Phalcon的应用程序中建立一些授权。在我的引导文件中,我实例化了我的Auth类(它扩展了组件),并运行了我的Model view controller Phalcon:如何获取控制器和操作名称,model-view-controller,phalcon,Model View Controller,Phalcon,我正试图在我基于Phalcon的应用程序中建立一些授权。在我的引导文件中,我实例化了我的Auth类(它扩展了组件),并运行了我的authorize()函数。在该函数中,我通过调用$dispatcher=$this->di->getShared('dispatcher')获取调度程序 一切似乎都很顺利。但是,当我随后调用$Dispatcher->getControllerName()时,它返回NULL 如何访问控制器名称 这是我的引导文件: $Debug = new \Phalcon\Debug(
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();
}
*/
我认为在你调用
$app->handle()
之前,调度程序不会正确设置
可能不是直接响应,但我已经成功地使用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()
工作正常。我认为在您调用$app->handle()
之前,不会正确设置调度器
可能不是直接响应,但我已经成功地使用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()
工作正常。我正在使用一个路由器对象,因此在调用->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 />";
/**@var$router\Phalcon\Mvc\router*/
$router=需要应用程序路径。“/routes/default.php”;
$router->handle($url);
$router->setUriSource(\Phalcon\Mvc\router::URI\u SOURCE\u SERVER\u REQUEST\u URI);
/**@var$matched\Phalcon\Mvc\Router\Route*/
$matched=$router->getMatchedRoute();
$path=$matched->getpath();
echo“controller:”,$path['controller'],“
”;
回显'action:',$path['action'],“
”;
我正在使用一个路由器对象,因此在->处理
调用之前,以下内容对我有效
/** @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 />";
/**@var$router\Phalcon\Mvc\router*/
$router=需要应用程序路径。“/routes/default.php”;
$router->handle($url);
$router->setUriSource(\Phalcon\Mvc\router::URI\u SOURCE\u SERVER\u REQUEST\u URI);
/**@var$matched\Phalcon\Mvc\Router\Route*/
$matched=$router->getMatchedRoute();
$path=$matched->getpath();
echo“controller:”,$path['controller'],“
”;
回显'action:',$path['action'],“
”;
XD
$this->router->getActionName()XD
$this->router->getActionName()这是一个旧线程,但如果人们仍然需要它,我将向您展示两种正确处理授权的方法 在这两种情况下,您都应该在“中间件之前”检查授权,而不是在其他任何地方 直接在前端控制器中检查授权有点过早
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.没有巫术 另一种方法是,只需在before中间件中尝试授权,而无需检查是否需要授权。它与上面的代码相同,但没有处理程序检索
$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
});
这是一个旧线程,但如果人们仍然需要它,我将向您展示两种正确处理授权的方法 在这两种情况下,您都应该在“中间件之前”检查授权,而不是在其他任何地方 直接在前端控制器中检查授权有点过早
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.没有巫术 另一种方法是,只需在before中间件中尝试授权,而无需检查是否需要授权。它与上面的代码相同,但没有处理程序检索
$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
});
那么,我想没有特定于Phalcon的方法在引导中获取控制器/动作名称了吧?我想我会像你表现出来的那样做。谢谢。所以我想在引导中没有特定于Phalcon的方法来获取控制器/动作名称?我想我会像你表现出来的那样做。谢谢。谢谢你的更新。但是,请注意,我最初的问题不是针对微型应用程序的,因此这并不适用于原始问题。好吧,Pickle,我的错!虽然原则是一样的。对于FullMVC,您可以尝试如下所述的dispatcher and events manager:(虽然我不确定您很久以前提出问题时它是否确实存在:))感谢您的更新。但是,请注意,我最初的问题不是针对微型应用程序的,因此这并不适用于原始问题。好吧,Pickle,我的错!虽然原则是一样的。对于FullMVC,你可以尝试这里所描述的调度器和事件管理器(虽然我不确定当你很久以前问过你的问题时,它确实存在):答案是正确的,但是考虑用完整的句子描述响应,并且可能避免表情符号。这是我们(社区)试图保持的答案,正确的答案是正确的,但是考虑用完整的句子描述反应,并且可能避免表情符号。这就是我们(社区)为清晰起见试图保留的答案风格