资讯专栏INFORMATION COLUMN

Laravel Composer Package 开发实战 toastr-for-laravel5

qpal / 1148人阅读

摘要:一般的包开发过程是这样的,开发好以后打包到,然后在上提交下面我们就来一步一步实现这个过程。在新建的项目中建立如下目录目录和目录同级。我们开发包的代码都放在这个目录中和完全自定义。

本文最早发表于本人博客: Laravel Composer Package 开发实战 toastr-for-laravel5

在Laravel的文档中有Package Development,对于入门开发人员来说还是比较抽象,因为开发一个包需要了解 Service Providers,Service ProvidersFacade 已经够抽象的了对刚接触Laravel的开发人员来说,所以我来写一个简单的Laravel 包开发的实例教程吧。

toastr.js是一个很方便的通知效果,最近刚发布了laravel 5.2,所以就来开发一个toastr for laravel 5的包吧,主要用toastr结合laravel的flash session来实现页面的一次性消息提醒,其实这个在我们日常开发中页面操作提醒还是很常用到的业务。

一般的laravel 包开发过程是这样的,开发好以后打包push到gitlab,然后在packagist上提交,下面我们就来一步一步实现这个过程。

1.在新建的laravel项目中建立如下目录 packages/yuansir/toastr/src ,packages 目录和 app 目录同级。我们开发包的代码都放在这个src目录中,yuansir和toastr完全自定义。

2.修改项目的composer.json,设定PSR-4命名空间:

"autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App": "app/",
            "YuansirToastr": "packages/yuansir/toastr/src/"
        }
    },

别忘了执行autoload

$ composer dump-autoload

3.为我们的包初始化一个composer.json文件,熟悉composer的应该都知道这玩意是干嘛的了

$ cd pacages/yuansir/toastr/src
$ composer init

按照提示填写相关信息,有些信息可以不用填写,后面自己在composer.json中添加就可以了,生成的示例如下:

{
    "name": "ryan/toastr-for-laravel",
    "description": "toastr.js for laravel5",
    "authors": [
        {
            "name": "Ryan",
            "email": "yuansir@live.cn"
        }
    ],
    "require": {}
}

4.开始开发,新建Service Provider

$ php artisan make:provider ToastrServiceProvider

将生成的app/Providers/ToastrServiceProvider.php文件移动到我们的packages/yuansir/toastr/src目录下面,并注册ToastrServiceProviderconfig/app.phpproviders 中。

 "providers" => [

        /*
         * Laravel Framework Service Providers...
         */
         ......

        /*
         * Application Service Providers...
         */
         ......
        YuansirToastrToastrServiceProvider::class,
    ],

5.新建packages/yuansir/toastr/src/config/toastr.php 来保存toastr.js的options,options配置还蛮多的,具体可以看它的demo。

 []
];

关于这个配置在我们包中如何调用的,我们过会来说.

6.新建Toastr类,来实现toastr 的info,success,error,warning的相关实现,代码还是很简单的,packages/yuansir/toastr/src/Toastr.php:

session = $session;
        $this->config = $config;
    }

    public function render()
    {
        $notifications = $this->session->get("toastr:notifications");

        if(!$notifications) {
            return "";
        }

        foreach ($notifications as $notification) {
            $config = $this->config->get("toastr.options");
            $javascript = "";
            $options = [];
            if($config) {
                $options = array_merge($config, $notification["options"]);
            }

            if($options) {
                $javascript = "toastr.options = " . json_encode($options) . ";";
            }

            $message = str_replace(""", """, $notification["message"]);
            $title = $notification["title"] ? str_replace(""", """, $notification["title"]) : null;
            $javascript .= " toastr.{$notification["type"]}("$message","$title");";
        }

        return view("Toastr::toastr", compact("javascript"));
    }

    /**
     * Add notification
     * @param $type
     * @param $message
     * @param null $title
     * @param array $options
     * @return bool
     */
    public function add($type, $message, $title = null, $options = [])
    {
        $types = ["info", "warning", "success", "error"];
        if(!in_array($type, $types)) {
            return false;
        }

        $this->notifications[] = [
            "type" => $type,
            "title" => $title,
            "message" => $message,
            "options" => $options
        ];
        $this->session->flash("toastr:notifications", $this->notifications);
    }

    /**
     * Add info notification
     * @param $message
     * @param null $title
     * @param array $options
     */
    public function info($message, $title = null, $options = [])
    {
        $this->add("info", $message, $title, $options);
    }

    /**
     * Add warning notification
     * @param $message
     * @param null $title
     * @param array $options
     */
    public function warning($message, $title = null, $options = [])
    {
        $this->add("warning", $message, $title, $options);
    }

    /**
     * Add success notification
     * @param $message
     * @param null $title
     * @param array $options
     */
    public function success($message, $title = null, $options = [])
    {
        $this->add("success", $message, $title, $options);
    }

    /**
     * Add error notification
     * @param $message
     * @param null $title
     * @param array $options
     */
    public function error($message, $title = null, $options = [])
    {
        $this->add("error", $message, $title, $options);
    }

    /**
     * Clear notifications
     */
    public function clear()
    {
        $this->notifications = [];
    }
}

7.我们看到view(‘Toastr::toastr’, compact(‘javascript’));,那么就是需要一个视图文件了,关于Toastr::toastr是什么鬼我们过会来说,新建 packages/yuansir/toastr/src/views/toastr.blade.php 视图文件:



