我目前在控制器中有以下内容,它从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 Provider
? Middleware
?别的什么?那我怎么才能访问这个新方法呢?
答案 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
。
如果您需要多个accessor
,则必须将其迁移到accessors
。
问题的确切标题的答案是在服务提供商中使用presenter
或config
全球帮助者。这将使他们的值在控制器,模型,视图,演示者,观察者,中间件等中可用。
https://laravel.com/docs/5.2/eloquent-mutators#accessors-and-mutators