Zend expressive — отчеты об ошибках php

Я пробую Zend Expressive, и это мой config/autoload/zend-expressive.global.php, и когда я попытался выполнить запрос к пути, который будет идти к классу действий, он вернул страницу с ошибкой, но я не вижу никакой ошибки php в журнале ошибок apache. Так что не могу сказать в чем дело.

Есть ли способ в zend-expressive иметь этот журнал ошибок php? Также есть хорошая документация для Zend Expressive? Кажется, в официальной документации не так много примеров.

return [
    'debug' => true,    
    'config_cache_enabled' => false,
    'zend-expressive' => [
        'error_handler' => [
            'template_404'   => 'error::404',
            'template_error' => 'error::error',
        ],
    ],
];

person sparkmix    schedule 02.03.2017    source источник
comment
Zend Expressive v2.0 был выпущен 7 марта, и в этой версии немного изменены и улучшены параметры обработки ошибок. Вот ссылка на последнюю документацию.   -  person edigu    schedule 08.03.2017
comment
Привет. Я использовал это для установки. docs.zendframework.com/zend-expressive/getting-started/skeleton Итак, если я снова удалю все и сделаю установку композитора, получу ли я последнюю версию?   -  person sparkmix    schedule 08.03.2017


Ответы (1)


Если вы хотите попробовать выразительность, я предлагаю использовать скелетный установщик. Это дает вам варианты, что установить. Одним из вариантов является обработчик ошибок whoops, который дает много подробной информации об исключениях.

Официальная документация содержит много информации: https://docs.zendframework.com/zend-expressive/

Документы установщика: https://docs.zendframework.com/zend-expressive/getting-started/skeleton/

Обновление: добавлено ErrorHandler пример регистратора

В качестве основы для вашего ErrorHandler вы можете использовать Zend\Stratigility\Middleware\ErrorHandler. Вы можете прикрепить слушатель к этому ErrorHandler и использовать его для регистрации. В качестве альтернативы вы можете скопировать этот класс и изменить его в соответствии с вашими потребностями.

Следующий шаг — создание для него ErrorHandlerFactory:

<?php 
// src/Factory/ErrorHandler/ErrorHandlerFactory.php

namespace App\Factory\ErrorHandler;

use Interop\Container\ContainerInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;
use Throwable;
use Zend\Diactoros\Response;
use Zend\Expressive\Middleware\ErrorResponseGenerator;
use Zend\Stratigility\Middleware\ErrorHandler;

class ErrorHandlerFactory
{
    public function __invoke(ContainerInterface $container)
    {
        $generator = $container->has(ErrorResponseGenerator::class)
            ? $container->get(ErrorResponseGenerator::class)
            : null;

        $errorHandler = new ErrorHandler(new Response(), $generator);

        if ($container->has(LoggerInterface::class)) {
            $logger = $container->get(LoggerInterface::class);
            $errorHandler->attachListener(function (
                Throwable $throwable,
                RequestInterface $request,
                ResponseInterface $response
            ) use ($logger) {
                $logger->error('"{method} {uri}": {message} in {file}:{line}', [
                    'date'    => date('Y-m-d H:i:s'),
                    'method'  => $request->getMethod(),
                    'uri'     => (string) $request->getUri(),
                    'message' => $throwable->getMessage(),
                    'file'    => $throwable->getFile(),
                    'line'    => $throwable->getLine(),
                ]);
            });
        }

        return $errorHandler;
    }
}

После этого вам нужно зарегистрировать ErrorHandler. Вы делаете это, добавляя его в config/autoload/middleware-pipeline.global.php и, в частности, в раздел middleware => always. Таким образом, он всегда будет работать. Если вы зарегистрируете его первым, он запустится раньше всего.

<?php 
// in config/autoload/middleware-pipeline.global.php

use Acme\Container\ErrorHandlerFactory;
use Zend\Stratigility\Middleware\ErrorHandler;

