Я пишу свое первое приложение на Laravel, которое также включает Vue. Я новичок в Laravel и Vue, поэтому будьте осторожны ;-) Я использую Laravel 8.4.x и Vue 2.6.12 в Windows 10.

В моем самом первом вызове axios я пытаюсь записать одну запись в таблицу базы данных в методе отправки моего компонента Vue, я получаю код состояния Http 500, внутренняя ошибка сервера. В ответе в консоли говорится, что Laravel не видит контроллер с именем ToDoController. Я понятия не имею, почему это могло быть, поскольку я создал его правильно с помощью php artisan, и я могу видеть это в VS Code.

Просматривая другие сообщения, чтобы попытаться понять эту проблему, я вижу, что люди рекомендуют просматривать журналы сервера, чтобы найти дополнительную информацию. Я не уверен, что в журналах будет информация, не найденная в ответе в консоли браузера, но я не узнаю, пока не посмотрю. Проблема в том, что я не знаю, где искать свой журнал.

Согласно документации Laravel, ведение журнала регулируется config / logging.php, и в этом файле говорится:

<?php

use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;

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 Code. Но у меня даже нет каталога журналов, не говоря уже о файле laravel.log.

Нужно ли мне что-то делать для создания этих журналов в первую очередь в рамках создания нового проекта? Если так, то? Если нет, то почему я не вижу свой журнал? Ошибка сервера достаточно значительна, чтобы ее записали в журнал, верно?

Кроме того, пока мы говорим о журналах, у меня есть вопрос о курице и яйце: устанавливается ли значение LOG_CHANNEL в файле logging.php из файла .env или файл .env получает значение в журнале .php файл? Другими словами, если я хочу изменить свое поведение при ведении журнала, что мне изменить?

-1
Henry 5 Дек 2020 в 19:23

2 ответа

Лучший ответ

Каталог журналов находится в каталоге хранилища. Итак, это хранилище / журналы / laravel.log.

Кроме того, вы можете выбрать регистрацию всего, что хотите, с помощью фасада журнала. См. Запись сообщений журнала laravel [https://laravel.com/docs/8.x/logging#writing-log-messages]. Все, что заключено в функцию env (), извлекается из файла env. Второй параметр позволяет вам установить значение по умолчанию, если это значение не установлено или не доступно в файле env. 1

3
solidsyntax 5 Дек 2020 в 16:28

@Donkarnash - Я очень подозреваю, что вы определили проблему. Я не в курсе новых возможностей Laravel 8. Как бы выглядел мой маршрут, если бы у меня был FQCN для контроллера? Я пробовал все возможные варианты, но ничего не работает, включая url ('app / Http / Controllers / ToDoController')

Начиная с Laravel 8 пространство имен по умолчанию App\Http\Controllers не установлено в RouteServiceProvider, что является долгожданным изменением.

Итак, теперь при определении маршрутов в файлах маршрутов необходимо использовать routes/web.php FQCN контроллера.

use App\Http\Controllers\ToDoController;

Route::get('/todos', [ToDoController::class, 'index']);

//OR without importing the use statement
Route::get('/todos', [\App\Http\Controllers\ToDoController::class, 'index']);

Если вы хотите, вы также можете использовать метод пространства имен для групп маршрутов


Route::namespace('App\Http\Controllers')
    ->group(function(){
        Route::get('/todos', 'ToDoController@index');
        Route::get('/todos/{todo}', 'ToDoController@show');
    });

Использование FQCN, как при импорте инструкции использования, так и при встроенном, также обеспечивает преимущества простой навигации и предложений кода в среде IDE.

Чтобы вернуться к старому соглашению и установить пространство имен по умолчанию, вы должны объявить пространство имен $ в RouteServiceProvider



    /**
     * 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';
0
Donkarnash 5 Дек 2020 в 17:32