【问题标题】:Phalcon: how to get controller and action namePhalcon:如何获取控制器和动作名称
【发布时间】:2013-07-24 14:23:35
【问题描述】:

我正在尝试在基于 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();
}
*/

【问题讨论】:

    标签: model-view-controller phalcon


    【解决方案1】:

    我认为,除非您致电 $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() 工作正常。

    【讨论】:

    • 所以我想没有特定于 Phalcon 的方法可以在引导程序中获取控制器/动作名称吗?猜猜我会像你展示的那样自己动手。谢谢。
    【解决方案2】:

    我正在使用路由器对象,因此在->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 />";
    

    【讨论】:

      【解决方案3】:

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

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

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


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

      【讨论】:

      • 感谢此次更新。但是请注意,我最初的问题不是针对微型应用程序的,因此这并不真正适用于原始问题。
      • 好吧,泡菜,我的错!尽管原则保持不变。对于 FullMVC,您可以尝试这里描述的调度程序和事件管理器:docs.phalconphp.com/en/latest/reference/dispatching.html(虽然我不确定它是否真的存在,当您很久以前提出问题时 :))
      【解决方案4】:

      XD $this->router->getActionName()

      【讨论】:

      • 答案是正确的,但请考虑使用完整的句子来描述回复,并可能避免使用表情符号。这就是我们(社区)试图保持清晰的答案风格
      猜你喜欢
      • 1970-01-01
      • 2013-08-17
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多