0

我最近开始使用 Phalcon 框架。除了一个小例外,它看起来非常好 - 我无法让控制器工作。这就是我所拥有的:

//IndexController.php

namespace MyNamespace\Controller;

use Phalcon\Mvc\Controller;

class IndexController extends Controller 
{
    //This is the only method that works
    public function indexAction()
    {
        echo "Hello from IndexController/indexAction";
    }

    //This does not work
    public function loginAction()
    {
        echo "Hello from IndexController/loginAction";
    }
}


//UserController.php
namespace MyNamespace\Controller;
...
//This does not work
public function loginAction()
{
    echo "Hello from UserController/loginAction";
}
...

因此,当我转到 localhost/ - 一切正常时,我看到了这条消息 - “Hello from IndexController/indexAction”。但是,当我转到 localhost/login 或 localhost/user/login 时,我看到了相同的错误消息,即未找到请求的 url。我不确定这有什么问题,我该如何解决。

编辑

我刚刚创建了 routes.php 文件并在我的引导文件中使用它。但是,我看到由于某种原因,除此之外的所有路线都/被忽略了。所以,这就是它的样子:

...
$router = new Phalcon\Mvc\Router(false);

$router->add(
    '/login',
    [
        'namespace' => 'MyNamespace\Controller',
        'controller' => 'user',
        'action' => 'login'
    ]
);

$router->add(
    '/',
    [
        'namespace' => 'MyNamespace\Controller',
        'controller' => 'user',
        'action' => 'login'
    ]
);

所以,我看到这个 routes.php 确实被使用了,因为当我转到 localhost 时,我现在看到来自 UserController loginAction 的消息。但是,当我转到 localhost/login 时,我仍然看到臭名昭著的“未找到”错误消息。我真的很想知道,为什么 Phalcon 会忽略除/.

编辑

所以,我在我的 indexAction 中回显了 phpinfo 并在Configuration标题下看到了这个:

Loaded Modules: core mod_win32 mpm_winnt http_core mod_so mod_php7 mod_access_compat mod_actions mod_alias mod_allowmethods mod_asis mod_auth_basic mod_authn_core mod_authn_file mod_authz_core mod_authz_groupfile mod_authz_host mod_authz_user mod_autoindex mod_cgi mod_dir mod_env mod_include mod_isapi mod_log_config mod_mime mod_negotiation mod_proxy mod_proxy_http mod_rewrite mod_setenvif

如您所见, mod_rewrite 已启用。

编辑

这就是我的 apache 配置文件的样子:

#httpd.conf

<IfModule mod_rewrite>

    <Directory c:/Apache242/htdocs/MyApp/Framework>
      RewriteEngine on
      RewriteRule  ^$ public/    [L]
      RewriteRule  ((?s).*) public/$1 [L]
    </Directory>

    <Directory c:/Apache242/htdocs/MyApp/Framework/public>
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L]
    </Directory>

</IfModule>

#httpd-vhosts.conf

<VirtualHost *:8080>
  DocumentRoot "c:/Apache242/htdocs/MyApp/Framework/public"
  ServerName ia.localhost
  <Directory c:/Apache242/htdocs/MyApp/Framework/public>
    Options All
    AllowOverride All
    Require all granted
  </Directory>
  DirectoryIndex
  <IfModule dir_module>
    DirectoryIndex index.php index.html index.htm
  </IfModule>
</VirtualHost>

似乎我已经掌握了所有的拼图,但它仍然不起作用。

编辑

解决方案是创建具有以下内容的 htaccess 文件:

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L]

并将其放在公用文件夹中。无需其他 htaccess 文件和其他 apache 配置即可使其工作。希望它会帮助某人。

4

0 回答 0