文档章节

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

Yuansir
 Yuansir
发布于 2016/01/22 14:13
字数 1656
阅读 279
收藏 4

本文原链接来自我的博客,地址: 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/",
            "Yuansir\\Toastr\\": "packages/yuansir/toastr/src/"
        }
    },

别忘了执行autoload

$ cd pacages/yuansir/toastr/src

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

$ cd pacages/yuansir/toastr/src
按照提示填写相关信息,有些信息可以不用填写,后面自己在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...
         */
         ......
        Yuansir\Toastr\ToastrServiceProvider::class,
    ],

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

<?php
 return [
     'options' => []
];

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

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

<?php namespace Yuansir\Toastr;

use Illuminate\Session\SessionManager;
use Illuminate\Config\Repository;

class Toastr
{
    /**
     * @var SessionManager
     */
    protected $session;

    /**
     * @var Repository
     */
    protected $config;

    /**
     * @var array
     */
    protected $notifications = [];

    /**
     * Toastr constructor.
     * @param SessionManager $session
     * @param Repository $config
     */
    public function __construct(SessionManager $session, Repository $config)
    {
        $this->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 视图文件:

<link href="http://cdn.bootcss.com/toastr.js/latest/css/toastr.min.css" rel="stylesheet">
<script src="http://cdn.bootcss.com/toastr.js/latest/js/toastr.min.js"></script>
<script type="text/javascript">{!! $javascript !!}</script>
8.建立Facade,新建packages/yuansir/toastr/src/Facades/Toastr.php 就是引入了tastr插件,输出我们render方法中的$javascript
<?php namespace Yuansir\Toastr\Facades;

use Illuminate\Support\Facades\Facade;

class Toastr extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'toastr';
    }
}

9.修改ToastrServiceProvider:

<?php namespace Yuansir\Toastr;

use Illuminate\Support\ServiceProvider;

class ToastrServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->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' => Yuansir\Toastr\Facades\Toastr::class,

    ],

写个控制器放进去试试:

<?php

namespace App\Http\Controllers;

use App\Http\Requests;
use Illuminate\Http\Request;
use Toastr;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //略
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        Toastr::error('你好啊','标题');
        return view('home');
    }
}




到此结束,大功告成,这样一个Laravel 的 composer 包就开发完成了。 反正我测试是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": {
            "Yuansir\\Toastr\\": "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

如有问题欢迎指正!

© 著作权归作者所有

Yuansir

Yuansir

粉丝 2
博文 5
码字总数 6606
作品 0
闵行
程序员
私信 提问
《PHP框架Laravel学习》系列分享专栏

《PHP框架Laravel学习》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201735.html 文章 Laravel教程:laravel 4安装及入门 Laravel4中文手册下载 Laravel配置教...

开元中国2015
2018/11/06
164
0
ci3.0和laravel5.0该如何选择?

这两个框架都支持redis pdo吧,我现在想做一个问答网站,请问用这两个框架那个性能好啊,效率高.laravel5的中文文档不是太多,另外国内composer老不可用,要下载一个离线laravel包含了composer的完...

jack984
2015/04/10
229
1
MAC下安装laravel时遇到的坑💩

php版本:php7.0 服务器:nginx OS:OS X EI Capitan 首先安装composer 通过composer 来安装laravel 1,首先切换到你的根目录 运行以下代码 composer create-project laravel/laravel laravel5...

eatnothing
2015/12/09
146
0
laravel的那些坑

服务器是Nginx的 照着文档通过composer安装了一个非最新版本 (5.0)那版。 开始是看中文文档,死活安装不上,后来看了英文文档发现这个版本的安装说明是不同的 按照这个命令 才能正确地安装 ...

lilugirl
2015/09/13
1K
0
Laravel5学生成绩管理系统-01-安装-建表-填充数据

注:以下笔记都是按照此博文进行开发学习,开发环境为Mac 。 一、从github上克隆项目到本地 二、切换到本地项目目录下,安装composer // 可以将上边的命令放入到 bin目录下,方便后边不用每次...

Corwien
2016/04/21
335
0

没有更多内容

加载失败,请刷新页面

加载更多

Java Web 中对 ServletRequest 的一些非常规操作解决方案

1. 前言 ServletRequest 是我们搞 Java Web 经常接触的 Servlet Api 。有些时候我们要经常对其进行一些操作。这里列举一些经常的难点操作。 2. 提取 body 中的数据 前后端交互我们会在 body...

码农小胖哥
24分钟前
2
0
《Dual Encoding U-Net for Retinal Vessel Segmentation》阅读笔记-MICCAI2019

作者:Bo Wang1,2, Shuang Qiu2, and Huiguang He1,2,3 目的:Retinal Vessel Segmentation is an essential step for the early diagnosis of eye-related diseases, such as diabetes and ......

JungleKing
26分钟前
2
0
一次看懂 Https 证书认证

TLS > 传输层安全性协定 TLS(Transport Layer Security),及其前身安全套接层 SSL(Secure Sockets Layer)是一种安全协议,目的是为网际网路通信,提供安全及数据完整性保障。 如图,TLS...

极客收藏夹
40分钟前
4
0
https证书买哪家好?有哪些供应商

在选购https证书前除了要了解类型外,还需要了解https证书供应商,毕竟不同的供应商,提供的产品质量与服务也是有差异的。今天小编就为大家讲讲https证书供应商方面的内容,希望各位会喜欢。...

安信证书
42分钟前
5
0
Zuul 配置

概述:zuul底层是基于servlet,是由一系列的filter链构成。 1、路由配置 a、单例serverId映射 zuul: routes: client-a: path: /client/** serviceId: client-a 意思是...

java框架开发者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部