return [
    'dependencies' => [
        /* ... */
        'factories' => [
            ErrorHandler::class => ErrorHandlerFactory::class,
            /* ... */
        ],
        /* ... */
    ],
    'middleware_pipeline' => [
        'always' => [
            'middleware' => [
                ErrorHandler::class,
                /* ... */
            ],
            'priority' => 10000,
        ],
        /* ... */
    ],
];
person xtreamwayz    schedule 03.03.2017
comment
Есть ли способ просто отображать эти ошибки php вместо/помимо отображения страницы с ошибкой? Кажется, что этот обработчик ошибок требует, чтобы вы добавили код или выдали исключение в своем коде. Я просто хочу увидеть эти ошибки php, например, когда у него есть внутренняя ошибка 500 и подробности. - person sparkmix; 03.03.2017
comment
Хорошо, я понял. Спасибо. Я нашел это, так как не включал возгласы. masterzendframework.com/whoops-errorhandler - person sparkmix; 03.03.2017
comment
Этот обработчик ошибок предназначен только для local/dev, и мне интересно, есть ли способ включить отчет об ошибках php в журнале ошибок apache в производстве? Это помогает только для разработки, но я не вижу никаких ошибок в производстве. - person sparkmix; 03.03.2017
comment
@sparkmix Вы можете написать свой собственный обработчик ошибок, чтобы не только ловить ошибки, но и регистрировать их. Вот пример того, что я использую сам: Фабрика обработчиков ошибок - person xtreamwayz; 03.03.2017
comment
Обработчик ошибок и его прослушиватель задокументированы в документации по стратегии: docs.zendframework .com/zend-stratigility/обработчики ошибок/ - person xtreamwayz; 03.03.2017
comment
Я все еще пытаюсь понять эти фабрики. Итак, вы поместили свой ErrorHandlerFactory в файл route.global.php? - person sparkmix; 04.03.2017
comment
Нет, маршруты выполняются только в том случае, если запрашивается конкретный маршрут. По сути, вы устанавливаете фабричную зависимость используемого вами ErrorHandler и указываете ее на ErrorHandlerFactory. Я не могу точно сказать, где разместить этот ErrorHandlerFactory, так как я не знаю, как вы настроили выразительность и какую версию вы используете. У вас есть код на гитхабе? - person xtreamwayz; 05.03.2017
comment
Я только что использовал ту же скелетную установку, которую вы предоставили, и в начале в route.global.php есть только FastRouteRouter, но есть несколько фабрик и маршрутов, которые мы добавили, но это действительно тестовый код php, который мы пытаемся. Поэтому мне было интересно, если я включу ваш ErrorHandlerFactory в зависимости => фабрики, то будет ли какое-либо промежуточное программное обеспечение внутри конфигурации маршрутов использовать эту фабрику? На основе примера или теста мы создаем фабричный класс с __invoke для вызова класса действий, который мы указали в маршрутах. Мне просто интересно, как использовать обработчик ошибок, о котором вы упомянули? - person sparkmix; 06.03.2017
comment
Привет Спасибо за информацию. Означает ли это, что он будет использовать этот обработчик ошибок, а не 'Zend\Expressive\FinalHandler' => Zend\Expressive\Container\TemplatedErrorHandlerFactory::class ? Кажется, теперь он показывает внутреннюю ошибку сервера без шаблонов/ошибок. Просто интересно, возможно ли, чтобы эта TemplatedErrorHanderFactory работала, пока вы ведете журнал. - person sparkmix; 07.03.2017
comment
Прочтите это: docs.zendframework.com /zend-expressive/reference/migration/ и особенно о TemplatedErrorResponseGenerator. Если вы соедините это с тем, что я написал выше, у вас есть все, что вам нужно. - person xtreamwayz; 07.03.2017
comment
@xtreamwayz Спасибо! У меня только что был этот вопрос, когда я прикрепляю прослушиватели ошибок к ErrorHandler в моем ErrorHandlerFactory. Можно ли подключить прослушиватель, который использует PHP error_log() для регистрации ошибок в файле журнала ошибок php? Поскольку ошибка больше не возникает из ErrorHandler, она никогда не достигнет обработчика ошибок PHP. - person Ashish Ranjan; 08.02.2018