2015-06-14 7 views
22

मैं कंसोल आधारित एप्लिकेशन बनाने के लिए लैरवेल 5.1 का उपयोग कर रहा हूं। विकास के दौरान जब कोई त्रुटि होती है तो मैं अपवाद ट्रेस प्रदर्शित करना चाहता हूं। हालांकि, अगर मैं php artisan में -v -vv या -vvv विकल्प का उपयोग करता हूं, तो मुझे अपने कस्टम आदेशों के लिए अपवाद ट्रेस नहीं मिलता है। मैंने .env में APP_DEBUG=true सेट किया है, फिर भी कोई अपवाद नहीं है।मैं लार्वेल कंसोल कमांड में अपवाद ट्रेस कैसे प्रदर्शित कर सकता हूं?

php artisan some:unknowncommand का आउटपुट है:

[InvalidArgumentException]        
There are no commands defined in the "some" namespace. 

php artisan -v some:unknowncommand का आउटपुट है:

[InvalidArgumentException]        
    There are no commands defined in the "some" namespace. 

Exception trace: 
() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501 
Symfony\Component\Console\Application->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535 
Symfony\Component\Console\Application->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192 
Symfony\Component\Console\Application->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126 
... 

अब, मैं एक बहुत ही सरल सांत्वना आदेश डीपी बुलाया बनाया: परीक्षण, संभाल समारोह निम्नलिखित के साथ:

/** 
* Execute the console command. 
* 
* @return mixed 
*/ 
public function handle() 
{ 
    generate error here 
} 

php artisan dp:test का आउटपुट है:

[Symfony\Component\Debug\Exception\FatalErrorException] 
syntax error, unexpected 'error' (T_STRING)  

php artisan -v dp:test का आउटपुट वही है। php artisan -vvv dp:test का आउटपुट वही है।

लॉग फ़ाइल अपवाद ट्रेस दिखाती है, इसलिए किसी भी तरह से इसे क्ली में प्रदर्शित करना संभव होना चाहिए। मुझे फ़ाइल नाम और linenumer भी नहीं दिखता है जहां त्रुटि होती है ... मैं इसका ख्याल कैसे रख सकता हूं?

अग्रिम धन्यवाद!

संपादित करें:

थोड़ा और खोद गया है। मामले में मैं अपने आदेश में इस का उपयोग करें:

public function handle() 
{ 
    throw new \Exception("test exception"); 
} 

और मैं आदेश php artisan -v dp:test जारी, त्रुटि ट्रेस छपा है। जब कोई PHP त्रुटि के कारण अपवाद फेंक दिया जाता है तो ट्रेस केवल मुद्रित नहीं होता है। Illuminate/Foundation/Bootstrap/HandleExceptions.php विधि bootstrap PHP त्रुटियों को अपवादों में परिवर्तित कर दिया गया है। जब ऐसा होता है, तो एक अपवाद फेंक दिया जाता है, लेकिन मुद्रण के दौरान -v किसी भी तरह अनदेखा किया जाता है। यह बहुत असुविधाजनक है क्योंकि यह सीएलआई ऐप्स को डीबग करने में कठोर बनाता है।

मुझे लगता है कि समाधान vendor/symfony/console/Application.php, विधि renderException में पाया जा सकता है।

मैं आगे बाद में खुदाई करने के लिए, जब तक किसी और तेजी से मुझ से समाधान इंगित कर सकते हैं :-)

उत्तर

16

मैं कारण पाया:

Illuminate/Foundation/Bootstrap/HandleExceptions.php में

, renderForConsole methode एक को दर्शाता है ConsoleOutput वस्तु डिफ़ॉल्ट सेटिंग वाला ध्यान में रखते हुए नहीं शब्दाडंबर उपयोगकर्ता के लिए कहा सेटिंग्स:

protected function renderForConsole($e) 
{ 
    $this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e); 
} 

इस कारण से, जो कुछ -v -vv या -vvv सेट किया गया है, मेंOutputInterface::VERBOSITY_VERBOSE से हमेशा कम है, इसी कारण से, स्टैक ट्रेस मुद्रित नहीं होता है।

मैं शायद इसके लिए जिथब पर एक समस्या शुरू करता हूं, क्योंकि मुझे लगता है कि यदि सीएलआई में त्रुटियां दिखाई देती हैं तो यह अधिक सुविधाजनक है यदि उपयोगकर्ता सेट -v।

+3

लैरवेल 5.3 का उपयोग करना और ऐसा लगता है कि यह काम करता है। -v के बारे में कोई जानकारी नहीं थी और अब करें। धन्यवाद। –

-1

आप Illuminate\Console\Command वर्ग को देखें, तो आप समारोह है कि करने के लिए त्रुटि स्ट्रिंग लिखते हैं की परिभाषा देखेंगे जा रहा हूँ कंसोल:

/** 
* Write a string as error output. 
* 
* @param string $string 
* @return void 
*/ 
public function error($string) 
{ 
    $this->output->writeln("<error>$string</error>"); 
} 

अब आप यह केवल त्रुटि स्ट्रिंग लिखते हैं देखते हैं कि, आप को प्राप्त करने के आप क्या चाहते हैं इसके साथ सिर्फ एक छोटा सा खेल सकते हैं। आप फ़ंक्शन कॉल को वापस ट्रेस और आउटपुट के रूप में कई लाइनों और फ़ाइलों को पीछे की ओर प्राप्त कर सकते हैं।बस, वर्ग कि आदेश फैली बनाने समारोह को ओवरराइड और उस आदेश वर्ग वारिस के अपने आदेश के सभी करते हैं: क्यों -v नजरअंदाज कर दिया है

/** 
* Write a string as error output. 
* 
* @param string $string 
* @return void 
*/ 
public function error($string) 
{ 
    $this->output->writeln("<error>$string</error>"); 
    $trace = debug_backtrace(); 
    foreach ($trace as $t) 
    { 
     $this->output->writeln("Trace : " . $t['file'] . " on line " . $t['line'] . " function " . $t['function']); 
    } 

} 
+0

आपके उत्तर के लिए धन्यवाद, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है। यह 'त्रुटि' फ़ंक्शन का उपयोग 'जानकारी', 'डीबग' इत्यादि के रूप में किया जाना है। इसका उपयोग अपवादों को प्रिंट करने के लिए नहीं किया जाता है। – Dirk

0

आप ऐसे किसी भी स्तर आप निम्नलिखित उपयोग बयान जोड़कर चाहते हैं, उसके शब्दाडंबर निर्धारित कर सकते हैं:

use Symfony\Component\Console\Output\OutputInterface; 

और फिर अपने संभाल समारोह के शीर्ष करने के लिए इस जोड़ने:

$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); 

देखें अधिक जानकारी के लिए सिम्फनी कंसोल के लिए प्रलेखन http://symfony.com/doc/current/console/verbosity.html के लिए प्रलेखन।

संबंधित मुद्दे

 संबंधित मुद्दे