我最近开始使用 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 配置即可使其工作。希望它会帮助某人。