【问题标题】:Best way to run some codes on certain controllers - Laravel 5在某些控制器上运行一些代码的最佳方法 - Laravel 5
【发布时间】:2015-11-05 06:44:38
【问题描述】:

我正在开发一个项目,该项目有一个带有顶栏的控制面板,其中包含有关用户的详细信息,如用户名、电子邮件、图像 url 等。这个顶栏几乎可以在所有控制面板视图上运行。现在在每个控制面板控制器中我都会做这样的事情

/***** PostController *********/
class PostController extends Controller
{
    protected $user;

    public function __construct()
    {
        $user = Auth::user(); // Note: here $user is not a global variable

        $this->user['user_name']  = $user->name;
        $this->user['user_email'] = $user->email;
        $this->user['user_role']  = $user->getRolesName()->first();
        $this->user['user_image'] = $user->image;
    }

然后在索引控制器中,我将传递当前用户的角色,以及这样的帖子详细信息。

 public function index()
    {
        $user = $this->user;
        $posts = json_decode( Post::with('author')->get()->toJson() );
        return view('globaladmin.posts.viewposts',compact('posts'), $user);
    }

我认为可能有更好的方法来做到这一点(可能是像存储库这样的设计模式),像往常一样,我们将不胜感激。

【问题讨论】:

    标签: php design-patterns laravel-5


    【解决方案1】:

    您可以使用称为视图共享的东西。如果您查看文档 (http://laravel.com/docs/master/views#sharing-data-with-all-views),您将能够创建一个可以将代码放入其中的服务提供者。

    一个快速(可能很脏)的解决方法是像这样使用 app\Http\Controllers\Controller.php:

    public function __construct()
    {
        $user = Auth::user(); // Note: here $user is not a global variable
        $global_user = [];
    
        if ($user !== null) {
            $global_user['user_name']  = $user->name;
            $global_user['user_email'] = $user->email;
            $global_user['user_role']  = $user->getRolesName()->first();
            $global_user['user_image'] = $user->image;
        }
    
        view()->share('global_user', $global_user);
    }
    

    编辑:要在刀片中使用它,这样的东西会起作用:

    @if($global_user)
        {!! $global_user->user_name !!}
    @endif
    

    【讨论】:

    • 我喜欢这种方法,我也做了一些阅读以将其添加到 AppServiceprovider 的引导方法中,但问题是这些控制器和服务提供者在 Auth 方法之前被实例化了。因此,将代码放在 controller.php 中不会做任何事情。我想放置此代码的最佳位置是 Auth Controller 本身
    • Auth::user() 如果您已登录,应该在 Controller.php 中返回数据,当您尝试将代码放入其中时是否出现任何错误,或者它只是一个空值?
    • 是的,它只是一个空值,它不处理 if 语句。我认为问题在于这段代码需要先等待 controller.php 处理 auth 控制器,因为如果我们只是在 controller.php 中放置一个构造函数,它甚至会在实例化 auth 控制器之前运行这段代码。无论如何,Share 方法帮助很大,我最终创建了一个 ServiceProvider,然后与所有视图共享它:)
    【解决方案2】:

    由于您有简单的数据要分享,我建议您使用 Service Injection 只需将此代码 sn-p 添加到您的主刀片模板:

    @inject('user', 'App\User')
    

    然后在每个扩展主模板的模板中使用$user

    <div>
        Username: {{ $user->user_name }}.
        ...etc
    </div>
    

    顺便说一句:您不必共享此内容,因为在 auth() 全局函数中您可以访问当前登录的用户,如下所示:

    auth()->user()->name // or ->email maybe!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多