我最近开始使用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 / - 一切正常时,我看到这条消息 - “来自IndexController / indexAction的Hello”。但是,当我转到localhost / login或localhost / user / login时,我看到了相同的错误消息,即找不到请求的URL。我不确定这有什么问题,我该如何解决呢。
修改
我刚刚创建了routes.php文件,并在我的bootstrap文件中使用它。但是,我发现由于某种原因,除了/
之外的所有路由都被忽略。所以,这就是它的样子:
...
$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
标题下看到了这一点:
加载模块:核心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配置才能使其正常工作。希望它会帮助别人。