php – Codeigniter 安裝並使用 Composer 自動載入(autoload)完整步驟

  1. 透過 Composer 安裝 CI
  2. 自動載入自訂的 Models, Libraries, Helpers
  3. 在 Controllers 測試

題外話,如果你對 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()

 

可以參考這些幫助你理解

  1. 將 Codeigniter 3 改用 Composer 自動讀取 Model 的方法
  2. 在 Codeigniter 操作 Composer 自動載入套件
  3. php – codeigniter 隱藏或省略 index.php
  4. Compoer – 非常簡單的使用 psr-4 來建立自動讀取類別

Comments

發表迴響