就是引入了tastr插件,输出我们render方法中的$javascript

8.建立Facade,新建packages/yuansir/toastr/src/Facades/Toastr.php


9.修改ToastrServiceProvider:

loadViewsFrom(__DIR__ . "/views", "Toastr");

        $this->publishes([
            __DIR__."/views" => base_path("resources/views/vendor/toastr"),
            __DIR__."/config/toastr.php" => config_path("toastr.php"),
        ]);
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app["toastr"] = $this->app->share(function ($app) {
            return new Toastr($app["session"], $app["config"]);
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ["toastr"];
    }
}

$this->loadViewsFrom(__DIR__ . ‘/views’, ‘Toastr’); 就是表示Toastr命名空间的视图文件冲当前目录的views目录中渲染,所以我们上面用 return view(‘Toastr::toastr’, compact(‘javascript’));

$this->publishes 在执行php artisan vendor:publish 时会将对应的目录和文件复制到对应的位置

10.测试下是否可行,修改 config/app.php 添加如下:

/*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don"t hinder performance.
    |
    */

    "aliases" => [
        ......

        "Toastr" => YuansirToastrFacadesToastr::class,

    ],

写个控制器放进去试试:


反正我测试是OK了,就不截图了!!

11.修改命名空间到包的composer.json,因为别人安装这个包的时候不可能也去改项目composer.json的PSR-4的autoload,所以我们把PSR-4的命名空间加到这个包的composer.json中去,修改packages/yuansir/toastr/src/composer.json 如下:

{
    "name": "ryan/toastr-for-laravel",
    "description": "toastr.js for laravel5",
    "authors": [
        {
            "name": "Ryan",
            "email": "yuansir@live.cn"
        }
    ],
    "require": {},
    "autoload": {
        "psr-4": {
            "YuansirToastr": "src/"
        }
    }
}

12.建立Github项目

将代码push到项目中去:

$ cd packages/yuansir/toastr/
$ git init
$ git add .
$ git commit -m "add package source files."
$ git remote add origin git@github.com:yuansir/toastr-for-laravel5.git
$ git push -u origin master
$ git tag -a 1.0.0 -m "version 1.0.0"
$ git push --tags

13.提交到Packagist,打开到packagist.org,登陆后点击右边上角的 submit,并填入git的项目地址git@github.com:yuansir/toastr-for-laravel5.git 点击check 就OK了

到此结束,大功告成,这样一个Laravel 的 composer 包就开发完成了。
这个教程的源码和这个包的安装使用方法详见github https://github.com/yuansir/toastr-for-laravel5
如有问题欢迎指正!

转载请注明: 转载自Ryan是菜鸟 | LNMP技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30324.html

相关文章

  • 基于ComposerLaravel扩展包开发工作流

    使用场景 在引用第三方包的时候,对第三方包有改动需求,需要将代码放在自己的仓库;并且自己的其他项目也有需求引用自定义的第三方包;甚至自己会发布修改后的第三方包; 读完本文你讲获得: Git Submodule的基本使用 从本地加载第三方包 从自定义仓库地址获取扩展包 快速创建第三方包 本文是在我自己想要创建一个基础第三方包的时候记录下的操作步骤 1、利用git submoudle在已有项目中使...

    Faremax 评论0 收藏0
  • 如何正确使用 Composer 安装 Laravel 扩展包

    摘要:流程一新项目流程创建,并添加依赖到的扩展包运行,安装扩展包并生成提交到代码版本控制器中,如流程二项目协作者安装现有项目克隆项目后,根目录下直接运行从中安装指定版本的扩展包以及其依赖此流程适用于生产环境代码的部署。 本文经授权转自 PHPHub 社区 问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: showImg(https://dn-...

    BlackMass 评论0 收藏0
  • Composer & Laravel 包本地开发

    摘要:本文参考超哥写的基于的模块化开发的详细实践版。包本地开发本地开发一个包做法基本与包开发一样,简单过一下吧。首先创建一个新的项目在项目中创建如下目录为我们要发布的包,对应为,对应为项目名。 showImg(https://segmentfault.com/img/remote/1460000010891977); 本文参考超哥写的 基于 Composer 的 PHP 模块化开发 的详细实...

    levius 评论0 收藏0
  • 使用 Laravel 框架开发是什么样的体验

    摘要:但也因为应有尽有使得框架的性能比其他高性能框架低了些,为此给了几个解决方案路由缓存经有关部门研究,路由缓存可有效加快访问速度以上。有朋友说框架最重要的东西是路由,我倒认为最重要的是框架中异于其他框架且能解决痛点的东西,如的。 showImg(https://segmentfault.com/img/remote/1460000006767764); 在程序界的远古时期,大神们手持键盘敲...

    Miracle_lihb 评论0 收藏0
  • 开发错误集锦

    摘要:加了代理,而对这个配置默认执行操作,导致了连接错误。失败的执行时候会报错这是因为通过调用自身的方法,使用根据主键去重复的逻辑覆盖了的逻辑。 emoji utf8 编码问题 https://laravel-china.org/top... function nickname_encode($s){ $chars = preg_split(//u, $s, null, ...

    awesome23 评论0 收藏0

发表评论

0条评论

qpal

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<