2011-11-01 371 views
1

對於從另一個應用程序訪問CodeIgniter環境的命令行腳本,工具和(我當前的用例) - 有沒有辦法在不啓動路由過程的情況下「引導」CI?Bootstrap CodeIgniter沒有路由到控制器

例如,使用Zend框架我可以設置正常的常量,創建一個Zend_Application實例,引導應用程序,但只要我不叫:

$application->run(); 

它不會啓動路由過程,但我仍然可以訪問應用程序的資源/模型/等。

有沒有辦法用CodeIgniter來做到這一點?

+0

已經使用了很少的CI,我從來沒有見過。但我還沒挖出那麼多! –

+0

據我所知,這是不可能的。儘管路由器在某種程度上是它自己的一個組成部分,但是在該級別上的所有內容都在CI中幾乎一起烘烤。除此之外,配置項只能存在一次,您不能實例化多個控制器相鄰。 – hakre

+0

@hakre我想我可以強制路由到單個控制器(我已經看到ExpressionEngine的代碼基本上這樣做了),但是你說一旦控制器完成,CI可能會「死掉」在我身上,沒有任何用處。 –

回答

2

有一個wordpress codeigniter插件,它有一個引導文件。我認爲你可以使用它。

我用它玩一點點,如果你要加載CodeIgniter的模型/庫等,這裏是你怎麼做:

  1. 下載插件從上面的鏈接,並解壓縮。
  2. 有一個文件夾ci_mods其中包含引導程序文件。將此文件夾複製到您的codeigniter目錄(系統和應用程序文件夾所在的位置)。
  3. ci_mods文件夾包含兩個文件index.phpCodeIgniter.php。編輯index.php和編輯路徑例如系統路徑將變爲$system_path = dirname(__FILE__) . '/../system';
  4. 爲了防止路由,註釋行號342 CodeIgniter.php

我們用它在一個文件中,就包括ci_mods/index.php,你可以做 -

$ci = & get_instance(); 
$ci->load->model('usermodel','',TRUE); 

$q = $ci->usermodel->getUsers(); 

我還沒有充分挖掘它。它可能更有用。

這是我修改的index.php

<?php 

    // WARNING: This is not an original CI file 

    // backuping query string 
    $query_string = urlencode($_SERVER['QUERY_STRING']); 

    // destroying the $_GET array (but reconstructed when CI leaves) 
    $_GET = array(); 

    // let's use CI a bit to recover our $_GET array 
    $_SERVER['PATH_INFO'] = '/cidip/recover_get_array/'.$query_string; 

/* 
*--------------------------------------------------------------- 
* APPLICATION ENVIRONMENT 
*--------------------------------------------------------------- 
* 
* You can load different configurations depending on your 
* current environment. Setting the environment also influences 
* things like logging and error reporting. 
* 
* This can be set to anything, but default usage is: 
* 
*  development 
*  testing 
*  production 
* 
* NOTE: If you change these, also change the error_reporting() code below 
* 
*/ 
    define('ENVIRONMENT', 'development'); 
/* 
*--------------------------------------------------------------- 
* ERROR REPORTING 
*--------------------------------------------------------------- 
* 
* Different environments will require different levels of error reporting. 
* By default development will show errors but testing and live will hide them. 
*/ 

if (defined('ENVIRONMENT')) 
{ 
    switch (ENVIRONMENT) 
    { 
     case 'development': 
      error_reporting(E_ALL); 
     break; 

     case 'testing': 
     case 'production': 
      error_reporting(0); 
     break; 

     default: 
      exit('The application environment is not set correctly.'); 
    } 
} 

/* 
*--------------------------------------------------------------- 
* SYSTEM FOLDER NAME 
*--------------------------------------------------------------- 
* 
* This variable must contain the name of your "system" folder. 
* Include the path if the folder is not in the same directory 
* as this file. 
* 
*/ 
    $system_path = dirname(__FILE__) . '/../system'; 

/* 
*--------------------------------------------------------------- 
* APPLICATION FOLDER NAME 
*--------------------------------------------------------------- 
* 
* If you want this front controller to use a different "application" 
* folder then the default one you can set its name here. The folder 
* can also be renamed or relocated anywhere on your server. If 
* you do, use a full server path. For more info please see the user guide: 
* http://codeigniter.com/user_guide/general/managing_apps.html 
* 
* NO TRAILING SLASH! 
* 
*/ 
    $application_folder = dirname(__FILE__) . '/../application'; 

