Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller Phalcon:如何获取控制器和操作名称_Model View Controller_Phalcon - Fatal编程技术网

Model view controller Phalcon:如何获取控制器和操作名称

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(

我正试图在我基于Phalcon的应用程序中建立一些授权。在我的引导文件中,我实例化了我的Auth类(它扩展了组件),并运行了我的
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,你可以尝试这里所描述的调度器和事件管理器(虽然我不确定当你很久以前问过你的问题时,它确实存在):答案是正确的,但是考虑用完整的句子描述响应,并且可能避免表情符号。这是我们(社区)试图保持的答案,正确的答案是正确的,但是考虑用完整的句子描述反应,并且可能避免表情符号。这就是我们(社区)为清晰起见试图保留的答案风格