【问题标题】:Laravel where to put code that can be accessed from anywhere?Laravel 在哪里放置可以从任何地方访问的代码?
【发布时间】:2016-02-06 03:55:12
【问题描述】:

我目前在控制器中有以下内容,它从 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?还有什么?然后我将如何访问这个新方法?

【问题讨论】:

  • 您好,您可以创建 trait 并包含在任何地方
  • 为什么不让它成为用户模型的访问器呢?所以你可以在任何地方做$user->avatar
  • 模型不是用来与数据库交互的吗?
  • 我想到了像Angular 这样的服务/工厂。我可以创建一个对象并注册它,然后将它注入到控制器中,然后从任何使用它的地方修改它,它会随处改变。基本上它只被实例化一次,所以无论在哪里使用它的值都是一样的。

标签: php laravel


【解决方案1】:

只需在应用程序文件夹中创建一个帮助文件。

<?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/",
        }
    },

只关注文件部分。

【讨论】:

    【解决方案2】:

    你为什么不简单地制作一个 Trait ?类似:

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

    如果你想让你的所有控制器都使用这个特性,只需附加主控制器:

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

    【讨论】:

      【解决方案3】:
      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-&gt;avatar获取用户头像了。

      你甚至可以将public $appends = ['avatar']添加到类的顶部,你的User模型即使转换为json也会始终有一个avatar属性。

      【讨论】:

      • $this-&gt;id 更改为 $this-&gt;attributes['id']
      • @JilsonThomas 我为什么要这样做?
      • 我想上次我试过$this-&gt;id,它没有用。出于某种原因,我不得不做$this-&gt;attributes['id']
      • 无论如何,如果$this-&gt;id 不起作用,只是一个建议。 :)
      • 数据库中的所有属性以及您使用getFooAttribute() 函数创建的任何属性都可用作对象的属性
      【解决方案4】:

      在您的具体情况下,您绝对应该在模型中使用accessor

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

      当您需要多个accessors 时,您必须将它们迁移到presenter

      您问题的确切标题的答案是在服务提供商中使用 configsession 全局助手。这将使它们的值在控制器、模型、视图、演示者、观察者、中间件等中可用。

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

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

      【讨论】:

        猜你喜欢
        • 2018-01-07
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多