xetaio/xetaravel-mentions
Composer 安装命令:
composer require xetaio/xetaravel-mentions
包简介
A package to parse a @mention from a text and mention the user with a notification.
README 文档
README
Xetaravel Mentions
Unit Tests Coverage Stable Version Downloads Laravel License A package to parse
@mentionsfrom a text and mention the user with a notification.By default this package is configured to parse any text type and it will replace any matched
@mentionwith a markdown link ([@Mention](/users/profile/@Mention)) if the mentionned user exist in the database. It will also send a notification with the LaravelNotifiabletrait to all mentionned users. (Inspired from the laravel-mentions package.)Quick example :
Input text :
Lorem ipsu @admin crepu @Member quis nostrud @UserDoesNotExist ullamcorper fail@mention nostrud @admin.Output text :
Lorem ipsu [@Admin](/users/profile/@Admin) crepu [@Member](/users/profile/@Member) quis nostrud @UserDoesNotExist ullamcorper fail@mention nostrud [@Admin](/users/profile/@Admin).And Both
AdminandMemberusers will be notified. ButAdminwill be notified only one time. (Yes the Parser include an anti-spam rule.)Table of Contents
Requirement
Installation
composer require xetaio/xetaravel-mentionsServiceProviders
Import the
MentionServiceProviderin yourconfig/app.php:'providers' => [ //... Xetaio\Mentions\Providers\MentionServiceProvider::class, //... ]Vendor Publish
Publish the vendor files to your application (included the config file
config/mentions.phpand the migration file) :php artisan vendor:publish --provider="Xetaio\Mentions\Providers\MentionServiceProvider"Then migrate the database :
php artisan migrateConfiguration
<?php return [ 'pools' => [ // Here you configure as many pools as you want. But basically we // notify only the Users. 'users' => [ // Model that will be mentioned. 'model' => App\Models\User::class, // The column that will be used to search the model by the parser. 'column' => 'username', // The route used to generate the user link. 'route' => '/users/profile/@', // Notification class to use when this model is mentioned. 'notification' => App\Notifications\MentionNotification::class, ] ] ];Usage
First, you will need to add the
HasMentionTraitto the mentioner Model :<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Xetaio\Mentions\Models\Traits\HasMentionsTrait; class Comment extends Model { use HasMentionsTrait; }Now, you can start to parse a text in your controller or where you want :
<?php namespace App\Http\Controllers; use Xetaio\Mentions\Parser\MentionParser; class CommentController extends Controller { public function create(Request $request) { // Handle the comment creation however you like $comment = Comment::create($request->all()); // Register a new Parser and parse the content. $parser = new MentionParser($comment); $content = $parser->parse($comment->content); /** * Re-assign the parsed content and save it. * * Note : If you use a custom Parser and you don't modify * the `$content` in your custom Parser, you can ignore that. */ $comment->content = $content; $comment->save(); } }And that's all ! At least with the default configuration. 😝
Parser configuration
The
MentionParsertake a second parameter who is a configuration array, this is the default configuration :<?php [ // The pool used with the parser. 'pool' => 'users', // If `false`, the parser won't mention the user. 'mention' => true, /** * If `false` the parser won't notify the user. * * Note : If the `mention` option is set to `false`, this setting is ignored. */ 'notify' => true, /** * The character that will trigger the mention. * Note : If you modify this setting, you will also need to modify * the `regex_replacement.{character}` option to match this setting. */ 'character' => '@', // The regex used to parse the mentions. 'regex' => '/\s({character}{pattern}{rules})/', /** * The replacement used to replace the regex pattarn. * Can be usefull if you want to allow a special character in the mention like `_` or `-` * or pass dynamic value to the regex. * * Note : The parse use the PHP function `strtr` to replace the pattarn in the regex. */ 'regex_replacement' => [ '{character}' => '@', '{pattern}' => '[A-Za-z0-9]', '{rules}' => '{4,20}' ] ]The configuration is merged with the default configuration, so you can set only the options that you want to modify. Exemple :
<?php $parser = new MentionParser($comment, [ 'pool' => 'members', 'notify' => false ]);You can also set a configuration at the runtime :
<?php $parser = new MentionParser($comment); $parser->setOption('notify', false); $content = $parser->parse($comment->content);Or even get a configuration option value :
<?php $value = $parser->getOption('notify'); // falseParser configuration methods :
The parser use the Xety/Configurator package to manage the configuration. Check this repository to get all the methods and their description.
Function Name Description setConfig(array $config)Sets a configuration array.(Will replace all configuration options be carefull) getConfig()Get all the configuration options. setOption(string $name, $value)Set a value for the given key. getOption(string $name)Get a configuration value. hasOption(string $name)Determines if current instance has the given option. mergeConfig(array $values, bool $invert = false)Merges configuration values with the new ones. If the $invertparam is set totrueit will merge the default configuration into the$values.Custom Parser
If you want more flexibility for the Parser, the best way is to create a new Parser and overwrite the methods that you want to modify. For an example, let's create a new Parser that will return a HTML link instead of a Markdown link :
<?php namespace App\Parser; use Illuminate\Support\Str; use Xetaio\Mentions\Parser\MentionParser; class CustomParser extends MentionParser { protected function replace(array $match): string { $character = $this->getOption('character'); $mention = Str::title(str_replace($character, '', trim($match[0]))); $route = config('mentions.pools.' . $this->getOption('pool') . '.route'); $link = $route . $mention; // Here we return a HTML link instead of the default Markdown. return " <a class=\"link\" href=\"{$link} \">{$character}{$mention}</a>"; } }To use it :
<?php $parser = new \App\Parser\CustomParser($comment); $content = $parser->parse($comment->content);You can of course overwrite all Parser's methods if you need to.
Notification
You will need to write your own Notififation class, but I'm cool with you, you can find an example here using the delivery channel
database:<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; class MentionNotification extends Notification { use Queueable; /** * The Comment instance. * * @var \Illuminate\Database\Eloquent\Model */ public $model; /** * Create a new notification instance. * * @param \Illuminate\Database\Eloquent\Model $model */ public function __construct($model) { $this->model = $model; } /** * Get the notification's delivery channels. * * @param mixed $notifiable * * @return array */ public function via($notifiable): array { return ['database']; } /** * Get the array representation of the notification. * * @param mixed $notifiable * * @return array */ public function toDatabase($notifiable): array { // The instance `$this->model` represent the `Comment` model. $username = $this->model->user->username; $modelId = $this->model->getKey(); $message = "<strong>@{ $username }</strong> has mentionned your name in his comment !"; // You could (and probably should) use a route name here with the function `route()`. $link = "/comment/show/{ $modelId }"; return [ 'message' => $message, 'link' => $link, 'type' => 'mention' ]; } }Contribute
If you want to contribute, please follow this guide.
xetaio/xetaravel-mentions 适用场景与选型建议
xetaio/xetaravel-mentions 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 436.83k 次下载、GitHub Stars 达 58, 最近一次更新时间为 2017 年 05 月 28 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「notifications」 「Users」 「laravel」 「mentions」 「laravel-12-package」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 xetaio/xetaravel-mentions 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 xetaio/xetaravel-mentions 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 xetaio/xetaravel-mentions 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Laravel Nova package that adds a notification feed in your Nova app.
Debugging a problem and need to login as one of your customers? This allows you to authenticate as any of your customers.
A trait for Laravel models which have many users with roles.
The library provides a flexible way to add role-based access control management to CakePHP 3.x
Authorization package for ARCANESOFT/Foundation.
Captures outgoing SMS notifications
统计信息
- 总下载量: 436.83k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 58
- 点击次数: 26
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2017-05-28