我正在建立一个CodeIgniter项目,到目前为止一切都进展顺利。我的所有路由和控制器都正常工作,除了一个。虽然我是CodeIgniter的新手,但我已经用PHP编程了将近五年,所以我有一些经验。如果有人可以看看下面的代码示例,让我知道我做错了什么,那就太好了。
显然,应用程序确实识别了路由,但它一直在抱怨它无法找到URI。
控制器:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Profile extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->helper('url');
}
public function Profile($page = 'profile-page')
{
if ( ! file_exists(APPPATH.'/views/'.$page.'.php'))
{
// Load error page
show_404();
}
// Capitalize the first letter
$data['title'] = ucfirst($page);
$data['pageType'] = "profile-page";
// Load pages
$this->load->view('templates/header', $data);
$this->load->view('templates/topbar', $data);
$this->load->view('profile');
$this->load->view('templates/footer', $data);
//
}
}
接下来是我的路线:
$route['default_controller'] = 'home/home';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
// All custom routes go below this line.
$route['contact'] = 'pages/contact';
$route['signup'] = 'auth/signup';
$route['login'] = 'auth/login';
$route['profile'] = 'profile/profile';
我已经验证所有视图文件都在正确的文件夹中,并且没有拼写错误。但是,配置文件路由仍然失败。除了Profile路由之外,所有其他路由都能正常工作。
我在Windows 10上使用XAMMP,使用MAMP的Mac OS X Sierra和使用Apache / PHP / MySQL的CentOS 7进行了尝试。
感谢。
答案 0 :(得分:1)
问题是你的代码进入了这个状态&amp;它无法在该路径中找到profile-page.php文件并显示错误。由于我检查了配置文件功能正常调用没有任何问题
if ( ! file_exists(APPPATH.'/views/'.$page.'.php'))
{
echo "test";die;
// Load error page
show_404();
}
答案 1 :(得分:0)
自从我编写CodeIgniter路由以来已经有一段时间了,但我似乎记得方法名称区分大小写,因此具有大写字母'P'的Profile可能会导致问题?
我通常要调试的方法是尝试重命名方法,重命名控制器;您可以想出问题是否在路由中,或者代码中是否存在一些看不见的拼写错误或其他问题,或者路由本身是否存在
不确定这是否有帮助?祝你解决好运!
答案 2 :(得分:0)
Mac OSX区分大小写,请确保控制器中的文件名与您尝试在路径中访问的案例相匹配。如果您也发布输出也会有所帮助。我有一个类似的问题,我通过根据定义的路由重命名我的文件名解决了这个问题。请参考我的回答 HMVC codeigniter works on local server but not on web server 这里。
答案 3 :(得分:0)
在默认控制器中,如果使用CI 3,则不能使用子文件夹,除非您修改了MY_Router.php
在application / core / MY_Router.php
中这是原始问题here
<?php
class MY_Router extends CI_Router {
protected function _set_default_controller() {
if (empty($this->default_controller)) {
show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.');
}
// Is the method being specified?
if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) {
$method = 'index';
}
// This is what I added, checks if the class is a directory
if( is_dir(APPPATH.'controllers/'.$class) ) {
// Set the class as the directory
$this->set_directory($class);
// $method is the class
$class = $method;
// Re check for slash if method has been set
if (sscanf($method, '%[^/]/%s', $class, $method) !== 2) {
$method = 'index';
}
}
if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php')) {
// This will trigger 404 later
return;
}
$this->set_class($class);
$this->set_method($method);
// Assign routed segments, index starting from 1
$this->uri->rsegments = array(
1 => $class,
2 => $method
);
log_message('debug', 'No URI present. Default controller set.');
}
}