fayne / laravel-filament-store-locator
Store locator for Laravel and Filament.
Package info
github.com/Fayne/laravel-filament-store-locator
pkg:composer/fayne/laravel-filament-store-locator
Requires
- php: ^8.4
- fayne/laravel-filament-cms-core: ^1.0
- fayne/laravel-filament-qrcode: ^1.0
- filament/filament: ^5.0
- illuminate/support: ^13.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- larastan/larastan: ^3.0
- laravel/pint: ^1.27
- orchestra/testbench: ^11.0
- pestphp/pest: ^4.0
- pestphp/pest-plugin-arch: ^4.0
- pestphp/pest-plugin-laravel: ^4.1
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^2.1
- phpstan/phpstan-deprecation-rules: ^2.0
- phpstan/phpstan-phpunit: ^2.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-05 09:11:29 UTC
README
Laravel Filament Store Locator
简体中文 | English
适用于 PHP 8.4+、Laravel 13、Filament 5 的门店管理与公开查询包,依赖 CMS Core 和 Qrcode。
功能与边界
| 能力 | 说明 |
|---|---|
| 门店管理 | 新增、编辑、删除、发布状态、权重排序 |
| 地理信息 | 国家、省市、地址、经纬度、邮编、地铁线路 |
| 联系方式与营业时间 | 网站、电话、邮箱、每周时间、例外日期及说明 |
| 门店媒体 | Logo 和多张 Banner,使用 Filament 原生 FileUpload |
| 公开 API | 已发布门店列表和详情、分页、距离排序 |
| CMS 集成 | 模块自登记、权限目录、中英文资源及租户数据范围 |
本包不提供地图服务、地址地理编码或“当前是否营业”的自动判断,也不包含旧 Nova 的自定义字段管理界面。后台部分表单标题仍使用英文,不代表界面已经完整本地化。
1. 安装
先在宿主 Composer 配置本私有包及所需 fayne/* 依赖的软件源:
composer require fayne/laravel-filament-store-locator php artisan vendor:publish --tag=store-locator-config php artisan cms:install
Laravel 自动发现服务提供者并加载迁移。cms:install 运行已注册迁移、初始化权限目录并发布 Filament 静态资源;生产自动部署使用 --force --no-interaction。已有 Core 项目也可运行 php artisan migrate 加载本包迁移,再重跑 Core 安装补齐权限。不要在已有业务数据的数据库上执行 migrate:fresh。
媒体磁盘默认使用 public,须确保其 URL 可访问,并按宿主配置创建存储链接。无需为了本包的上传控件额外安装文件选择器。
2. 接入后台与权限
本包通过自身 ServiceProvider 向 Core 的 ModuleRegistry 登记 store-locator。继承 Core AdminPanelProvider / TenantPanelProvider 的项目自动接入:单租户在普通后台管理,多租户在 workspace 管理。
完全自定义的 PanelProvider 在配置 CMS、middleware、guard、租户及显式插件后调用:
return app(\Fayne\CMS\Support\Modules\ModuleRegistry::class)->applyTo($panel);
如需手动接入,可配置 Fayne\StoreLocator\Filament\StoreLocatorPlugin::make();同 ID 的显式插件会被保留,不要在自动接入之后重复注册。
权限定义在 resources/permissions.php,名称和分组翻译位于 resources/lang/{zh_CN,en}。安装不自动给已有角色增加授权;必须在对应范围分配门店权限。多租户账号还须具备有效成员资格,平台超级管理员不自动绕过租户归属。
3. 配置
发布后的文件是 config/store-locator.php:
return [ 'disk' => env('STORE_LOCATOR_DISK', 'public'), 'routes' => [ 'enabled' => env('STORE_LOCATOR_ROUTE_ENABLED', true), 'cached' => env('STORE_LOCATOR_ROUTE_CACHED', true), 'max_age' => (int) env('STORE_LOCATOR_ROUTE_MAX_AGE', 3600), ], ];
enabled 控制公开路由,cached 控制列表服务端缓存,max_age 控制 HTTP Cache-Control。列表缓存使用 cache tags,启用时必须选择支持标签的缓存驱动;不支持时设 STORE_LOCATOR_ROUTE_CACHED=false。列表服务端缓存使用 rememberForever,不会按 max_age 自动到期;模型新增、更新、删除及后台排序会触发缓存失效。公开响应具有缓存头,多租户部署的代理/CDN 必须正确区分主机与请求 URL。
配置变更后按部署流程刷新配置/路由缓存,并重新加载长驻进程。
4. 公开 API
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /modules/store-locator/stores |
已发布门店分页列表 |
| GET | /modules/store-locator/stores/{store} |
已发布门店详情;未发布返回 404 |
列表默认每页 15 条,page_size 支持 1–100。距离排序示例:
GET /modules/store-locator/stores?order_by=distance&latitude=31.23&longitude=121.47&page_size=20
距离排序必须同时提交合法经纬度;纬度范围 -90–90,经度范围 -180–180。该查询依赖数据库三角函数,需在目标数据库验收。API 使用 Laravel Resource 输出,媒体由磁盘/路径转换,不能将上传的内部数据结构直接当作公开 URL。
单租户使用本站范围 0;多租户由 ResolvePublicTenant 根据请求主机解析租户,需要配置有效租户域名。后台语言与门店数据不是同一个概念,本包不提供门店内容翻译版本管理。
5. 程序使用
use Fayne\StoreLocator\Models\Store; $stores = Store::query()->published()->orderBy('weight')->get();
模型自动限定当前站点/租户。多租户命令和队列中须显式设置 Core TenantContext;不能通过脱离上下文的查询跨租户读取。Logo 和 Banner 使用包内媒体 casts,营业时间、品牌等使用结构化属性;自定义写入入口仍须负责业务校验与授权。
6. 测试与上线
在本包目录执行:
composer install
composer test
composer format
composer analyse
上线至少验证:安装迁移、角色授权、CRUD 与排序、媒体上传和公开 URL、发布状态过滤、缓存失效、目标数据库距离排序;多租户另验域名解析及跨租户隔离。自动化测试不能代替真实文件存储、CDN 和浏览器验收。
合作与贡献
通过 Issue 描述需求或缺陷,附版本、复现步骤及预期行为。合并请求须包含相关测试和中英文文档更新,并说明未验证的环境;不要提交凭据、业务数据或 composer.lock。商业合作及授权请联系 Fayne Guo。
许可证
采用专有许可证,使用和分发须遵守授权限制;第三方依赖遵循各自许可证。