公用`Laravel`框架與公用庫架構

前言

終于有那么點時間能將Laravel 5的一些好的實踐總結出來,希望為普及Laravel和新的PHP編程思想出一份力。如有錯誤或你有更好的方式戴差,請不吝賜教衅檀,共同進步选调。

本文有配套的git倉庫嗡善,你也可以clone我的代碼倉庫,里面包含每一步的操作(沒有多余步驟)学歧。

git clone git@git.oschina.net:notfound/Separated-Laravel.git

正文

通常很多項目都會依賴同一個的框架罩引,還會共用很多代碼庫,手動復制粘貼這些文件到每個項目文件夾顯然很傷害鍵盤枝笨,特別當項目多了之后袁铐,手動管理各種不同版本的庫極容易精神分裂。為避免讓搬磚這項工作對身體横浑、精神造成雙重傷害剔桨,最好將這些文件公用化。那么有哪些方法呢徙融?

使用Composer

Composer是什么洒缀?ComposerPHP庫的管理工具。簡單來說就是所有庫都要告訴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框架。我知道有些人表示很擔心淹办,所以首先確定幾個基本原則

  1. 不改變Laravel項目的目錄結構眉枕、不要改動框架代碼,方便未來升級;

  2. 不用奇怪的hack方式實現(xiàn)(通用性不強)速挑;

  3. 不會給新建項目帶來一些配置麻煩(比如得通過ln -s映射一些目錄)谤牡;

  4. 沒有任何功能遺失(我們想感受Laravel所有的優(yōu)點)。

OK姥宝,明確了基本原則翅萤,我們來看看設想的、分離之后的目錄結構:

application/
laravel/

application是項目目錄腊满,laravelLaravel框架的目錄断序,清晰明了。

我們再來看看一個官方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

artisanLaravel的特色之一枯跑,如果想要在項目目錄執(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.jsonrequire部分明明是這樣:

...
    "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.ymlphpunit.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.phpbootstrap/

大塊頭都移走了,我們再從入口文件開始看:

<?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.php30行改為:

$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_DIRAPP_DIR,我們在項目根目錄下新建一個path.php文件爽彤,把路徑定義放進去养盗,然后在public/index.phpartisan里加上對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倉庫嗤详,里面僅包含直接有效的操作步驟和說明。

這篇文章就這么完了瓷炮。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末葱色,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娘香,更是在濱河造成了極大的恐慌苍狰,老刑警劉巖办龄,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異淋昭,居然都是意外死亡俐填,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門翔忽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來英融,“玉大人,你說我怎么就攤上這事歇式∈晃颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵贬丛,是天一觀的道長撩银。 經(jīng)常有香客問我给涕,道長豺憔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任够庙,我火速辦了婚禮恭应,結果婚禮上,老公的妹妹穿的比我還像新娘耘眨。我一直安慰自己昼榛,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布剔难。 她就那樣靜靜地躺著胆屿,像睡著了一般徐伐。 火紅的嫁衣襯著肌膚如雪潘拨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天喝检,我揣著相機與錄音纯趋,去河邊找鬼憎兽。 笑死,一個胖子當著我的面吹牛吵冒,可吹牛的內容都是我干的纯命。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼痹栖,長吁一口氣:“原來是場噩夢啊……” “哼亿汞!你這毒婦竟也來了?” 一聲冷哼從身側響起揪阿,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤疗我,失蹤者是張志新(化名)和其女友劉穎匙铡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍粥,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡鳖眼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嚼摩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦讳。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枕面,靈堂內的尸體忽然破棺而出愿卒,到底是詐尸還是另有隱情,我是刑警寧澤潮秘,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布琼开,位于F島的核電站,受9級特大地震影響枕荞,放射性物質發(fā)生泄漏柜候。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一躏精、第九天 我趴在偏房一處隱蔽的房頂上張望渣刷。 院中可真熱鬧,春花似錦矗烛、人聲如沸辅柴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碌嘀。三九已至,卻和暖如春歪架,著一層夾襖步出監(jiān)牢的瞬間股冗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工牡拇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魁瞪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓惠呼,卻偏偏與公主長得像导俘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剔蹋,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • 是什么 如果你知道yum旅薄、apt-get、npm、bower等命令中的一種或者多種少梁,那么洛口,你也能很快知道compo...
    旱魃一樣閱讀 3,129評論 0 9
  • 先說幾句廢話,調和氣氛凯沪。事情的起由來自客戶需求頻繁變更第焰,偉大的師傅決定橫刀立馬的改革使用新的框架(created ...
    wsdadan閱讀 3,053評論 0 12
  • Laravel框架筆記 一、 composer的安裝: 1.Composer是什么妨马?是 PHP 用來管理依賴(de...
    李景磊閱讀 900評論 0 4
  • 原文地址:http://www.insp.top/learn-laravel-container 本系列文章主要是...
    Bensontung閱讀 1,154評論 0 4
  • 1. 準備 本節(jié)將使用 bugging 程序挺举,首先確認之前有執(zhí)行過以下命令 建立32位可執(zhí)行程序編譯環(huán)境$ sud...
    小蝦米不愛吃蝦閱讀 326評論 0 0