2015-02-14 18 views
33

Tôi đã di chuyển mô hình Người dùng từ thư mục ứng dụng mặc định sang ứng dụng/Kiểu máy.Mô hình người dùng Laravel 5 không tìm thấy

Tôi đã cập nhật namespace trong tài khoản để namespace App\Models; nhưng tôi nhận được lỗi này:

FatalErrorException in EloquentUserProvider.php line 122: 
Class '\App\User' not found 

tôi có nhập đúng trong tệp json tôi:

"autoload": { 
    "classmap": [ 
     "database", 
     "app/Modules", 
     "app/Models" 
    ], 
    "psr-4": { 
     "App\\": "app/", 
     "Modules\\": "app/Modules/" 
    } 
}, 

Tôi đã bỏ lỡ gì?

+1

Bạn đã thử 'nhà soạn nhạc tự đổ autoload'? – fakemeta

+0

@fakemeta có, vẫn cung cấp lỗi: ( – imperium2335

+0

Bạn đang cố gắng truy xuất đối tượng người dùng bằng cách sử dụng xác thực laravel hay bạn đang tạo nó theo cách thủ công? – fakemeta

Trả lời

120

Bạn cần cập nhật tệp config/auth.php của mình. Thay đổi 'model' => 'App\User' thành 'model' => 'App\Models\User'.

+0

Làm việc cho tôi. Làm thế nào bạn tìm thấy điều này? – grimmdude

+2

@grimmdude Tôi biết khuôn khổ tốt. –

+0

Cảm ơn một triệu. –

8

Đừng quên thay đổi không gian tên User.php của bạn.

Ví dụ: Nếu mô hình tài khoản của bạn nằm ở /App/User.php sau đó dòng đầu tiên nên đọc:

Tuy nhiên, nếu bạn đã tạo một thư mục /Models và mô hình tài khoản của bạn bây giờ nằm ​​ở /App/Models/User.php, dòng đầu tiên của user.php nên tham chiếu không gian tên mới này:

<?php namespace App\Models; 

Hy vọng điều đó sẽ hữu ích.

2

* Lưu ý: Chiến thuật của tôi có thể về mặt kỹ thuật 'không chính xác' vì nó gây ô nhiễm không gian tên chung. Tuy nhiên, tôi đã gặp khó khăn khi nhận được các câu trả lời khác và chỉ đăng bài này như một phương sách cuối cùng. *

Tôi đã làm điều này một cách hơi khác so với các câu trả lời khác. Tôi cũng đang sử dụng Laravel 5.

1) Tôi đã tạo thư mục app/Models và di chuyển User.php vào thư mục đó.

2) Tôi đã sửa đổi /app/Models/User.php bằng cách xóa không gian tên ở trên cùng. Điều này có thể gây ô nhiễm không gian tên toàn cầu, nhưng đó là cách duy nhất tôi có thể làm cho nó hoạt động.

<?php // !!!! NOTICE no namespace here !!!!! 

use Illuminate\Auth\Authenticatable; 
use Illuminate\Database\Eloquent\Model; 
use Illuminate\Auth\Passwords\CanResetPassword; 
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; 
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; 

class User extends Model implements AuthenticatableContract, CanResetPasswordContract { 

    use Authenticatable, CanResetPassword; 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'users'; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['first_name', 'last_name', 'email', 'password']; 

    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = ['password', 'remember_token']; 

} 

3) tôi đã thêm "app/Mô hình" để phần autoload của tôi trong composer.json:

"autoload": { 
    "classmap": [ 
     "database", 
     "app/Models" // <==== I added this    
    ], 
    "psr-4": { 
     "App\\": "app/" 
    } 
}, 

4) tôi sửa đổi auth.php như sau:

/* 
|-------------------------------------------------------------------------- 
| Authentication Model 
|-------------------------------------------------------------------------- 
| 
| When using the "Eloquent" authentication driver, we need to know which 
| Eloquent model should be used to retrieve your users. Of course, it 
| is often just the "User" model but you may use whatever you like. 
| 
*/ 

'model' => '\User', 

Đối tham chiếu, đây là di chuyển bảng người dùng của tôi:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateUsersTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('users', function(Blueprint $table) 
     { 
      $table->increments('id'); 
      $table->string('first_name'); 
      $table->string('last_name'); 
      $table->string('email')->unique(); 
      $table->string('password', 60); 
      $table->rememberToken(); 
      $table->timestamps(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('users'); 
    } 
} 

Và đây là tập tin UsersTableSeeder.php tôi:

<?PHP 

use Illuminate\Database\Seeder; 
use Illuminate\Database\Eloquent\Model; 

class UsersTableSeeder extends Seeder { 

    public function run() 
    { 
     DB::table('users')->delete(); 

     $users = [ 
      [ 'id' => 1, 'first_name' => 'Bret', 'last_name' => 'Lastname', 'email' => '[email protected]', 'password' => Hash::make('my raw dev password')] 
     ]; 

     foreach($users as $user){ 
      \User::create($user); 
     } 
    } 
} 

?> 

Sau tất cả những thông tin cập nhật được thực hiện, trên dòng lệnh tôi chạy:

composer dump-autoload 
php artisan migrate --seed 

Hope this helps!

+0

Điều đó đã giúp tôi rất nhiều! cám ơn! – Vizjerei

+0

"Điều này có thể gây ô nhiễm không gian tên toàn cầu, nhưng đó là cách duy nhất tôi có thể làm cho nó hoạt động." Không phải nếu bạn làm theo các câu trả lời khác, kể cả tôi. –

+0

Tôi hiểu ý kiến ​​của bạn. Tôi đã thử các câu trả lời khác trước đây để đăng bài của riêng tôi và không thể khiến họ làm việc. Tôi sẽ sửa đổi câu trả lời của tôi để đề nghị mọi người thử các kỹ thuật khác trước tôi. – clone45

0

Đừng quên thay đổi

use App\User; 

để

use App\Models\User; 

trong AuthController.php

10

Đừng quên để xóa bộ nhớ cache sau khi tất cả những thay đổi trước

php artisan config:clear 
+0

Cảm ơn Man, Nó đã giải quyết vấn đề này của tôi [Vấn đề] (http://stackoverflow.com/questions/36442929/laravel-5-1-class-app-user-not-found-fatalerrorexception-in-eloquentuserprov) – Qazi

0

Nếu bạn có mô hình của mình trong một thư mục cụ thể, sau đó bạn cần phải chạy

composer dump-autoload 

để làm mới :)

Các vấn đề liên quan