Laravel项目如何分离前后端并构建共享业务逻辑模块?
如何在两个Laravel应用间共享模型与业务逻辑?
嘿,作为Laravel开发者,这种前台+后台分离但共享核心逻辑的场景我太熟悉了!毕竟既要保持前台精简,又要让后台能复用核心代码,确实得找个优雅的方案。下面给你分享几个我实际项目里用过的靠谱方法:
方案一:创建本地Composer包(最推荐)
Laravel本身基于Composer,用本地包来共享代码是最规范的方式,不管是开发还是生产环境都能完美适配。
步骤如下:
- 创建共享包目录:在你的两个Laravel项目外面,新建一个文件夹,比如
laravel-shared-core。 - 初始化Composer配置:进入这个目录,执行
composer init,按照提示填写信息,重点是设置命名空间(比如Shared\Core),这样后续才能正确引用类。 - 组织共享代码结构:在包里创建
src目录,然后把你的模型、共享业务逻辑(比如Services、Traits、Helpers)放进去,比如:
记得给每个类设置正确的命名空间,比如laravel-shared-core/ ├── src/ │ ├── Models/ │ │ └── Post.php │ ├── Services/ │ │ └── PostService.php │ └── composer.json └── composer.jsonPost.php里写:namespace Shared\Core\Models; use Illuminate\Database\Eloquent\Model; class Post extends Model { // 模型逻辑... } - 在两个Laravel应用中引入本地包:打开前台和后台项目的
composer.json,添加一个repositories字段指向你的共享包:
然后执行"repositories": [ { "type": "path", "url": "../laravel-shared-core" } ]composer require shared/core(这里的shared/core是你在共享包composer.json里设置的name字段)。 - 开始使用共享代码:现在在两个应用里就能直接引用共享类了,比如:
use Shared\Core\Models\Post; // 前台拉取数据 $posts = Post::latest()->get(); // 后台修改数据 Post::find(1)->update(['title' => '新标题']);
方案二:Laravel官方Package开发模式(适合未来开源)
如果你以后打算把这个共享模块发布到Packagist,或者需要更完善的包结构(比如包含迁移、配置文件),可以用Laravel官方的Package开发工具:
- 直接创建标准包项目:执行
laravel new shared/core --package,这个命令会帮你生成包含配置、迁移、测试目录的Laravel包结构。 - 把共享的模型、业务逻辑放入生成的
src目录,确保命名空间正确。 - 同样在两个应用的
composer.json里添加本地仓库引用,执行composer require shared/core后即可使用,用法和方案一一致。
方案三:符号链接(仅开发阶段临时用)
如果只是快速原型开发,不想折腾Composer,可以用符号链接把共享目录链接到两个应用里,但生产环境绝对不要用这个方法,因为部署会很麻烦,而且Composer自动加载可能出问题。
比如在前台项目的app/目录下执行:
ln -s ../../laravel-shared-core/src/Models app/SharedModels
然后在composer.json的autoload字段里添加这个目录:
"autoload": { "psr-4": { "App\\": "app/", "Shared\\Models\\": "app/SharedModels/" } }
执行composer dump-autoload后就能引用共享类了,但这个方法局限性很大,只适合临时测试。
额外注意事项
- 数据库迁移:最好把共享模型的迁移文件放在共享包里,然后在包的服务提供者中注册迁移,这样两个应用执行
php artisan migrate时会自动运行这些迁移。 - 权限控制:后台的RBAC可以单独在后台应用里实现,共享模型里可以添加通用的权限判断方法,比如:
后台应用调用这个方法即可,前台不需要关心权限逻辑,完美符合你“前台精简”的需求。// 共享Post模型里的方法 public function canUpdate(User $user): bool { return $user->hasPermission('update_post'); } - 配置文件:如果共享逻辑需要配置,可以在共享包里发布配置文件到两个应用,比如在包的服务提供者里写:
然后执行$this->publishes([ __DIR__.'/../config/shared.php' => config_path('shared.php'), ]);php artisan vendor:publish --tag=shared-config就能把配置文件发布到应用里,两个应用可以各自覆盖配置。
内容的提问来源于stack exchange,提问作者mehmood
相关产品推荐
相关产品推荐

