Laravel共享代码放在哪里

wen PHP项目 1

本文目录导读:

Laravel共享代码放在哪里

  1. 辅助函数(Helpers)
  2. 自定义类(服务、库、工具类)
  3. 视图组件(View Composers & Components)
  4. Traits(代码复用)
  5. 中间件(Middleware)
  6. 配置与配置文件
  7. 全局变量/共享数据(Service Provider)
  8. Eloquent 模型的全局作用域(Global Scopes)
  9. 快速参考表

在 Laravel 中,共享代码的放置位置取决于代码的类型用途,以下是几种常见的场景及推荐放置位置:


辅助函数(Helpers)

自定义的全局辅助函数,如 format_date()generate_slug() 等。

推荐位置:

  • app/Helpers/ 目录下创建 PHP 文件
  • 通过 composer.jsonautoload.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.phpboot() 方法

示例:

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

抱歉,评论功能暂时关闭!