Packages是向Laravel中添加功能最重要的途径。composer.json中require的都是包。关于包的详细说明请查看 API . 下面一起创建一个简单的Package :
1. 环境配置
我们以Artisan的workbench
命令来创建一个Package ,首先要配置 app/confg/workbench.php
1 <?php 2 3 return array( 4 5 'name' => 'brudeke', 6 7 'email' => 'xxxxxxxx@163.com', 8 9 );
2. 创建Package
其中vendor是厂商名称,用于区别相同名称的包;package是要创建的包名;
1 php artisan workbench vendor/package --resources
执行以上命令后会在根目录出现workbench目录,其中workbench/vendor/package/src/Vendor/Package目录下会自动生成PackageServiceProvider.php(以下称此文件为引导类),该文件相当于包的引导类。
3. 在包中添加功能类
在这里我们在包中添加一个工具类,在“引导类”的同级创建Utils/Turbo.php
1 <?php 2 3 namespace VendorPackageUtils; 4 5 use IlluminateHttpRedirectResponse; 6 7 class Turbo { 8 9 public function __construct() {} 10 11 public function setUp(){ 12 echo "this is a tool"; 13 } 14 }
4. 创建Facades
Facades的功能就是美化类,可以使成员函数以静态成员的方式调用,在引导类同级创建Facades/Turbo.php
1 <?php 2 namespace VendorPackageFacades; 3 4 use IlluminateSupportFacadesFacade; 5 6 class Turbo extends Facade { 7 8 protected static function getFacadeAccessor() { 9 return 'turbo'; 10 } 11 }
5. 绑定功能类到Ioc容器
修改引导类如下,其中$defer是表示延迟加载服务提供器。
1 <?php 2 namespace VendorPackage; 3 4 use IlluminateSupportServiceProvider; 5 6 class PackageServiceProvider extends ServiceProvider { 7 8 /** 9 * Indicates if loading of the provider is deferred. 10 * 11 * @var bool 12 */ 13 protected $defer = true; 14 15 /** 16 * Bootstrap the application events. 17 * 18 * @return void 19 */ 20 public function boot(){ 21 $this->package('vendor/package'); 22 } 23 24 /** 25 * Register the service provider. 26 * 27 * @return void 28 */ 29 public function register(){ 30 $this->app->bindShared('turbo', function(){ 31 return new VendorPackageUtilsTurbo; 32 }); 33 } 34 35 /** 36 * Get the services provided by the provider. 37 * 38 * @return array 39 */ 40 public function provides() 41 { 42 return array('turbo'); 43 } 44 45 }
6.修改配置app/config/app.php
在providers数组中添加以下代码:
1 "providers" => array( 2 'VendorPackagePackageServiceProvider', 3 ),
在aliases数组中添加别名Turbo:
1 'aliases' => array( 2 'Turbo' => 'VendorPackageFacadesTurbo', 3 ),
接下来就可以在项目任何地方以Turbo::setUp()的形式运用包了。