在项目的更目录中创建的 packages 文件夹,与 app 目录同级。
|-app |-packages |--- xingfupeng |----- my-first-laravel-package |------- src ...
如图:
创建目录很简单,接下来我们初始化 package 包。
composer init
composer.json 文件创建如下:
# packages/xingfupeng/my-first-laravel-package/composer.json { "name": "xingfupeng/my-first-laravel-package", "description": "xingfupeng's first laravel package", "authors": [ { "name": "xingfupeng", "email": "[email protected]" } ], "require": {} }
注意: composer.json 文件中的 name 和 authors 等信息要根据自己的内容填写。
如果不想走 composer init 也可以直接复制到 packages/xingfupeng/my-first-laravel-package 目录下。到这里初始化 package 包完成。下一步我们要让 laravel 根目录中的composer.json 自动加载 xingfupeng/my-first-laravel-package
在 laravel 根目录的 composer.json 文件中配置如下:按照 psr-4 的规范自动加载。
# / 项目跟目录 "autoload": { "psr-4": { "App\\": "app/", "XingFuPeng\\FirstLaravelPackage\\": "packages/xingfupeng/my-first-laravel-package/src" } },
配置好之后,我们需要在 laravel 的根目录下的 composer.json 同目录执行 composer dump-autoload
服务容器是主要的入口,我们用 artisan 创建一个服务容器。
php artisan make:provider XingFuPengLaravelPackageServiceProvider
命令执行完后,会在 app/Providers
目录下创建该文件,然后我们将这个容器文件移动到 packages/xingfupeng/my-first-laravel-package/src
目录下。
此时的容器命名空间还是 namespace App\Providers;
将其改为 namespace XingFuPeng\FirstLaravelPackage;
, 这个命名空间是 vendor/package_name 的形式,
也就是 composer 自动加载的命名空间。其他都不用动。
创建完成服务容器后要注册的 config/app.php 配置中的 providers[] 数组中:
# app/config/app.php 'providers' => [ App\Providers\RouteServiceProvider::class, // XingFuPeng Laravel Package Service Provider XingFuPeng\FirstLaravelPackage\XingFuPengLaravelPackageServiceProvider::class ],
好了,此时我们已经创建好服务并注册到 app 中了,接下来我们写一些简单的路由来访问以下容器的内容。
在 packages/xingfupeng/my-first-laravel-package/src
目录下创建 routes.php
# packages/xingfupeng/my-first-laravel-package/src/routes.php Route::get('hello', function(){ echo 'Hello from the my-first-laravel-package package!'; });
创建完路由后,需要在服务的 boot()
方法中包含进去。
# packages/xingfupeng/my-first-laravel-package/src/XingFuPengLaravelPackageServiceProvider.php public function boot() { include __DIR__.'/routes.php'; }
让后我们在浏览器中访问以下:
浏览器访问成功了!!!
小开心一下,接下来我们创建控制器。
还是用 artisan 命令创建控制器:
php artisan make:controller HelloWorldController
跟服务文件创建一样,把创建的 HelloWorldController 移动到 packages/xingfupeng/my-first-laravel-package/src/controllers
下,为了控制器以后都可以放在一起,我建了一个controllers目录,更改了控制器的命名空间同时添加了两个方法。这里要注意的是 Controller 一定要再use 一下 use App\Http\Controllers\Controller;
继承 app 的父级控制器。
# packages/xingfupeng/my-first-laravel-package/src/controllers/HelloWorldController.php <?php // namespace App\Http\Controllers; namespace XingFuPeng\FirstLaravelPackage\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class HelloWorldController extends Controller { public function hello($name) { echo 'HelloWorldController hello ' . $name; } public function world($name) { echo 'HelloWorldController world ' . $name; } }
控制器创建好之后,我们需要注册到服务器中:
# packages/xingfupeng/my-first-laravel-package/src/XingFuPengLaravelPackageServiceProvider.php public function register() { // register our controller $this->app->make('XingFuPeng\FirstLaravelPackage\Controllers\HelloWorldController'); }
最后呢我们在路由文件中添加两个路由:
# packages/xingfupeng/my-first-laravel-package/src/routes.php Route::get('hello-world/hello/{name}', 'XingFuPeng\FirstLaravelPackage\Controllers\[email protected]'); Route::get('hello-world/world/{name}', 'XingFuPeng\FirstLaravelPackage\Controllers\[email protected]');
分别访问一下:
然后我们想加载模板文件怎么操作呢,我们一起操作一下。
我们创建模板文件:
# view/hello.blade.php <!DOCTYPE html> <html> <head> <title>HelloController hello.blade.php</title> </head> <body> <h1> Your Input : {{ $name }} </h1> </body> </html>
注册模板:
# packages/xingfupeng/my-first-laravel-package/src/XingFuPengLaravelPackageServiceProvider.php public function register() { // // register our controller $this->app->make('XingFuPeng\FirstLaravelPackage\Controllers\HelloWorldController'); $this->loadViewsFrom(__DIR__.'/views', 'xingfupeng'); }
在控制器中调用模板:
# packages/xingfupeng/my-first-laravel-package/src/controllers/HelloWorldController.php public function hello($name) { //echo 'HelloWorldController hello ' . $name; return view('xingfupeng::hello', compact('name')); } public function world($name) { // echo 'HelloWorldController world ' . $name; return view('xingfupeng::hello', compact('name')); }
再次访问如下:
至此,我们已经弄好自己的 laravel package 了。
恭喜你掌握了。