Class 在 slim 框架的路由中未发现异常
Class not found exception in a route of slim framework
我开始使用 Slim+eloquent+twig(使用此演示文稿 http://slides.com/revul/slimframework)并收到此错误:
Type: Error
Message: Class 'Localizacao' not found
File: /Users/Bigua/Sites/salas/src/routes.php
Line: 19
我正在尝试列出 table 中的所有内容并将其传递给我的视图。命令 "composer update" 没有返回任何问题。
这里是我的代码:
Composer.json:
{
"name": "slim/slim-skeleton",
"description": "A Slim Framework skeleton application for rapid development",
"keywords": ["microframework", "rest", "router", "psr7"],
"homepage": "http://github.com/slimphp/Slim-Skeleton",
"license": "MIT",
"authors": [{
"name": "Josh Lockhart",
"email": "info@joshlockhart.com",
"homepage": "http://www.joshlockhart.com/"
}],
"require": {
"php": ">=5.5.0",
"slim/slim": "^3.1",
"monolog/monolog": "^1.17",
"illuminate/database": "~5.1",
"slim/twig-view": "^2.1"
},
"autoload": {
"psr-4": {
"App/Models\": "app/models"
}
}
路线
$app->get('/sala/add', function ($request, $response, $args) {
$this->logger->info("Slim-Skeleton '/salas/add' route");
// Render index view
$args['locais'] = Localizacao::all();
$this->logger->info("locais" . $args);
return $this->renderer->render($response, 'add_sala.html.twig', $args);
})->setName('sala_add');
型号
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as Eloquent;
class Localizacao extends Eloquent {
protected $table = 'localizacao';
protected $primaryKey = 'id_local';
public $timestamps = false;
}
我在这里读过很多类似的主题,在我看来这是命名空间的问题,但我就是不明白哪里错了。对不起,如果这是一个菜鸟问题。
[已解决]
解决方案遵循@marcin-nabiałek 和@geggleto 的两个答案:
修复了 psr-4:
"psr-4": {
"App\Models\": "app/models"
}
并正确使用命名空间:
\App\Models\Localizacao::all()
非常感谢!!!
问题是 Localizacao
在 App\Models
命名空间中,而在 routes.php
中您使用:
Localizacao::all()
没有任何命名空间,因此假定它来自全局命名空间。
可以替换成:
\App\Models\Localizacao::all()
或像以前一样使用它,但在文件顶部添加:
use App\Models\Localizacao;
您的 PSR-4 自动加载作曲家条目不正确
"psr-4": {
"App/Models\": "app/models"
}
应该是
"psr-4": {
"App\Models\": "app/models"
}
让我们把事情说清楚,这个错误的原因是因为你为你的psr-4使用的名称与你在你的控制器中声明的名称不一样class:例如:
"autoload-dev": {
"psr-4": {
"{name you will like to use for your name space here, that will represent your application name e.g any name here (App) for instance}\": "the directory you will like to load your asset,library, routes,middle-ware etc e.g like app or src/"
}
}
我开始使用 Slim+eloquent+twig(使用此演示文稿 http://slides.com/revul/slimframework)并收到此错误:
Type: Error
Message: Class 'Localizacao' not found
File: /Users/Bigua/Sites/salas/src/routes.php
Line: 19
我正在尝试列出 table 中的所有内容并将其传递给我的视图。命令 "composer update" 没有返回任何问题。
这里是我的代码:
Composer.json:
{
"name": "slim/slim-skeleton",
"description": "A Slim Framework skeleton application for rapid development",
"keywords": ["microframework", "rest", "router", "psr7"],
"homepage": "http://github.com/slimphp/Slim-Skeleton",
"license": "MIT",
"authors": [{
"name": "Josh Lockhart",
"email": "info@joshlockhart.com",
"homepage": "http://www.joshlockhart.com/"
}],
"require": {
"php": ">=5.5.0",
"slim/slim": "^3.1",
"monolog/monolog": "^1.17",
"illuminate/database": "~5.1",
"slim/twig-view": "^2.1"
},
"autoload": {
"psr-4": {
"App/Models\": "app/models"
}
}
路线
$app->get('/sala/add', function ($request, $response, $args) {
$this->logger->info("Slim-Skeleton '/salas/add' route");
// Render index view
$args['locais'] = Localizacao::all();
$this->logger->info("locais" . $args);
return $this->renderer->render($response, 'add_sala.html.twig', $args);
})->setName('sala_add');
型号
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as Eloquent;
class Localizacao extends Eloquent {
protected $table = 'localizacao';
protected $primaryKey = 'id_local';
public $timestamps = false;
}
我在这里读过很多类似的主题,在我看来这是命名空间的问题,但我就是不明白哪里错了。对不起,如果这是一个菜鸟问题。
[已解决]
解决方案遵循@marcin-nabiałek 和@geggleto 的两个答案:
修复了 psr-4:
"psr-4": {
"App\Models\": "app/models"
}
并正确使用命名空间:
\App\Models\Localizacao::all()
非常感谢!!!
问题是 Localizacao
在 App\Models
命名空间中,而在 routes.php
中您使用:
Localizacao::all()
没有任何命名空间,因此假定它来自全局命名空间。
可以替换成:
\App\Models\Localizacao::all()
或像以前一样使用它,但在文件顶部添加:
use App\Models\Localizacao;
您的 PSR-4 自动加载作曲家条目不正确
"psr-4": {
"App/Models\": "app/models"
}
应该是
"psr-4": {
"App\Models\": "app/models"
}
让我们把事情说清楚,这个错误的原因是因为你为你的psr-4使用的名称与你在你的控制器中声明的名称不一样class:例如:
"autoload-dev": {
"psr-4": {
"{name you will like to use for your name space here, that will represent your application name e.g any name here (App) for instance}\": "the directory you will like to load your asset,library, routes,middle-ware etc e.g like app or src/"
}
}