Laravel在哪里放置可以从任何地方访问的代码?

时间:2016-02-05 16:50:00

标签: php laravel

我目前在控制器中有以下内容,它从S3获取用户的头像,如果他们有头像返回S3 url,否则返回默认值。

public function GetAvatar(Request $request){
    $userid = Auth::user() ? Auth::user()->id : 0;
    $url = url('/cdn/avatar/default.png');
    if($userid > 0){
        $md5    = md5($userid);
        $disk   = Storage::disk('s3');
        $exists = $disk->has('avatars/' . $md5 . '.png');
        if($exists){
            $url = env('URL_AVATARS') . $md5 . '.png';
        }
    }
    return response()->json($url);
}

我不想每次都写这个,所以我想把它移到一个集中的位置,这样我就可以从任何地方调用它。由于我还是Laravel的新手,我不知道我会把代码放在哪里。

我是否制作了Service ProviderMiddleware?别的什么?那我怎么才能访问这个新方法呢?

4 个答案:

答案 0 :(得分:3)

只需在apps文件夹中创建一个帮助文件即可。

<?php
//helper.php

function makeAvatar()
{
  // Your avatar function
  // return avatar
}

现在,只要您自动加载文件,就可以从应用程序的任何位置调用此函数。

为此,请转到composer.json文件并添加以下内容

"autoload": {
        "classmap": [
            "database",
        ],
        "files":[
            "app/helper.php"  // Add this section
        ],
        "psr-4": {
            "App\\": "app/",
        }
    },

只关注文件部分。

答案 1 :(得分:1)

为什么不简单地制作一个特质?类似的东西:

trait CanGetAvatar {
   public function GetAvatar(Request $request){
       ...
   }
}

然后,如果您希望所有控制器都使用此特征,只需附加主控制器:

// in app/Http/Controllers/Controller.php
class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests, CanGetAvatar;
}

答案 2 :(得分:1)

class User extends Model {


    public function getAvatarAttribute(){
        $url = url('/cdn/avatar/default.png');
        $md5    = md5($this->id);
        $disk   = Storage::disk('s3');
        $exists = $disk->has('avatars/' . $md5 . '.png');
        if($exists){
            $url = env('URL_AVATARS') . $md5 . '.png';
        }
        return $url;
    }
}

然后你可以$user->avatar来获取用户头像。

您甚至可以将public $appends = ['avatar']添加到班级的顶部,即使将其转换为json,您的用户模型也始终具有头像属性。

答案 3 :(得分:1)

在您的具体情况下,您绝对应该在模型中使用oauth2:https://www.googleapis.com/auth/userinfo.email

https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#getToken(android.content.Context

如果您需要多个accessor,则必须将其迁移到accessors

问题的确切标题的答案是在服务提供商中使用presenterconfig全球帮助者。这将使他们的值在控制器,模型,视图,演示者,观察者,中间件等中可用。

https://laravel.com/docs/5.2/eloquent-mutators#accessors-and-mutators

https://laravel.com/docs/5.2/helpers#method-config