在 Laravel 5 中找不到用户类

Posted

技术标签:

【中文标题】在 Laravel 5 中找不到用户类【英文标题】:User Class not found in Laravel 5 【发布时间】:2015-04-09 19:11:44 【问题描述】:

我遇到了以下问题。 我刚刚从 4.2 升级到 Laravel 5,但是我首先复制到新的 Controllers 文件夹的 UserController 不起作用。

它总是告诉我它不喜欢用户模型。

我的代码在复制时如下所示:

用户控制器.php

<?php

use App\Transformer\UserTransformer;

class UserController extends ApiController

public function index()

    App::abort(403, 'This is not allowed');


public function show($id)
   
    $user = User::find($id);
    if($user->access_token!=Input::get('access_token'))
        return "It is not allowed to access data from other users";
    else
        $result = $this->respondWithItem($user, new UserTransformer);
        return $result;
    


public function getID()
   
    $user = User::where('email', '=', Input::get('email'))->first();
    if($user->access_token!=Input::get('access_token'))
        return "It is not allowed to access data from other users";
    else
        $result = $user->id;
        return $result;
    


public function register()

    $user = new User;
    $name = Input::get('name');
    $email = Input::get('email');
    $password = Input::get('password');

    if($name != null AND $email != null AND $password != null)
        if(User::where('email', '=', Input::get('email'))->exists())
            return "A user with this email already exists";
        else
            $user->name = $name;
            $user->email = $email;
            $user->password = $password;
            $user->save();
            return "Success";
        
    else
        return "All fields are required";
    


public function login()
    $user = User::where('email', '=', Input::get('email'))->first();
    if($user != null)
        if($user->password==Input::get('password'))
            $then =$user->time;
            $now = strtotime("now");
            $thenTimestamp = strtotime($then);
            $difference = $now - $thenTimestamp;
            if((empty($user->date) AND empty($user->time))OR($difference >=10800)OR($user->date!=date('d.m.Y')))
                $user->access_token=self::getGUID();
                $timestamp = time();
                $user->date=date("d.m.Y",$timestamp);
                $timestamp = strtotime("now");
                $user->time=date('H:i', $timestamp);
                $user->save();
            
            return $user->access_token;
        
        else
            return "Wrong username or password";
    else
        return "Wrong username or password";


function getGUID()
    if (function_exists('com_create_guid'))
        return com_create_guid();
    else
        mt_srand((double)microtime()*100000);
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = chr(45);
        $uuid = 
            substr($charid, 0, 8).$hyphen
            .substr($charid, 8, 4).$hyphen
            .substr($charid,12, 4).$hyphen
            .substr($charid,16, 4).$hyphen
            .substr($charid,20,12);
        return $uuid;
    


public function check()
    $user = User::where('access_token', '=', Input::get('access_token'))->first();
    if($user != null)

    else
    return "no session";


我没有给控制器命名空间,用户模型只是开箱即用。 UserTransformer 确实包含了用户模型。这里是原件:

<?php

use App\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract

/**
 * Turn this item object into a generic array
 *
 * @return array
 */
public function transform(User $user)

    return [
        'id'             => (int) $user->id,
        'name'           => $user->name,
        'email'            => $user->email,
        'phone'         => $user->img,
        'mobile'       => $user->mobile,
        'address'       => $user->address,
    ];


这就是我需要的一切功能。

但现在在 Laravel 5 中,UserController 确实告诉我找不到 User 类。我试图在 UserController 中添加类似“使用 App/User”或“使用 App/Http/Controllers/User”的行。它不起作用。 我不知道为什么因为我已经包含了我的变压器,所以我没有收到任何错误,但用户不起作用。 我还尝试了不同的使用方法来将用户模型包含到 Transfomer 中,因为我虽然可能会出现错误但我没有得到工作版本。

我希望有人可以帮助我。

【问题讨论】:

您是否为用户注册和别名? 另外,您是否按照 Laravel 文档中的升级步骤进行操作? laravel.com/docs/5.0/upgrade 你的User类定义文件在哪里? 【参考方案1】:

让我们澄清一些可能会干扰加载控制器的事情。

路由:默认情况下,laravel 带有一个名为 RouteServiceProvider 的提供程序,位于 app\providers。如果你看一下这个文件,你会发现有一个名为$namespace 的变量。如果您想在routes.php 文件中获得更多“清晰”的路线,这非常有用。例如,拥有$namespace = 'App\Http\Controllers' 你可以转换这个...

Route::get('welcome', 'App\Http\Controllers\HomeController@welcome');

到这个...

Route::get('welcome', 'HomeController@welcome');

所以是的,这是编写规则的简短选择。默认情况下,$namespace 的值设置为Application Name\Http\Controllers

控制器:如果您的 laravel 安装正在使用 RouteServiceProvider,那么您的控制器将永远找不到,因为路由在之前声明的命名空间的前缀。那么,我应该在控制器中使用哪个命名空间?有两种选择:

    遵循 laravel 5 的约定,将控制器放在 app/Http/Controllers/ 文件夹中。然后,将命名空间声明为默认:

    namespace Application Name\Http\Controllers;
    

    并将其设置为routes.php,例如:

    // weather is a controller
    Route::get('foo', 'UserController@index');
    
    // weather is a resource
    Route::resource('api-user', 'UserController');
    

    请注意,命名空间结构与它所在的文件夹结构匹配 (Http/Controllers/)

    从 providers 文件夹中删除 RouteServiceProvider 并将其从 config/app.php 文件中的 providers 数组中删除。然后,您可以使用“绝对”命名空间,例如:

    namespace Application Name\Http\Controllers;
    
    Route::get('foo', 'Myapp\Http\Controllers\UserController@index');
    

应用程序名称和自动加载

你有没有问过自己为什么app 文件夹没有添加到命名空间?看看 composer.json 文件:

"autoload": 
    "classmap": [
        "database"
    ],
    "psr-4": 
        "MyCoolApp\\": "app/"
    
,

如果您记下,您会看到有一个别名指向app/ 文件夹。因此,对于应用程序将响应别名而不是 app\Http\Controllers。 我不是这个主题的专家,希望有人帮我扩展这个解释,但我读过psr-4 就像一个让你匹配命名空间和文件夹结构的规则。结果,如果您的控制器像...

namespace MyCoolApp\Http\Classes;

自动加载类期望您的控制器位于app/Http/Classes/ 而不是MyCoolApp/Http/Controllers

这就是找不到控制器的原因。

【讨论】:

我让它工作了,但现在我遇到了自定义模型的问题。我刚刚在用户模型旁边添加了一个新模型文件。用户模型确实可以正常工作。但是当我包含新模型并且我想使用它时,它会告诉我 $token = new Token;它告诉我找不到类,我不知道为什么。 好的,我自己修好了。我确实需要做作曲家转储自动加载

以上是关于在 Laravel 5 中找不到用户类的主要内容,如果未能解决你的问题,请参考以下文章

使用 Composer 2 自动加载器的 Laravel 基类找不到特征?

在 laravel 5.2 中找不到类“Html”

在 laravel 5.4 中找不到类“Illuminate\Foundation\Application”

在 laravel 5 中找不到助手类

在 laravel 5.6 中找不到 Trait 'App\HasRoles' 错误

laravel 在 php 5.5 中找不到 mcrypt 扩展