Laravel 实例教程 —— 如何在Laravel 5.1中进行自定义包开发


1、安装Laravel

已安装Laravel的略过本步骤,未安装的参考Laravel安装文档:Laravel 5.1安装及配置

2、创建目录和服务提供者

在根目录下创建文件夹 packages/jai/contact/src

进入src目录并创建一个服务提供者ContactServiceprovider.php

  1. <?php namespace Jai\Contact;
  2.  
  3. use Illuminate\Support\ServiceProvider;
  4. use Illuminate\Routing\Router;
  5. class ContactServiceprovider extends ServiceProvider
  6. {
  7. /**
  8. * Indicates if loading of the provider is deferred.
  9. *
  10. * @var bool
  11. */
  12. protected $defer = false;
  13. public function boot()
  14. {
  15. $this->loadViewsFrom(realpath(__DIR__.'/../views'), 'contact');
  16. $this->setupRoutes($this->app->router);
  17. // this for conig
  18. $this->publishes([
  19. __DIR__.'/config/contact.php' => config_path('contact.php'),
  20. ]);
  21. }
  22.  
  23. /**
  24. * Define the routes for the application.
  25. *
  26. * @param \Illuminate\Routing\Router $router
  27. * @return void
  28. */
  29. public function setupRoutes(Router $router)
  30. {
  31. $router->group(['namespace' => 'Jai\Contact\Http\Controllers'], function($router)
  32. {
  33. require __DIR__.'/Http/routes.php';
  34. });
  35. }
  36.  
  37. public function register()
  38. {
  39. $this->registerContact();
  40. config([
  41. 'config/contact.php',
  42. ]);
  43. }
  44. private function registerContact()
  45. {
  46. $this->app->bind('contact',function($app){
  47. return new Contact($app);
  48. });
  49. }
  50. }

创建路由

src目录下新建一个Http目录并在其中创建一个routes.php

  1. <?php
  2.  
  3. Route::get('contact', 'ContactController@index');

创建控制器

Http目录下新建Controllers目录并在其中创建控制器ContactController.php

  1. <?php namespace Jai\Contact\Http\Controllers;
  2.  
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Support\Facades\Config;
  5.  
  6. class ContactController extends Controller
  7. {
  8. /**
  9. * Show the application welcome screen to the user.
  10. *
  11. * @return Response
  12. */
  13. public function index()
  14. {
  15. dd(Config::get("contact.message"));
  16. return view('contact::contact');
  17. }
  18. }

创建配置文件

src目录下新建config目录并在其中创建配置文件contact.php

  1. <?php
  2. return [
  3. "message" => "Welcome to your new package"
  4. ];

创建视图文件

packages/jai/contact目录下创建views文件夹,并在其中创建视图文件template.blade.php

  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>title</title>
  5. </head>
  6. <body>
  7. @yield('content')
  8. </body>
  9. </html>

和视图文件contact.blade.php

  1. @extends('contact::template')
  2. @section('content')
  3. Laravel Academy
  4. @stop

最终生成的目录结构如下:

Laravel自定义包目录结构

3、添加包路径到composer.json

在根目录下修改composer.json,将"Jai\\Contact\\": "packages/jai/contact/src/"添加到psr-4

  1. "psr-4": {
  2. "App\\": "app/",
  3. "Jai\\Contact\\": "packages/jai/contact/src/"
  4. }

4、注册服务提供者

在Laravel应用根目录下修改config/app.php,将服务提供者追加到providers数组:

  1. Jai\Contact\ContactServiceProvider::class

5、加载包并发布资源

完成上述操作之后还要在命令行执行两个命令,首先在应用根目录下运行

  1. composer dump-autoload

来更新Composer的autoloader,然后运行

  1. php artisan vendor:publish

将自定义包的配置文件发布到应用根目录的config目录下以便可以访问。

6、在浏览器中测试

完成上述操作后即可在浏览器中访问http://laravel.app:8000/contact,页面输出如下:

  1. "Welcome to your new package"

修改ContactController.php的代码如下:

  1. //dd(Config::get("contact.message"));
  2. return view('contact::contact');

则页面输出为:

  1. Laravel Academy

至此,表明我们的自定义包开发完成并通过测试。

注:本文参考这个github项目https://github.com/jaiwalker/setup-laravel5-package