本文目录导读:

- 辅助函数(Helpers)
- 自定义类(服务、库、工具类)
- 视图组件(View Composers & Components)
- Traits(代码复用)
- 中间件(Middleware)
- 配置与配置文件
- 全局变量/共享数据(Service Provider)
- Eloquent 模型的全局作用域(Global Scopes)
- 快速参考表
在 Laravel 中,共享代码的放置位置取决于代码的类型和用途,以下是几种常见的场景及推荐放置位置:
辅助函数(Helpers)
自定义的全局辅助函数,如 format_date()、generate_slug() 等。
推荐位置:
app/Helpers/目录下创建 PHP 文件- 通过
composer.json的autoload.files自动加载
操作步骤:
// 1. 创建 app/Helpers/functions.php
<?php
function format_date($date) {
return $date->format('Y-m-d');
}
// 2. 修改 composer.json
"autoload": {
"files": [
"app/Helpers/functions.php"
]
}
// 3. 运行 composer dump-autoload
自定义类(服务、库、工具类)
需要被多个控制器或服务调用的业务逻辑。
推荐位置:
app/Services/- 业务服务类app/Libraries/- 工具库类app/Repositories/- 仓储模式类app/Utils/- 通用工具类
命名空间示例:
// app/Services/PaymentService.php
namespace App\Services;
class PaymentService {
public function process($order) {
// ...
}
}
在控制器中通过依赖注入或 app() 辅助函数调用。
视图组件(View Composers & Components)
在多个视图间共享的数据(如菜单、分类、用户信息)。
推荐位置:
app/View/Composers/- 视图合成器app/View/Components/- Blade 组件类
示例(视图合成器):
// app/View/Composers/MenuComposer.php
namespace App\View\Composers;
class MenuComposer {
public function compose(View $view) {
$view->with('menu', Menu::all());
}
}
// AppServiceProvider 中注册
View::composer('*', MenuComposer::class);
Traits(代码复用)
多个模型或控制器共用的逻辑。
推荐位置:
app/Traits/目录
示例:
// app/Traits/HasApiTokens.php
namespace App\Traits;
trait HasApiTokens {
public function createToken() {
// ...
}
}
// 在模型中使用
class User extends Authenticatable {
use HasApiTokens;
}
中间件(Middleware)
请求前/后需要执行共享逻辑(如权限验证、日志记录)。
推荐位置:
app/Http/Middleware/
注册:
// 在 app/Http/Kernel.php 中
protected $routeMiddleware = [
'admin' => \App\Http\Middleware\Admin::class,
];
配置与配置文件
全站共享的配置项(如 API 密钥、业务参数)。
推荐位置:
config/目录- 使用
config('yourfile.key')访问
自定义配置文件示例:
// config/business.php
return [
'max_items_per_page' => 20,
'default_currency' => 'USD',
];
全局变量/共享数据(Service Provider)
需要在所有视图中使用的变量。
推荐位置:
app/Providers/AppServiceProvider.php的boot()方法
示例:
public function boot() {
view()->share('siteName', 'My Laravel App');
view()->share('currentYear', date('Y'));
}
Eloquent 模型的全局作用域(Global Scopes)
所有模型查询默认添加的条件(如 is_active = 1)。
推荐位置:
app/Scopes/目录
示例:
// app/Scopes/ActiveScope.php
namespace App\Scopes;
class ActiveScope implements Scope {
public function apply(Builder $builder, Model $model) {
$builder->where('is_active', 1);
}
}
快速参考表
| 代码类型 | 推荐目录 | 关键点 |
|---|---|---|
| 辅助函数 | app/Helpers/ |
需要在 composer.json 注册 |
| 服务类 | app/Services/ |
依赖注入 |
| Traits | app/Traits/ |
被模型/控制器 use |
| 视图组件 | app/View/Composers/ |
在 ServiceProvider 注册 |
| 中间件 | app/Http/Middleware/ |
在 Kernel 注册 |
| 配置项 | config/ |
config() 函数访问 |
| 全局变量 | AppServiceProvider |
view()->share() |
| 全局作用域 | app/Scopes/ |
模型 boot() 方法注册 |
核心原则:
- 逻辑复用 → 服务类 / Traits
- 视图共享 → 视图组件 / ServiceProvider
- 配置共享 → config 目录
- 请求处理 → 中间件
选择位置时考虑职责单一和可测试性,避免把太多逻辑堆在 AppServiceProvider。