我正在编写我的第一个Laravel应用程序,其中也包含Vue。我对拉拉维尔和武都很陌生,所以请温柔一点;-(我在Windows 10上使用Laravel 8.4.x和Vue 2.6.12。
在我的第一次axios调用中,我试图在Vue组件的提交方法中将单个记录写入数据库表,我得到了Http状态代码500,内部服务器错误。控制台中的响应显示Laravel没有看到名为ToDoController的控制器。我不知道为什么会这样,因为我用php-artisan正确地创建了它,并且我可以在VS代码中看到它。
在查看其他帖子试图了解这个问题时,我发现人们建议查看服务器日志以了解更多信息。我不确定这些日志是否会包含在浏览器控制台中的响应中找不到的信息,但在查看之前我不会知道。问题是我不知道在哪里查找日志。
根据Laravel文档,日志记录由config/logging.php管理,该文件显示:
<?php
use MonologHandlerNullHandler;
use MonologHandlerStreamHandler;
use MonologHandlerSyslogUdpHandler;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "monolog",
| "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => env('LOG_LEVEL', 'critical'),
],
'papertrail' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => SyslogUdpHandler::class,
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
],
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
],
'syslog' => [
'driver' => 'syslog',
'level' => env('LOG_LEVEL', 'debug'),
],
'errorlog' => [
'driver' => 'errorlog',
'level' => env('LOG_LEVEL', 'debug'),
],
'null' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
],
];
如果我正确理解这一点,那就意味着DEBUG或更高版本的错误正在被写入logs/laravel.log,我应该在VS代码中看到这一点。但我甚至没有日志目录,更不用说laravel.log文件了。
作为创建新项目的一部分,我是否需要首先创建这些日志?如果是,怎么办?如果没有,我为什么不看看我的日志?服务器错误的严重程度足以写入日志,对吧?
此外,当我们讨论日志的主题时,我有一个先有鸡后有蛋的问题:logging.php文件中LOG_CHANNEL的值是从.env文件中设置的,还是.ev文件获得logging.hp文件中的值?换句话说,如果我想改变我的日志行为,我应该改变哪一种?
日志目录位于存储目录中。所以它是storage/logs/laravel.log。
此外,您可以选择使用log facade记录任何您想要的内容。查看laravel编写日志消息[https://laravel.com/docs/8.x/logging#writing-日志消息]。env((函数中包装的任何内容都是从env文件中提取的。第二个参数允许您设置默认值,如果该值未在env文件中设置或可用。1
@Donkarnash-我强烈怀疑您已经发现了问题。我不了解Laravel 8的新功能。如果我有控制器的FQCN,我的路由会是什么样子?我已经尝试了我能想到的所有变体,但都不起作用,包括url("app/Http/Controllers/ToDoController"(
由于Laravel 8,在RouteServiceProvider中未设置默认命名空间AppHttpControllers
,这是一个受欢迎的更改。
所以现在在路由文件中定义路由时,说控制器的routes/web.php
FQCN必须使用
use AppHttpControllersToDoController;
Route::get('/todos', [ToDoController::class, 'index']);
//OR without importing the use statement
Route::get('/todos', [AppHttpControllersToDoController::class, 'index']);
如果你愿意,你也可以使用路由组的名称空间方法
Route::namespace('AppHttpControllers')
->group(function(){
Route::get('/todos', 'ToDoController@index');
Route::get('/todos/{todo}', 'ToDoController@show');
});
在导入使用语句或内联中使用FQCN还提供了在IDE的中轻松导航和代码建议的好处
要恢复到旧的约定并设置默认命名空间,您应该声明RouteServiceProvider 中的$namespace
/**
* The controller namespace for the application.
*
* When present, controller route declarations will automatically be prefixed with this namespace.
*
* @var string|null
*/
protected $namespace = 'App\Http\Controllers';