推薦閱讀
發(fā)布自己的composer包
自動加載機制要使用的
composer
和psr-4
在根目錄下建composer.json
下面的"Laravist\\":"src"
表示src
目錄下的項目式撼,都使用Long\
命名空間第一個\
是反斜杠的意思。這個可以參考laravel
框架的composer
"autoload":{
"psr-4":{
"Long\\":"src/"
}
},
這時我們在根目錄下運行
composer dump-autoload
,會生成vendor
文件敦捧。在我們的類中寫入namespase Laravist\Class
命名空間箕速,
然后在我們需要的項目中直接引入require 'vendor/autoload.php';
即可
打開autoload_psr4.php
文件可以看到返回的數(shù)組是'Long\\' => array($baseDir . '/src'),
- 此時可以在
src
目錄下面建一個類
<?php
namespace Long;
class Long
{
public static function test()
{
return 'class long test function';
}
}
//laravelapi/test.php
<?php
echo \Long\Long::test();
//laravelapi/index.php
<?php
require_once 'vendor/autoload.php';
require_once 'test.php';
如果需要在
src
中再建目錄罪郊,在目錄里建類颖对,命名空間的規(guī)則應該是Long\目錄\類名
比如在src目錄下建了一個test文件薯酝,里面建了一個Test.php類
//src/test/test.php
<?php
namespace Long\test;
class Test
{
public static function longTest(){
return 'long_test';
}
}
- 一般的框架狮杨,比如我們要運行的文件是
test.php
,框架其實是這樣做的
在 index.php 中
require 'vendor/autoload.php';
require 'test.php';
然后我們就可以直接運行 index.php即可母截,而不需要運行 test.php
如果需要加載函數(shù)
我們的應用里經(jīng)常會有一些全局都可能會用的函數(shù), 我們應該怎么放置它會比較好呢?
創(chuàng)建文件 app/helpers.php
<?php
// 示例函數(shù)
function foo() {
return "foo";
}
修改項目 composer.json
在項目 composer.json 中 autoload 部分里的 files 字段加入該文件即可:
{
...
"autoload": {
//在大概二十幾行,在autoload數(shù)組里面直接添加即可
"files": [
"app/helpers.php"
]
}
...
}
運行
composer dump-autoload
OK, 然后你就可以在任何地方用到 app/helpers.php 中的函數(shù)了.
3. 分析從composer
中拉下來的項目
比如我使用了一個查詢快遞的組件
composer require yuxiaoyang/expresscheck
橄教。下載后,我們來查看laravel
的composer.json
在require中會多出一個配置
"require": {
.....
"yuxiaoyang/expresscheck": "^1.0"
},
-
我們來看下項目的結(jié)構(gòu)
個人理解是
laravel
的自動加載將我們帶入了yuxiaoyang/expresscheck
文件的composer.json
,然后根據(jù)這個composer
去加載我們組建的項目喘漏。這里的組建又給我們指明了Yuxiaoyang\ExpressCheck\
的命名空間指向了src/
目錄护蝶。
我們來看ExpressCheck
文件
namespace Yuxiaoyang\ExpressCheck;
class ExpressCheck
此時項目已經(jīng)完全可以走通了
有些項目習慣使用服務提供者注入類,比如這個項目中的ExpressCheckProvider
類翩迈,然后在app.php
中providers
數(shù)組中添加
Yuxiaoyang\ExpressCheck\ExpressCheckProvider::class,
<?php
namespace Yuxiaoyang\ExpressCheck;
use Illuminate\Support\ServiceProvider;
class ExpressCheckProvider extends ServiceProvider
{
public function boot()
{
//
}
public function register()
{
$this->app->singleton('expresscheck',function(){
return new ExpressCheck();
});//app('expresscheck')
}
}
綁定了expresscheck
其實就相當于是new ExpressCheck();
這個類持灰。可以使用app('expresscheck')
直接獲取這個類