2015-08-08 28 views
6

Tôi có thể tiêm mô hình người dùng đã đăng nhập hiện tại vào bộ điều khiển của mình bằng cách nào?Laravel-5.1 tiêm người dùng đã đăng nhập hiện tại vào bộ điều khiển của tôi

Ví dụ, trong bộ điều khiển của tôi Tôi hiện có:

public function update(SaveAccountRequest $request) 
{ 
    $user = User::findOrFail(Auth::user()->id); 

    $user->first_name = $request->get('first_name'); 
    $user->last_name = $request->get('last_name'); 
    $user->email = $request->get('email'); 

    if($request->has('password')) { 
     $user->password = Hash::make($request->get('password')); 
    } 

    $user->save(); 

    return redirect('/admin/account')->with('success', 'Your details have been saved.'); 
} 

Nhưng thay vì có dòng này:

$user = User::findOrFail(Auth::user()->id); 

Nó sẽ được tốt đẹp chỉ để tiêm mô hình User vào bộ điều khiển của tôi mà tải trong người dùng đã đăng nhập, để tôi có thể thay thế cho chúng tôi:

public function update(SaveAccountRequest $request, User $user) 
{ 
    $user->first_name = $request->get('first_name'); 
    $user->last_name = $request->get('last_name'); 
    $user->email = $request->get('email'); 

    if($request->has('password')) { 
     $user->password = Hash::make($request->get('password')); 
    } 

    $user->save(); 

    return redirect('/admin/account')->with('success', 'Your details have been saved.'); 
} 

Làm thế nào tôi có thể đạt được điều này?

+0

bạn đã thử bằng cách sử dụng user id, cho tham số thứ hai có lẽ dễ dàng hơn. – ArtisticPhoenix

+0

Bạn không chắc chắn ý mình là gì? – V4n1ll4

Trả lời

9

Đối tượng Request (và đến lượt nó, bất kỳ lớp học theo yêu cầu theo mẫu) đi kèm với các hiện đang đăng nhập sử dụng:

public function update(SaveAccountRequest $request) 
{ 
    $user = $request->user(); 

    $user->first_name = $request->first_name; 
    $user->last_name = $request->last_name; 
    $user->email = $request->email; 

    if ($request->has('password')) { 
     $user->password = bcrypt($request->password); 
    } 

    $user->save(); 

    return redirect('/admin/account')->with('success', 'Your details have been saved.'); 
} 

Không cần phải tiêm bất cứ điều gì, mặt tiền sử dụng, hoặc truy vấn cơ sở dữ liệu.

Ngoài ra, nếu thuộc tính của bạn được đánh dấu là fillable bạn có thể chỉ hàng loạt gán cho họ, mà không cần phải gán từng tài sản trên User mô hình của bạn riêng lẻ:

$user = $request->user()->fill($request->all()); 

if ($request->has('password')) { 
    $user->password = bcrypt($request->password); 
} 

$user->save(); 
+1

Giải pháp thanh lịch. –

5

Nhằm đã dùng hiện hành tiêm, bạn' sẽ cần triển khai một nhà cung cấp dịch vụ đơn giản. Hai bước đơn giản là cần thiết để đạt được điều đó:

  1. Thực hiện các nhà cung cấp

    //app/Providers/CurrentUserServiceProvider.php 
    <?php namespace App\Providers; 
    
    use Illuminate\Support\ServiceProvider; 
    
    class CurrentUserServiceProvider extends ServiceProvider 
    { 
        public function register() 
        { 
        $this->app->bind(User::class, function ($app) { 
         return Auth::user(); 
        }); 
        } 
    } 
    
  2. đăng ký cung cấp dịch vụ của bạn

    //config/app.php 
    'providers' => [ 
        //here go existing providers 
        'App\Providers\CurrentUserServiceProvider' 
    ] 
    
+0

Phần 'Người dùng :: lớp' làm gì? – V4n1ll4

+0

Đây là bí danh tên không gian tên từ PHP 5.5. Bạn có thể vượt qua một chuỗi thay vì –

+0

Bạn có thể tìm thêm chi tiết tại đây http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class –

0

Kể từ laravel 5.0, lớp Illuminate\Contracts\Auth\Authenticatable thể được sử dụng để tiêm nội dung người dùng hiện đã đăng nhập o bộ điều khiển hoặc lớp được giải quyết từ thùng chứa ioc.

0

L5 bạn có thể thử dùng cho mặt tiền:

use Illuminate\Support\Facades\Auth; 
Các vấn đề liên quan