在Laravel 5中找不到用户类

时间:2015-02-09 21:49:23

标签: php rest laravel routes laravel-5

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

它总是告诉我它不会欺骗用户模型。

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

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";
}
}

我没有使用Controller命名空间,而且用户模型刚刚开箱即用。 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类。我试图添加这样的行&#34;使用App / User&#34;或&#34;使用App / Http / Controllers / User&#34;到UserController。那没起效。 我不知道为什么因为我已经包含了我的Transformer我没有得到任何错误,但用户不起作用。 我也尝试过不同的使用方法将用户模型包含在Transfomer中,因为我可能会有错误,但我没有得到正常工作的版本。

我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:2)

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

路由:默认情况下,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,则永远不会找到您的控制器,因为这些路由是先前声明的命名空间的前缀。那么,我应该在控制器中使用哪个命名空间?有两种选择:

  1. 遵循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 /)

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

    namespace {Application Name}\Http\Controllers;
    
    Route::get('foo', 'Myapp\Http\Controllers\UserController@index');
    
  3. 应用程序名称和自动加载

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

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

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

    namespace MyCoolApp\Http\Classes;
    

    autoload类希望您的控制器位于app/Http/Classes/而不是MyCoolApp/Http/Controllers

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