在 Laravel 5 中找不到用户 Class
User Class not found in 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";
}
}
我没有为控制器命名空间,用户模型开箱即用。 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 确实告诉我找不到用户 class。我试图将像 "use App/User" 或 "use App/Http/Controllers/User" 这样的行添加到 UserController。那没起效。
我不确定为什么因为我已经包含了我的 Transformer,所以我没有收到任何错误,但是用户不工作。
我也尝试了不同的使用方法将用户模型包含到 Transfomer 中,因为我虽然可能有错误但我没有得到一个工作版本。
希望有人能帮助我。
让我们澄清一些可能会干扰加载控制器的事情。
路由:默认情况下,laravel 带有一个名为 RouteServiceProvider
的提供程序,位于 app\providers
。如果查看此文件,您会发现有一个名为 $namespace
的变量。如果你想在 routes.php
文件中获得更多 "clear" 路由,这将非常有用。例如,让 $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 数组中删除。然后,您可以使用 "absolute" 命名空间,例如:
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;
自动加载 class 期望您的控制器位于 app/Http/Classes/
而不是 MyCoolApp/Http/Controllers
这就是找不到控制器的原因。
我遇到了以下问题。 我刚从 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";
}
}
我没有为控制器命名空间,用户模型开箱即用。 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 确实告诉我找不到用户 class。我试图将像 "use App/User" 或 "use App/Http/Controllers/User" 这样的行添加到 UserController。那没起效。 我不确定为什么因为我已经包含了我的 Transformer,所以我没有收到任何错误,但是用户不工作。 我也尝试了不同的使用方法将用户模型包含到 Transfomer 中,因为我虽然可能有错误但我没有得到一个工作版本。
希望有人能帮助我。
让我们澄清一些可能会干扰加载控制器的事情。
路由:默认情况下,laravel 带有一个名为 RouteServiceProvider
的提供程序,位于 app\providers
。如果查看此文件,您会发现有一个名为 $namespace
的变量。如果你想在 routes.php
文件中获得更多 "clear" 路由,这将非常有用。例如,让 $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 数组中删除。然后,您可以使用 "absolute" 命名空间,例如: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;
自动加载 class 期望您的控制器位于 app/Http/Classes/
而不是 MyCoolApp/Http/Controllers
这就是找不到控制器的原因。