/* 
* -------------------------------------------------------------------- 
* DEFAULT CONTROLLER 
* -------------------------------------------------------------------- 
* 
* Normally you will set your default controller in the routes.php file. 
* You can, however, force a custom routing by hard-coding a 
* specific controller class/function here. For most applications, you 
* WILL NOT set your routing here, but it's an option for those 
* special instances where you might want to override the standard 
* routing in a specific front controller that shares a common CI installation. 
* 
* IMPORTANT: If you set the routing here, NO OTHER controller will be 
* callable. In essence, this preference limits your application to ONE 
* specific controller. Leave the function name blank if you need 
* to call functions dynamically via the URI. 
* 
* Un-comment the $routing array below to use this feature 
* 
*/ 
    // The directory name, relative to the "controllers" folder. Leave blank 
    // if your controller is not in a sub-folder within the "controllers" folder 
    // $routing['directory'] = ''; 

    // The controller class file name. Example: Mycontroller.php 
    // $routing['controller'] = ''; 

    // The controller function you wish to be called. 
    // $routing['function'] = ''; 


/* 
* ------------------------------------------------------------------- 
* CUSTOM CONFIG VALUES 
* ------------------------------------------------------------------- 
* 
* The $assign_to_config array below will be passed dynamically to the 
* config class when initialized. This allows you to set custom config 
* items or override any default config values found in the config.php file. 
* This can be handy as it permits you to share one application between 
* multiple front controller files, with each file containing different 
* config values. 
* 
* Un-comment the $assign_to_config array below to use this feature 
* 
*/ 
    // $assign_to_config['name_of_config_item'] = 'value of config item'; 



// -------------------------------------------------------------------- 
// END OF USER CONFIGURABLE SETTINGS. DO NOT EDIT BELOW THIS LINE 
// -------------------------------------------------------------------- 

/* 
* --------------------------------------------------------------- 
* Resolve the system path for increased reliability 
* --------------------------------------------------------------- 
*/ 

    // Set the current directory correctly for CLI requests 
    if (defined('STDIN')) 
    { 
     chdir(dirname(__FILE__)); 
    } 

    if (realpath($system_path) !== FALSE) 
    { 
     $system_path = realpath($system_path).'/'; 
    } 

    // ensure there's a trailing slash 
    $system_path = rtrim($system_path, '/').'/'; 

    // Is the system path correct? 
    if (! is_dir($system_path)) 
    { 
     exit("Your system folder path does not appear to be set correctly. Please open the following file and correct this: ".pathinfo(__FILE__, PATHINFO_BASENAME)); 
    } 

/* 
* ------------------------------------------------------------------- 
* Now that we know the path, set the main path constants 
* ------------------------------------------------------------------- 
*/ 
    // The name of THIS file 
    define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); 

    // The PHP file extension 
    define('EXT', '.php'); 

    // Path to the system folder 
    define('BASEPATH', str_replace("\\", "/", $system_path)); 

    // Path to the front controller (this file) 
    define('FCPATH', str_replace(SELF, '', __FILE__)); 

    // Name of the "system folder" 
    define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/')); 


    // The path to the "application" folder 
    if (is_dir($application_folder)) 
    { 
     define('APPPATH', $application_folder.'/'); 
    } 
    else 
    { 
     if (! is_dir(BASEPATH.$application_folder.'/')) 
     { 
      exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF); 
     } 

     define('APPPATH', BASEPATH.$application_folder.'/'); 
    } 

/* 
* -------------------------------------------------------------------- 
* LOAD THE BOOTSTRAP FILE 
* -------------------------------------------------------------------- 
* 
* And away we go... 
* 
*/ 
    require_once dirname(__FILE__) . '/CodeIgniter'.EXT; 

/* End of file index.php */ 
/* Location: ./index.php */ 
0

到下一個倒黴的人誰也對付CI。對於CI版本1.7,只需執行此操作即可加載實例。假設你已經定義的根目錄

<?php 
define('APPPATH', ROOT . DS . 'application' . DS); 
define('BASEPATH', ROOT . DS . 'system' . DS); 
define('EXT', '.php'); 

require_once(BASEPATH . 'codeigniter/Common'.EXT); 
require_once(BASEPATH . 'codeigniter/Base5'.EXT); 
$controller =& load_class('Controller'); 

在這一點上,你可以叫get_instance請你或CI_Base :: get_instance();

發現它對我們移植它時對舊代碼庫的單元測試非常有用。