In de tutorial van vandaag zal ik de fout- en uitzonderingsafhandeling van Yii introduceren en u enkele introductiescenario's laten zien.
Vraagt u zich af wat Yii is? Bekijk onze Introductie tot het Yii Framework en Programming With Yii2 series.
Fouten zijn onverwachte defecten in onze code die vaak als eerste door gebruikers wordt ontdekt. Ze zullen meestal de uitvoering van het programma breken. Het is belangrijk om niet alleen elegant te breken voor de gebruiker, maar ook om de ontwikkelaar op de hoogte te stellen van het probleem, zodat dit kan worden verholpen.
Uitzonderingen worden gemaakt door de ontwikkelaar wanneer een mogelijk voorspelbare fout optreedt. In code waar een uitzondering kan optreden, kan de ontwikkelaar () een uitzondering op een robuuste fouthandler werpen.
In Yii worden niet-fatale PHP-fouten (bijvoorbeeld waarschuwingen en meldingen) omgeleid naar catchable exceptions, zodat u kunt beslissen hoe u moet reageren en erop kunt reageren. U kunt een controlleractie toewijzen om al deze uitzonderingen te verwerken. En u kunt het weergaveformaat aanpassen voor fouten, bijvoorbeeld HTML, JSON, XML, enz.
Uitzonderingen en fatale PHP-fouten kunnen alleen in de debug-modus worden beoordeeld. In dit soort ontwikkelingsscenario's kan Yii gedetailleerde informatie over de oproepstapel en segmenten van de broncode weergeven (je kunt dit hierboven zien in de titelafbeelding).
Fatale fouten zijn het soort gebeurtenissen dat de uitvoering van de toepassing schendt. Deze omvatten een gebrek aan geheugen, het instantiëren van een object van een klasse dat niet bestaat, of het aanroepen van een functie die niet bestaat.
Bijvoorbeeld:
$ t = new Unknownobject ();
Laten we aan de slag gaan met enkele voorbeelden van fouten- en uitzonderingsafhandeling.
Eerst configureren we onze applicatie in frontend / config / main.php. De errorHandler wordt gedefinieerd als een component, zoals hieronder wordt getoond. Dit voorbeeld is afkomstig uit mijn opstartreeksapplicatie, Meeting Planner. Let op de errorHandler
configuratie in componenten
:
'mp-frontend', 'naam' => 'Meeting Planner', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['log', '\ common \ components \ SiteHelper'], 'controllerNamespace' = > 'frontend \ controllers', 'catchAll' => [], 'components' => ['assetManager' => [...], ... 'errorHandler' = '[' errorAction '=>' site / error ',' maxSourceLines '=> 20,], ...],];
In het bovenstaande voorbeeld, errorAction
leidt de gebruiker naar de foutactie van mijn SiteController.
Meer in het algemeen biedt Yii een verscheidenheid aan configuratie-opties voor errorHandler
voor omleiding en gegevensverzameling:
Eigendom | Type | Omschrijving |
---|---|---|
$ callStackItemView | draad | Het pad van het weergavebestand voor rendering-uitzonderingen en fouten-call stack-element. bijv. '@ Yii / views / errorHandler / callStackItem.php' |
$ displayVars | rangschikking | Lijst met vooraf gedefinieerde PHP-variabelen die op de foutpagina moeten worden weergegeven. bijv. ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION'] |
$ errorAction | draad | De route (bijv. site / error ) naar de controlleractie die zal worden gebruikt om externe fouten weer te geven. |
$ errorView | draad | Het pad van het weergavebestand voor weergaveuitzonderingen zonder informatie over de call stack. bijv. '@ Yii / views / errorHandler / error.php' |
$ exceptionView | draad | Het pad van het weergavebestand voor weergave-uitzonderingen. bijv. '@ Yii / views / errorHandler / exception.php' |
$ maxSourceLines | geheel getal | Maximumaantal broncodelijnen dat moet worden weergegeven. |
$ maxTraceSourceLines | geheel getal | Maximumaantal traceerbronregelregels dat moet worden weergegeven. |
$ previousExceptionView | draad | Het pad van het weergavebestand voor het weergeven van eerdere uitzonderingen. bijv. '@ Yii / views / errorHandler / previousException.php' |
Over het algemeen willen we dat wanneer een gebruiker een ernstige fout tegenkomt, deze wordt omgeleid naar een vriendelijke, beschrijvende foutpagina.
Dat is wat de errorAction
in errorHandler
doet. Het wordt omgeleid naar onze actie ActionControllerFout:
return ['components' => ['errorHandler' => ['errorAction' => 'site / error',],]];
In onze SiteController definiëren we een expliciete fout
actie:
naamruimte app \ controllers; gebruik Yii; gebruik yii \ web \ Controller; class SiteController breidt Controller uit public function actions () return ['error' => ['class' => 'yii \ web \ ErrorAction',],];
Hier is een basisfoutafhandelaar (u kunt hier meer over lezen):
public function actionError () $ exception = Yii :: $ app-> errorHandler-> exception; if ($ exception! == null) return $ this-> render ('error', ['exception' => $ exception]);
U kunt ook anders reageren als er een fout is of als de pagina-aanvraag niet bestaat in uw toepassing:
public function actionError () $ exception = Yii :: $ app-> errorHandler-> exception; if ($ exception instanceof \ yii \ web \ NotFoundHttpException) // alle niet-bestaande controllers + acties zullen hier eindigen, geef $ this-> render ('pnf'); // pagina niet gevonden anders return $ this-> render ('error', ['exception' => $ exception]);
Dit is mijn huidige pagina niet gevonden 404-fout handler:
In theorie zou u een sitemap van links, voorgestelde pagina's vergelijkbaar met het paginaverzoek, een zoekfunctie en een contactondersteuningslink op uw foutpagina's kunnen opnemen. Al deze kunnen de gebruiker helpen herstellen en elegant verder gaan.
Dit is mijn huidige algemene foutpagina (uiteraard heb ik functies om toe te voegen):
Als we een deel van de code willen controleren op problemen, kunnen we een PHP try catch-blok gebruiken. Hieronder zullen we experimenteren door een fatale kloof te triggeren met een fout nul:
gebruik Yii; gebruik yii \ base \ ErrorException; ... probeer 10/0; catch (ErrorException $ e) Yii :: warning ("Division by zero."); ...
De vangst
bovenstaande reactie is om een waarschuwing voor het logboek te genereren. Yii heeft uitgebreide logboeken:
Als u in plaats van een gebeurtenis te loggen de gebruiker naar de foutpagina wilt sturen die we eerder hebben geconfigureerd, kunt u een uitzondering met de gebeurtenis genereren:
gebruik yii \ web \ NotFoundHttpException; gooi nieuwe NotFoundHttpException ();
Hier is een voorbeeld waarbij we een uitzondering toewerpen met een specifieke HTTP-statuscode en een aangepast bericht:
probeer 10/0; catch (ErrorException $ e) throw new \ yii \ web \ HttpException (451, 'Tom McFarlin's humor is vaak verloren aan mij (en veel mensen).');
Zo ziet die code eruit voor de gebruiker:
Alle fouten in Yii worden vastgelegd, afhankelijk van hoe je ze hebt ingesteld. Mogelijk bent u ook geïnteresseerd in mijn tutorial over Sentry en Rollbar voor het inloggen in Yii:
Ik hoop dat je genoten hebt van onze verkenning van fouten en afhandeling van uitzonderingen. Bekijk de komende tutorials in onze Programming With Yii2-serie terwijl we doorgaan met duiken in verschillende aspecten van het framework.
Als je een diepere duik wilt zien in de ontwikkeling van de Yii-applicatie, bekijk dan onze Building Your Startup With PHP-serie die de geavanceerde template van Yii2 gebruikt. Het vertelt het verhaal van het programmeren van elke stap van Meeting Planner. Het is erg handig als je vanaf de basis wilt leren over het bouwen van applicaties in Yii.
Als je wilt weten wanneer de volgende Yii2-tutorial aankomt, volg me dan @lookahead_io op Twitter of bekijk mijn instructeurpagina.