Laravel 创建自己的扩展包 package


安装laravel之后,我们会根据自己的需要创建自己的扩展包,本文将带你创建属于自己的laravel package 。

1. 创建我们自己的文件包目录

在项目的更目录中创建的 packages 文件夹,与 app 目录同级。

|-app
|-packages
|--- xingfupeng
|----- my-first-laravel-package
|------- src
...

如图:
在这里插入图片描述
创建目录很简单,接下来我们初始化 package 包。

2. composer 初始化 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

3. 配置composer dump-autoload

在 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

4. 添加服务容器

服务容器是主要的入口,我们用 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 中了,接下来我们写一些简单的路由来访问以下容器的内容。

5. 创建路由文件

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';
}

让后我们在浏览器中访问以下:
在这里插入图片描述

浏览器访问成功了!!!

小开心一下,接下来我们创建控制器。

6. 创建控制器

还是用 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]');

分别访问一下:
在这里插入图片描述

在这里插入图片描述

然后我们想加载模板文件怎么操作呢,我们一起操作一下。

7. 添加模板

我们创建模板文件:

在这里插入图片描述

# 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 了。

恭喜你掌握了。