Laravel Composer Package 开发实战 toastr-for-laravel5
本文原链接来自我的博客,地址: Laravel Composer Package 开发实战 toastr-for-laravel5
在Laravel的文档中有Package Development,对于入门开发人员来说还是比较抽象,因为开发一个包需要了解 Service Providers,Service Providers 和 Facade 已经够抽象的了对刚接触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
{ "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 目录下面,并注册ToastrServiceProvider到config/app.php 的providers 中。
'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>
<?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, ],
写个控制器放进去试试:
<?phpnamespace 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
到此结束,大功告成,这样一个Laravel 的 composer 包就开发完成了。
这个教程的源码和这个包的安装使用方法详见github https://github.com/yuansir/toastr-for-laravel5
如有问题欢迎指正!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











종종 키워드와 추적 매개 변수로 혼란스러워하는 긴 URL은 방문자를 방해 할 수 있습니다. URL 단축 스크립트는 솔루션을 제공하여 소셜 미디어 및 기타 플랫폼에 이상적인 간결한 링크를 만듭니다. 이 스크립트는 개별 웹 사이트 a에 유용합니다

Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

이것은 Laravel 백엔드가있는 React Application을 구축하는 데있어 시리즈의 두 번째이자 마지막 부분입니다. 이 시리즈의 첫 번째 부분에서는 기본 제품 목록 응용 프로그램을 위해 Laravel을 사용하여 편안한 API를 만들었습니다. 이 튜토리얼에서는 Dev가 될 것입니다

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> 'Hello World', 'github.com'=> [ 'foo'=> 'bar'], 'forge.laravel.com'=>

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

2025 PHP Landscape Survey는 현재 PHP 개발 동향을 조사합니다. 개발자와 비즈니스에 대한 통찰력을 제공하는 프레임 워크 사용, 배포 방법 및 과제를 탐색합니다. 이 조사는 현대 PHP Versio의 성장을 예상합니다

이 기사에서는 Laravel 웹 프레임 워크에서 알림 시스템을 탐색 할 것입니다. Laravel의 알림 시스템을 사용하면 다른 채널을 통해 사용자에게 알림을 보낼 수 있습니다. 오늘은 알림을 보낼 수있는 방법에 대해 논의합니다
