php – Codeigniter 安裝並使用 Composer 自動載入(autoload)完整步驟
題外話,如果你對 Codeigniter 開發有過一小段時間,這兩篇文章很值得你來讀讀
透過 Composer 安裝 Codeigniter 3
如果你曾經用過 Codeigniter 與 Composer 一點經驗,這份教學能快速幫你安裝整個流程。
- 準備在 C:\xampp\htdocs\www 建立 ci 當作專案路徑
- PHP Version 7.0.9
- 已安裝 Composer
composer create-project codeigniter/framework ci cd ci
如果已經先建立好 ci 路徑的話,當然也可以使用「 . 」
composer create-project codeigniter/framework .
改設定: application/config/config.php
$config['index_page'] = ''; $config['composer_autoload'] = 'vendor/autoload.php'; $config['encryption_key'] = '填入你喜歡的任何亂碼,這是給 Encryption Class 加密用的';
建議將
$config['base_url'] = '';
改成
// 允許多筆通過的網域 $allowed_domains = ['填入本機網域如 localhost', '填入上線網域如 domain.com']; // 當偵測到非上述的例外狀況,會被導向到的網域 $default_domain = '預設網域如 domain.com'; if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, TRUE)) { if ($_SERVER['HTTP_HOST'] == "localhost") { // 如果放在網域底下的路徑如 http://localhost/test 那請填入 // $_SERVER['HTTP_HOST'] . "/test" $domain = $_SERVER['HTTP_HOST'] . ""; } else { $domain = $_SERVER['HTTP_HOST']; } } else { $domain = $default_domain; } if ( ! empty($_SERVER['HTTPS'])) { $config['base_url'] = 'https://'.$domain; } else { $config['base_url'] = 'http://'.$domain; }
修改 autoload.php
$autoload['libraries'] = array('database'); $autoload['helper'] = array('url');
移除 index.php:根目錄增加 .htaccess,並指定不用 Rewrite 的檔案或路徑名稱。儲存後瀏覽 http://localhost/ci/welcome/index 是否等於 http://localhost/ci/index.php/welcome/index。若要詳細 SEO 優化,可捲至底下參考 3。
DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
如果要自動將 http 導向 https 可以這麼寫
DirectoryIndex index.php RewriteEngine on RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
修改 index.php
case 'development': error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); ini_set('display_errors', 1);
自動載入自訂的 Models, Libraries, Helpers
修改 composer.json
- 類別 (Class) 使用 “psr-4” 規範,後面的 libraries 製作我會使用這個規範。
- 方法 (Function) 使用 “files”
- classmap 指定的是一些不屬於 psr-4 規範的類別,可能是我們從 Github 下載其他人的類別
{ ......略 }, "autoload": { "psr-4": { "Model\\": "application/models", "Lib\\": "application/libraries" }, "files": ["application/helpers/Datetime.php"], "classmap": [ "application/libraries" ] } }
composer dump
Models
增加 application/models/Tool.php,提供給 Models 使用 CI 內部資源
<?php namespace Model; trait Tool { protected $ci; protected $db; public function __construct() { $this->ci =& get_instance(); $this->ci->load->database(); $this->db = $this->ci->db; } }
*** 下面是我個人紀錄為了方便 select 取資料所擴充的用法,網友不必使用 ***
<?php namespace Model; trait Tool { protected $ci; protected $db; public function __construct() { $this->ci =& get_instance(); $this->ci->load->database(); $this->db = $this->ci->db; } /** * 返回資料庫取得的樣式 * @param $query 查詢結果資源 * @param $info_list 單筆資料 info | 多筆資料 list * @return 當列數為 0 時返回 "false" | 筆數 > 0 返回 "二維列表" */ protected function result($query, $info_list) { if (!in_array($info_list, ['info', 'list'])) throw new \Exception("SQL 查詢結果請指定回傳 info | list"); // 可返回字串 if (is_string($query)) return $query; $result = $query->result_array(); // 查詢結果 $num = count($result); //列數 // 如果數量是 0 那返回 false if ($num === 0) return false; // 若有資料,把二維陣列都改採 \Jsnlib 方式 $result = new \Jsnlib\Ao($result); if ($info_list == "info") return $result[0]; else return $result; } }
增加 application/models/User.php
<?php namespace Model; class User { use Tool; public function get() { return "我是 Models 底下的 User <br>"; } }
Libraries
增加 application/libraries/Home.php
<?php namespace Lib; class Home { public function get() { return "我是 Libraries 底下的 Home <br>"; } }
Helpers
增加 application/Helpers/Datetime.php。
Function 比較麻煩,每增加一個檔案就要添加到 composer.json => “file”
<?php namespace Helper\Datetime; function get() { return "我是 Helpers 底下檔案為 Datetime 的 get() "; }
在 Controllers 測試
修改 applicatioin/controllers/Welcome.php
public function index() { $this->user_model = new \Model\User; echo $this->user_model->get(); $this->home = new \Lib\Home; echo $this->home->get(); echo \Helper\Datetime\get(); }
瀏覽後會得到
我是 Models 底下的 User 我是 Libraries 底下的 Home 我是 Helpers 底下檔案為 Datetime 的 get()
Comments