Lumen 框架添加组件

最近在搞着一个项目,用的就是Lumen框架,因为刚上手没多久,使用上还有些小问题,最近需要添加一个短信验证码发送的组件,遇到一些问题,几经折腾,现在就来总结一下。

首先在app路径下新建了个文件夹(Utilities)用于放置自己后期需要添加的服务或者组件,目录结构如下

在写好了发送服务的代码之后,发现这个文件在别的文件中引入时会找不到命名空间,查阅资料之后发现需要在composer.json中进行修改,添加自定义的命名空间。

"autoload-dev": {
        "classmap": [
            "tests/",
            "database/",
            "app/Utilities" 
        ]
    },
#在autoload中添加自定的命名空间
#随后要在项目根目录下运行composer dump-autoload即可

在编写完新的组件之后,为了接下来能方便的调用,所以希望能通过Facades对新的组件进行调用,所以需要先将新添加的组件绑定到服务容器中,故添加一个Service Provider进行组件的注册。以下为示例代码:

App/Utilities/SmsSend.php:

<?php
namespace App\Utilities;
 
class SmsSend {
    public function send($phone) {
        ......
    }
}

App/Utilities/SmsSendFacade.php:

<?php
namespace App\Utilities;
 
use Illuminate\Support\Facades\Facade;
 
class SmsSendFacade extends Facade {
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor() {
        return 'sms';
    }
}

App/Provider/SmsSendServiceProvider.php:

<?php
namespace App\Providers;

use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
use App\Utilities\SmsSend;
use App\Utilities\SmsSendFacade;

class SmsSendServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->bind('sms',SmsSend::class);
        class_alias(SmsSendFacade::class, 'sms');
    }
}

这样,在需要调用到该组件的文件中,便可以简单的调用了。

<?php
namespace App\Http\Controllers;
 
use Laravel\Lumen\Routing\Controller as BaseController;
use sms;
 
class ApiController extends BaseController {
    public function test() {
        $phone = '13xxxxxxxxx';
        sms::send($phone);
    }
}

分享: