前言
終于有那么點時間能將Laravel 5
的一些好的實踐總結出來,希望為普及Laravel
和新的PHP
編程思想出一份力。如有錯誤或你有更好的方式戴差,請不吝賜教衅檀,共同進步选调。
本文有配套的git
倉庫嗡善,你也可以clone
我的代碼倉庫,里面包含每一步的操作(沒有多余步驟)学歧。
git clone git@git.oschina.net:notfound/Separated-Laravel.git
正文
通常很多項目都會依賴同一個的框架罩引,還會共用很多代碼庫,手動復制粘貼這些文件到每個項目文件夾顯然很傷害鍵盤枝笨,特別當項目多了之后袁铐,手動管理各種不同版本的庫極容易精神分裂。為避免讓搬磚這項工作對身體横浑、精神造成雙重傷害剔桨,最好將這些文件公用化。那么有哪些方法呢徙融?
使用Composer
Composer
是什么洒缀?Composer
是PHP
庫的管理工具。簡單來說就是所有庫都要告訴Composer
自己依賴哪些庫欺冀,這樣當你告訴Composer
你需要哪些庫(甚至特定的版本)的時候树绩,Composer
就可以把你指定的庫以及他們的依賴幫你全部下載到項目中。
很多人都用過老版本的ThinkPHP
或者CodeIgniter
隐轩,那么一定對import
饺饭、vendor
和$this->load
這些函數(shù)記憶猶新,他們經(jīng)常在構造方法里成群出現(xiàn)职车,形成一道靚麗的風景線瘫俊。那些日子可以忘掉了。使用Composer
悴灵,只要遵循PSR-0
扛芽、PSR-4
規(guī)范,即可實現(xiàn)自動加載积瞒。
Laravel
官方倡導使用Composer
來管理項目(新建Laravel
項目都是用的Composer
川尖,讓很多人感到不適應)。使用Composer
只需在項目目錄下的composer.json
文件中注明依賴庫的名字赡鲜、版本空厌,一個composer install
命令即可自動下載庐船,并且這些庫自身的依賴也會被自動處理银酬。以下是一個典型Laravel 5
新項目的composer.json
:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"laravel/framework": "5.0.*"
},
"require-dev": {
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1"
},
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-create-project-cmd": [
"php -r \"copy('.env.example', '.env');\"",
"php artisan key:generate"
]
},
"config": {
"preferred-install": "dist"
}
}
這里就不細說Composer
的使用方法和配置格式了。
只需要理解一點筐钟,composer.json
就是你項目所需要的庫的清單(Laravel
框架也是一個Composer
庫)揩瞪,composer install
命令則會查找當前目錄下的清單,然后自動下載這些庫到當前目錄的vendor/
文件夾(如果本地已經(jīng)下載過相同版本篓冲,則直接從緩存讀壤钇啤)宠哄,并且生成一個autoload.php
文件,然后你只需要require
這個文件嗤攻,即可調用安裝的庫了(autoload.php
里實現(xiàn)了一個懶加載毛嫉,在調用未聲明類時,會按照自己的規(guī)則去引用這個文件)妇菱。
注意承粤,在一個典型的Laravel
項目中,你并不需要手動require
這個文件闯团,入口文件引用的/bootstrap/autoload.php
里已經(jīng)包含辛臊。
簡單介紹了Composer
,相信已經(jīng)有人想到怎么用Composer
來管理公用代碼:只需將所有用到的公用代碼封裝成庫就行了房交。如果不想提交到Composer
官方的源彻舰,我們也可以在內網(wǎng)搭建一個公用庫的Composer
服務器。
每個提交都會產(chǎn)生一個Composer
版本(便于管理)候味,Composer
如果檢測到本地有相同版本的緩存文件刃唤,安裝速度也會非常快白群,不必太擔心速度問題透揣。但這個方法顯得稍繁瑣了。在修改庫之后必須通過Composer
更新到源川抡,接著依賴的項目還得一個個執(zhí)行composer update
來更新(你可以寫自動化腳本辐真,不過就更麻煩了吧)。
在一個中小型項目中崖堤,我們可能只會維護一套框架版本(例如Laravel 5.*
)和一套公用代碼庫侍咱,那么在每個項目中都安裝一次Laravel
框架和代碼庫總讓人覺得有點不對勁。而且Composer
的官方源因為某些神秘原因而非常慢密幔,有時新建一個Laravel
項目需要20分鐘……我們不想浪費團隊每個人的時間楔脯,我們試試有沒有別的解決方案。
鏈接法
這是我總結的一套方案胯甩,目前工作得還不錯昧廷。在構建共用庫目錄結構之前,我們得先把Laravel
框架公用出來偎箫,因為我們只需要一套能公用的框架代碼木柬。
我們先從一個標準Laravel
項目中分離出Laravel
框架。我知道有些人表示很擔心淹办,所以首先確定幾個基本原則:
不改變
Laravel
項目的目錄結構眉枕、不要改動框架代碼,方便未來升級;不用奇怪的
hack
方式實現(xiàn)(通用性不強)速挑;不會給新建項目帶來一些配置麻煩(比如得通過
ln -s
映射一些目錄)谤牡;沒有任何功能遺失(我們想感受
Laravel
所有的優(yōu)點)。
OK姥宝,明確了基本原則翅萤,我們來看看設想的、分離之后的目錄結構:
application/
laravel/
application
是項目目錄腊满,laravel
是Laravel
框架的目錄断序,清晰明了。
我們再來看看一個官方Laravel
項目的目錄結構(使用Laravel 5.0.16
):
Laravel官方新項目結構
app/
bootstrap/
config/
database/
public/
resources/
storage/
tests/
vendor/
.env
.env.example
.gitattributes
.gitignore
artisan
composer.json
composer.lock
gulpfile.js
package.json
phpspec.yml
phpunit.xml
readme.md
server.php
如果你在使用ThinkPHP
糜烹、CodeIgniter
等沒有采用composer
等技術的框架违诗,看到這么多不認識的文件肯定不開心了……不過不要緊,這并不妨礙構建一個基礎Hello world
實例(當然還是得下載Composer
)疮蹦,其他的東西你可以搜索網(wǎng)絡了解诸迟,或者看我以后的教程分享(如果有時間寫的話)。
文件夾和文件看起來很多愕乎,我們一個個來看吧阵苇。要分離出框架,首先我們要弄清楚什么是不能分離出去感论、必須放在項目文件夾里的绅项。
不能分離的文件、目錄
這是一份我總結的列表和原因:
app/ #項目的程序邏輯總不能拿出去吧比肄?
bootstrap/ #我們稍后單獨說
config/ #項目配置快耿,你懂的
database/ #項目的數(shù)據(jù)庫相關腳本
public/ #項目的,入口文件`index.php`我們單獨說
resources/ #項目的資源
storage/ #項目的本地存儲
tests/ #項目的測試腳本芳绩,刪掉也不影響
vendor/ #稍后單獨說
.env #也是項目的配置掀亥,在`Laravel`文檔中有說明
.env.example #是上面文件的好基友
.gitattributes #框架的,移走
.gitignore #框架的妥色,移走
artisan #稍后單獨說
composer.json #稍后單獨說
composer.lock #稍后單獨說
gulpfile.js #項目的搪花,不細說,刪掉也不影響
package.json #項目的嘹害,不細說撮竿,刪掉也不影響
phpspec.yml #項目的,不細說笔呀,刪掉也不影響
phpunit.xml #項目的幢踏,不細說,刪掉也不影響
readme.md #框架的README凿可,移走
server.php #稍后單獨說
我們已經(jīng)排除了一大半不能移動的文件(文件夾)惑折。我們來單獨看幾個特殊的。
artisan
artisan
是Laravel
的特色之一枯跑,如果想要在項目目錄執(zhí)行php artisan [command]
惨驶,這個得保留。打開看看它的代碼:
#!/usr/bin/env php
<?php
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/
require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/
$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArgvInput,
new Symfony\Component\Console\Output\ConsoleOutput
);
/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running. We will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/
$kernel->terminate($input, $status);
exit($status);
基本來說它就是一個入口文件敛助,將處理邏輯丟給了Laravel
核心粗卜,所以它基本不會改變,我們可以放心留下它(require
路徑問題我們后面接著說)纳击。
server.php
<?php
/**
* Laravel - A PHP Framework For Web Artisans
*
* @package Laravel
* @author Taylor Otwell <taylorotwell@gmail.com>
*/
$uri = urldecode(
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);
// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' and file_exists(__DIR__.'/public'.$uri))
{
return false;
}
require_once __DIR__.'/public/index.php';
使用PHP
內置web服務器啟動這個腳本可以進行快速調試(無需Http服務器)续扔,文件結構一目了然,無需更改焕数。
readme.md
放在laravel
文件夾纱昧,飲水思源,尊重勞動成果堡赔。
Composer文件识脆、bootstrap/、vendor善已、public/index.php
這幾個部分涉及了整個框架的加載流程灼捂,所以放在一起說。
分離Laravel
框架换团,我們得知道Laravel
框架在哪吧悉稠。既然是通過Composer
安裝的,那肯定在vendor/
文件夾艘包,我們把它移到我們自己的laravel/
文件夾不就完了的猛!然而這并沒有什么用……
當我們打開vendor/
,發(fā)現(xiàn):
bin/
classpreloader/
composer/
danielstjules/
dnoegel/
doctrine/
...
symfony/
vlucas/
autoload.php
怎么這么多文件想虎!可是composer.json
的require
部分明明是這樣:
...
"require": {
"laravel/framework": "5.0.*"
},
"require-dev": {
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1"
},
...
沒錯衰絮,這是一個官方Laravel
項目的依賴列表,除開Composer
自身產(chǎn)生的文件(composer/
和autoload.php
)磷醋,應該只有3個目錄才對猫牡,其他的是什么呢?
其實邓线,其他的文件夾是項目依賴的依賴淌友,Composer
默認都會放到頂層的vendor/
文件夾(和拖家?guī)Э诘?code>npm的明顯差別)。
那我們是不是把這些文件夾全部移到我們的laravel/
文件夾就行了呢骇陈?且慢震庭。
Composer
我們繼續(xù)看看根目錄的composer.json
文件。
...
"require-dev": {
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1"
},
...
Laravel
默認自帶了phpspec.yml
和phpunit.xml
你雌,兩者都是代碼測試工具的配置文件器联,所以默認也帶上了這兩個開發(fā)依賴(不影響項目正常運行的依賴)二汛。Laravel
官方還有一些擴展包,也是通過Composer
安裝的拨拓,更有Laravel
開發(fā)者喜聞樂見的ide-helper
(一個為Facade
特性增加代碼補全功能的庫)肴颊,都需要通過Composer
安裝。特別不要忘了渣磷,我們的Laravel
還要通過Composer
來升級啊婿着,所以我們最好保留Composer
需要的結構,所以現(xiàn)在我們的laravel/
文件夾是這樣的:
laravel/
bootstrap/
vendor/
composer.json
composer.lock
.gitattributes
.gitignore
README.md
我們將vendor/
和composer.json
原樣保存醋界,在項目中只需要引入vendor/autoload.php
就可以自動加載框架了竟宋,這樣無論是升級Laravel
還是composer install
安裝任何需要共用的包都非常容易。
但是請注意composer.json
的這一段:
...
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-create-project-cmd": [
"php -r \"copy('.env.example', '.env');\"",
"php artisan key:generate"
]
},
...
這里都是針對項目的配置形纺,不刪掉會造成報錯丘侠。那么我們改成:
...
"autoload": {
"classmap": [
],
"psr-4": {
}
},
"autoload-dev": {
"classmap": [
]
},
"scripts": {
"post-install-cmd": [
],
"post-update-cmd": [
],
"post-create-project-cmd": [
]
},
...
我們的項目文件也需要依賴Composer
來實現(xiàn)例如自動加載
等功能,所以我們在application/
文件夾下創(chuàng)建一個新的composer.json
文件逐样,內容如下:
{
"name": "application",
"description": "my application.",
"keywords": [],
"license": "MIT",
"type": "project",
"require": {
},
"require-dev": {
},
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-create-project-cmd": [
"php -r \"copy('.env.example', '.env');\"",
"php artisan key:generate"
]
},
"config": {
"preferred-install": "dist"
}
}
接著在application/
目錄中執(zhí)行composer dumpautoload
以生成自動加載的相關文件婉陷。
public/index.php
和bootstrap/
大塊頭都移走了,我們再從入口文件開始看:
<?php
/**
* Laravel - A PHP Framework For Web Artisans
*
* @package Laravel
* @author Taylor Otwell <taylorotwell@gmail.com>
*/
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels nice to relax.
|
*/
require __DIR__.'/../bootstrap/autoload.php';
/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/
$app = require_once __DIR__.'/../bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can simply call the run method,
| which will execute the request and send the response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/
$kernel = $app->make('Illuminate\Contracts\Http\Kernel');
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
代碼意圖很明確官研,加載bootstrap/
下的兩個文件秽澳,分別實現(xiàn)自動加載(懶加載)
和設置框架
,在public/index.php
的最后戏羽,啟動了框架流程担神。這兩個文件我們也移到laravel/bootstrap/
文件夾,不過需要解決一下路徑問題始花。
例如bootstrap/autoload.php
文件里是這樣的:
<?php
define('LARAVEL_START', microtime(true));
/*
|--------------------------------------------------------------------------
| Register The Composer Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/
require __DIR__.'/../vendor/autoload.php';
/*
|--------------------------------------------------------------------------
| Include The Compiled Class File
|--------------------------------------------------------------------------
|
| To dramatically increase your application's performance, you may use a
| compiled class file which contains all of the classes commonly used
| by a request. The Artisan "optimize" is used to create this file.
|
*/
$compiledPath = __DIR__.'/../storage/framework/compiled.php';
if (file_exists($compiledPath))
{
require $compiledPath;
}
第30
行指定了storage/framework/compiled.php
(編譯命令產(chǎn)生的緩存文件妄讯,用來提高性能),storage/
文件夾是屬于項目的酷宵,那么我們在public/index.php
里定義一個項目文件夾路徑:
// 項目文件夾
define('APP_DIR', __DIR__);
然后將bootstrap/autoload.php
的30
行改為:
$compiledPath = APP_DIR.'/../storage/framework/compiled.php';
完美亥贸。bootstrap/
下的文件并不涉及到Laravel
核心邏輯,我也不認為在5.*
版本(起碼也是5.1
以內)中會有太大變化浇垦,所以放心改炕置。我們再看看bootstrap/app.php
:
<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
/*
|--------------------------------------------------------------------------
| Bind Important Interfaces
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
*/
$app->singleton(
'Illuminate\Contracts\Http\Kernel',
'App\Http\Kernel'
);
$app->singleton(
'Illuminate\Contracts\Console\Kernel',
'App\Console\Kernel'
);
$app->singleton(
'Illuminate\Contracts\Debug\ExceptionHandler',
'App\Exceptions\Handler'
);
/*
|--------------------------------------------------------------------------
| Return The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/
return $app;
同樣,第15
行的__DIR.'/../'
指的是項目的根目錄男韧,所以我們改成:
$app = new Illuminate\Foundation\Application(
realpath(APP_DIR)
);
最后朴摊,我們將public/index.php
里的引用代碼改成為laravel/bootstrap/
下的這兩個文件就可以了,我們定義一個常量LARAVEL_DIR
指向laravel/
文件夾以便我們寫路徑此虑。
對了甚纲,差點忘記還得在public/index.php
開頭加上require __DIR__.'/../vendor/autoload.php'
。
到這里朦前,我們的項目就可以正常運行了介杆。
等一下鹃操!是不是漏了什么
對了,還有最開始看的artisan
文件春哨。我們再打開看看:
#!/usr/bin/env php
<?php
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/
require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/
$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArgvInput,
new Symfony\Component\Console\Output\ConsoleOutput
);
/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running. We will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/
$kernel->terminate($input, $status);
exit($status);
這里也引用了bootstrap/
荆隘,但是我們已經(jīng)把它移到laravel/
了,我們就修改一下吧悲靴。
但是這里改一下那里改一下臭胜,也太亂了吧……
那么優(yōu)化一下莫其。
我們先不動artisan
并還原application/public/index.php
癞尚,然后在項目目錄下也添加一個bootstrap/
目錄,添加bootstrap/autoload.php
乱陡、bootstrap/app.php
兩個文件浇揩,文件內容很簡單,直接引用laravel/bootstrap/
下對應的兩個文件憨颠,并把require __DIR__.'/../vendor/autoload.php'
放在這里的autoload.php
中胳徽。當然我們還是要定義LARAVEL_DIR
和APP_DIR
,我們在項目根目錄下新建一個path.php
文件爽彤,把路徑定義放進去养盗,然后在public/index.php
和artisan
里加上對path.php
的引用就大功告成了。
對原始文件的改動少多了适篙,你的代碼潔癖癥
有沒有感覺好一些往核?
就這樣完了?這樣肯定有問題嚷节!
目前我確實發(fā)現(xiàn)了一個問題聂儒。
php artisan optimize
命令
在執(zhí)行php artisan optimize
命令的時候會出現(xiàn)錯誤:
[InvalidArgumentException]
Configuration file "/application_1/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/application_1/app/Providers/App
ServiceProvider.php,/application_1/app/Providers/BusServiceProvider.php,/application_1/app/Providers/ConfigSer
viceProvider.php,/application_1/app/Providers/EventServiceProvider.php,/application_1/app/Providers/RouteServi
ceProvider.php" does not exist.
這是因為optimize
命令里寫死了框架核心文件的路徑,必須從$app['path.base'].'vendor/'
里加載硫痰,而$app['path.base']
則是指向的項目根目錄(我覺得這樣寫死很不科學衩婚,不過這是傳說中的規(guī)范。Laravel
官方并不推薦將框架分離出去效斑,所以基于這個出發(fā)點非春,寫死做法也沒有問題)。
我們可以單獨實現(xiàn)一個optimize
命令來解決這個問題(我的就叫做optimize-separated
)缓屠,或者我們在laravel/
目錄下執(zhí)行composer dumpautoload -o
税娜,也能獲得差不多的性能優(yōu)化。
優(yōu)化
程序可以正常運行了藏研,不過我們還得優(yōu)化一下結構敬矩,
Laravel
是一個更新非常頻繁、社區(qū)非炒赖玻活躍的框架弧岳,這意味著版本更新會很快凳忙。版本升級通常會有一些目錄結構的改變(3到4,4到5,變化都很大)禽炬,有些是推薦性的涧卵、有些是強制性的,所以一年后我們的laravel/
可能在用Laravel 6
了腹尖,項目文件結構發(fā)生了很大的改變柳恐,而我們并不想去修改一年前項目的結構,假設我們使用的是LTS
(長期支持)版本热幔,我們也不需要緊跟最新的大版本乐设。所以我們做一個簡單的修改。
application/
laravel/
laravel5.0/
把laravel/
的文件移到laravel5.0/
即可绎巨,以后升級了我們就再開一個目錄近尚,例如laravel5.1/
。
最后將laravel/laravel5.0/vendor/
文件夾從laravel/laravel5.0/.gitignore
中移除场勤,提交到版本控制服務器戈锻,團隊中其他人只需拉取你提交的框架而不用執(zhí)行composer install
了『拖保框架代碼最好由一個人維護格遭,以免造成代碼沖突。
公用庫
篇幅有限留瞳,這里只講一下解決方案拒迅。我們主要利用命名空間
和Composer
來實現(xiàn)。
首先需要修改laravel/laravel5.0/composer.json
文件的這一段:
...
"autoload-dev": {
"classmap": [
]
},
...
我們添加一個配置:
...
"autoload": {
"classmap": [
],
"psr-4": {
"Common\\": "../common/"
}
},
...
這里主要使用了PSR-4
規(guī)范(和application/
的composer.json
一樣撼港。具體規(guī)范這里就不細說了)坪它。
那么我們就可以開始寫公用庫了!新建文件laravel/common/Add.php
帝牡,輸入以下內容:
<?php namespace Common;
class Add
{
static function execute($a, $b)
{
return $a + $b;
}
}
然后在laravel/laravel5.0/
目錄下執(zhí)行命令生成新的自動加載配置:
composer dumpautoload
接下來我們就可以直接使用\\Common\\Add::execute(1, 2)
了往毡。我這里將common/
文件夾放在了laravel/
文件夾中,如果你的代碼庫和Laravel
某個版本有依賴關系靶溜,那么放在指定版本的Laravel
文件夾中更科學开瞭。
因為包含了一點點推理,也許本文會讓人覺得有點復雜罩息,你可以參考文章開頭的git
倉庫嗤详,里面僅包含直接有效的操作步驟和說明。
這篇文章就這么完了瓷炮。