ম্যাজেন্টোতে নিউট্রেড টাইপ ইঙ্গিত সহকারে কাজ করা


15

আমি ভাবছি যে কারও কাছে ম্যাগেন্তোর কাস্টম ত্রুটি হ্যান্ডলারের সাথে সহ-বিদ্যমান থাকার জন্য টাইপ চেকিংয়ের জন্য ভাবার চেয়ে ভাল কৌশল রয়েছে কিনা। বিশেষত, আমি টাইপিন্টেড প্যারামিটারের অমিলের ক্ষেত্রে "ক্যাশেবল মারাত্মক ত্রুটিগুলি" সম্পর্কে ভাবছি thrown এখানে Mageক্লাসের একটি উদাহরণ রয়েছে :

/**
 * Write exception to log
 *
 * @param Exception $e
 */
public static function logException(Exception $e)
{
    if (!self::getConfig()) {
        return;
    }
    $file = self::getStoreConfig('dev/log/exception_file');
    self::log("\n" . $e->__toString(), Zend_Log::ERR, $file);
}

ত্রুটি পরিচালনার কারণে, কোনও Zend_Date(যা ভাল কাজ করবে তবে আপনার ব্যতিক্রম লগে অতি বিভ্রান্ত দেখায়) বা Mage_Core_Model_Appএগুলিতে আসলে কোনও মারাত্মক ত্রুটি থাকবে এমন পদ্ধতিতে কোনও কিছু পাঠানো যেতে পারে ।

কোনও পদ্ধতির শীর্ষে টাইপ চেকিং পুনরায় প্রয়োগ করা সম্ভব: $e instanceof Exceptionতবে এই জাতীয় কৌশলগুলি টাইফিন্টের উদ্দেশ্যকে পরাস্ত করে।

কোন ইঙ্গিত পরামর্শ?

উত্তর:


5

ভাল প্রশ্ন +1

আমার প্রথম উত্তরে @ এমপিডব্লিউয়ের সাথে আমার আলোচনার পরে দিকনির্দেশে ভাল পয়েন্টের পরে কিছু গবেষণা এবং পরীক্ষা করেছিল। আমি প্রথমবার এটি আংশিক ভুল বুঝেছি।

স্পষ্ট করতে কিছু কোড যুক্ত করবে যাতে অন্যরা সমস্যাটি আরও ভাল করে বুঝতে পারে।

ছাড়ার আগে একটি নোট

এটি না আসা পর্যন্ত আমার কখনও এ জাতীয় সমস্যা হয়নি। বিকাশকারী মোড সক্ষম করে ম্যাগন্টো-তে বিকাশ করা আমি এ সম্পর্কে একটি সেকেন্ডও ভাবি না। সুতরাং যতবারই আমি পর্ন করব , এটি প্রদর্শিত হবে এবং সেই অনুযায়ী সংশোধন করা হবে।

একটি ব্যাখ্যামূলক নমুনা নিয়ে সমস্যা

আপনার বলার মারাত্মক ত্রুটিগুলি লগ করা হবে (সক্ষম থাকলে) এবং কোড যথারীতি চলতে থাকবে কারণ কোনও ত্রুটি নিক্ষেপ করা হয়নি mageCoreErrorHandlerবা প্রোগ্রামটি করবে না exit

অপ্রকাশনযোগ্য ত্রুটিগুলির জন্য প্রথম ম্যাজেন্টোর মূল ত্রুটি হ্যান্ডলার app/code/core/Mage/Core/functions.php

/**
 * Custom error handler
 *
 * @param integer $errno
 * @param string $errstr
 * @param string $errfile
 * @param integer $errline
 */
function mageCoreErrorHandler($errno, $errstr, $errfile, $errline){
    /**
     * Some internal logic here for building the error message
     */

    $errorMessage .= ": {$errstr}  in {$errfile} on line {$errline}";
    if (Mage::getIsDeveloperMode()) {
        throw new Exception($errorMessage);
    } else {
        Mage::log($errorMessage, Zend_Log::ERR);
    }
}

আপনি দেখতে পাচ্ছেন, বিকাশকারী মোডে এটি দরকারী কিছু বলবে, এটি একটি ত্রুটি নিক্ষেপ করে। বন্ধ থাকলে এটি লগ হবে (সক্ষম থাকলে) এবং চালিয়ে যাবে।

প্রমাণ

আমার testfile.php

require 'app/Mage.php';
Mage::app('admin')->setUseSessionInUrl(false);

// Test function which expect Customer_Model_Customer
function test(Customer_Model_Customer $customer)
{
    var_dump('Do not show me because ' . get_class($customer) . ' is not a customer.');
}

// Enabled developer mode
Mage::setIsDeveloperMode(true);

// Put a var in here
$noGood = Mage::app();

// Make some context
var_dump('hello');
try {
    // Call test function with a not accepted var
    test($noGood);

    // Tell if we get here
    var_dump('And we are here!');

} catch (Exception $e) {
    var_dump('You should die, because I am doing something which I should not do');
}

ফলাফল

বিকাশকারী সক্ষম হয়েছে ode সঠিক ফলাফল

string(5) "hello"
string(66) "You should die, because I am doing something which I should not do"

বিকাশঘটিত অক্ষম, ভুল ফলাফল

string(5) "hello"
string(61) "Do not show me because Mage_Core_Model_App is not a customer."
string(16) "And we are here!"

সুতরাং এটি শেষ পর্যন্ত ত্রুটিটি এড়িয়ে যাবে এবং কোডের পরবর্তী লাইনে চালিয়ে যাবে। এমনকি এমনকি অদ্ভুত ফলাফল সঙ্গে। (@ এমপিডাব্লু পয়েন্ট হিসাবে)

উপসংহার

এটা তোলে পারে ঘটতে যে কেউ ভাবে উন্নয়নশীল হয় যা ত্রুটির যাব অলক্ষিত এবং এটি হবে অবশেষে অপ্রত্যাশিত ফলাফল দেব।

অবশ্যই একটি পেশাদার পদ্ধতিতে বিকাশ করার সময়। ত্রুটি হবে করা খেয়াল এবং মনোযোগ payed করা হয়। ম্যাজেন্টোতে এটি প্রতিরোধের উপায় বিকাশকারী / পরীক্ষার পরিবেশে সর্বদা বিকাশশীলকে সক্ষম করে তোলে is

আইএমএইচও এটি কখনই এই আলোচনার পয়েন্টে পৌঁছা উচিত নয়, যেখানে দ্বিতীয়বারের মত চলক পরীক্ষা করা (কমপক্ষে আমি এটি বর্ণনা করব কীভাবে) সেই উপায়। উত্পাদন পরিবেশে ছেড়ে দেওয়ার আগে কোডটি পরীক্ষা করা উচিত। এটি করা উচিত নয় প্রয়োজন হতে।

দ্বিতীয় চিন্তা

মারেন্টো একটি মারাত্মক ত্রুটি পরে থামানো উচিত। অথবা একটি প্রতিবেদন তৈরি করুন এবং দর্শকের কাছে এটি দেখান। এভাবে কোডের পরবর্তী লাইনগুলি কখনই কার্যকর করা হবে না এবং জিনিসগুলি লক্ষ্য করা যাবে।


> পেশাদার পদ্ধতিতে বিকাশ করার সময় মোটা। ত্রুটিগুলি লক্ষ্য করা হবে এবং মনোযোগ দেওয়া হবে। ম্যাজেন্টোতে এটি প্রতিরোধের উপায় বিকাশকারী / পরীক্ষার পরিবেশে সর্বদা বিকাশশীলকে সক্ষম করে তোলে is ¶ আমি যে তার সাথে একমত. আমার লক্ষ্যটি হ'ল ম্যাজেন্টো ভাষার নিয়মকে উত্পাদন মোডে সম্মান করুন। দেখে মনে হচ্ছে এটির জন্য সম্ভবত একটি কাস্টম মডিউল প্রয়োজন। আপনার অন্তর্দৃষ্টি জন্য ধন্যবাদ!
এমপিডাব্লু

উভয় ক্ষেত্রেই ম্যাজেন্টোর একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত। ব্যবহারকারীর একটি ম্যাজেন্টো ত্রুটিমুক্ত পৃষ্ঠা উপস্থাপন করা হবে এবং ভের / ব্যতিক্রমগুলিতে নিয়মিত ব্যতিক্রমগুলির মতো একটি মেলানো লগফিল থাকবে। এখানে দুর্দান্ত ধরা হ'ল কোডটি বিনা নোটিশ ছাড়াই কার্যকর করা হবে। আপনি অ্যাপ্লিকেশন / কোড / স্থানীয়টিতে ফাংশনগুলির ফাইল অনুলিপি করতে এবং সর্বদা একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন
জেরোইন

1
আমি এটিকে উত্তর হিসাবে চিহ্নিত করার সিদ্ধান্ত নিয়েছি। যদিও আমি এখনও মনে করি যে মাফলিংয়ের মতো ত্রুটিগুলি বিপজ্জনক, তবে এটি সম্ভবত অসম্ভব বলে মনে হচ্ছে যে ম্যাগেন্টো অন্যান্য সমস্যা না খুলে টাইফিন্টগুলিকে সম্মান করে sure দেব মোড চালু রাখার অনুস্মারকটি ভবিষ্যতের পাঠকদের জন্য ভাল এবং এটি সবচেয়ে গুরুত্বপূর্ণ গ্রহণযোগ্যতা
এমপিডাব্লু

2

ভাল প্রশ্ন. আমার মনে E_RECOVERABLE_ERRORহয় পিএইচপি-তে এটি একটি সাধারণ সমস্যা ।

আপনার প্রশ্নে যা আছে তা ব্যতিক্রম হ্যান্ডলার, ত্রুটি হ্যান্ডলার নয় ler ত্রুটি হ্যান্ডলারটি এখানে ধরা পড়ার মতো মারাত্মক ত্রুটিগুলি ( E_RECOVERABLE_ERROR) দিয়ে আসল সমস্যাটি সৃষ্টি করছে ।

পিএইচপি 7 এবং এইচএইচভিএম এর ইতিমধ্যে সমাধান হয়েছে।

এটি ম্যাজেন্টোর সাথে আরও খারাপ কারণ ত্রুটি হ্যান্ডলার পিএইচপি 5.2 ত্রুটি শ্রেণি থেকে এটি নিয়ে কাজ করে না।

ত্রুটি পরিচালনার আরও কার্যকর ধরণটি এই ত্রুটি শ্রেণীর সাথে ডিল করবে এবং এই ত্রুটিগুলি ত্রুটিযুক্ত ধারণাটিতে রূপান্তরিত করবে । উদাহরণ (আমার দ্বারা নয়, এখান থেকে ):

set_error_handler(function($errno, $errstr, $errfile, $errline) {
    if ($errno === E_RECOVERABLE_ERROR) {
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
    return false;
});

সুতরাং Magento আলোকে, ডিফল্ট এরার হ্যান্ডলার বিশ্বব্যাপী ফাংশন mageCoreErrorHandlerমধ্যে app/code/core/Mage/Core/functions.php। এটি Mage_Core_Model_App ( ) এর (সুরক্ষিত পদ্ধতির মাধ্যমে) পদ্ধতি Mage::app()দ্বারা নিবন্ধিত init()হতে পারে ।app/code/core/Mage/Core/Model/App.php_initEnvironment()

একজন পর্যবেক্ষকcontroller_front_init_before যার উপরে আপনার নিজের পিএইচপি ত্রুটি হ্যান্ডলারটিকে উপরে রেজিস্ট্রেশন করে তারপরে যথেষ্ট হওয়া উচিত (পিএইচপি-তে ত্রুটি হ্যান্ডলারগুলি স্ট্যাকযোগ্য):

$previous = set_error_handler(function($errno, $errstr, $errfile, $errline) use (&$previous) {
    if ($errno === E_RECOVERABLE_ERROR) {
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
    if ($previous) {
        return call_user_func($previous, $errno, $errstr, $errfile, $errline);
    }
    return false;
});

তারপরে ধরা পড়ার মতো মারাত্মক ত্রুটিগুলি ব্যতিক্রমগুলিতে রূপান্তরিত হয় এবং আপনি তাদের নিজের এক্সটেনশন কোডে তাদের সাথে ডিল করতে পারেন বা এগুলি অপ্রকাশিত এবং ব্যতিক্রম লগতে দেখা যাবে (পরিবর্তে আপনার দোকানটিকে বর্তমান আচরণের মতো ভুল ধরণের উপর চালানো না হওয়া, মৃত প্রোগ্রামগুলি) মিথ্যা বলবেন না )। পিএইচপি 7-তে ব্যতিক্রম ত্রুটিযুক্ত ধারণা নয় তবে টাইপ এক্সেসেপশন (যা একটি বেসএক্সেপশন ) এখন ক্যাপচারযোগ্য মারাত্মক ত্রুটির জন্য

অন্যান্য সমস্ত ত্রুটিগুলি ম্যাজেন্টোর ত্রুটি হ্যান্ডলারের হাতে দেওয়া হয়েছে।

দ্রষ্টব্য: আমি এটি চেষ্টা করে দেখিনি, এটি একটি লিখন-আপ তবে আমি জানি যে সমস্যাটি সম্পর্কে আপনি জিজ্ঞাসা করছেন এবং ত্রুটি পরিচালনার বিশ্লেষণ 1.5.1.1.0 এর বিপরীতে করা হয়েছে এবং কোড বিশ্লেষণের মাধ্যমে 1.9.1.0 এর বিপরীতে যাচাই করা হয়েছে। ত্রুটি হ্যান্ডলার স্ট্যাকিং কাজ করা উচিত। আমি কিছুটা বর্ধিত উদাহরণ কোড সংযোজন করি যা বেশিরভাগ অংশে কাজ করে।

আমি এখনও এটি ম্যাজেন্টো এক্সটেনশন হিসাবে প্যাকেজ করেছি না তবে এটি মোডম্যানের সাথে সরাসরি হওয়া উচিত। আমি তখন এটি গিথুবে রাখব।

পরিশিষ্ট: ত্রুটি হ্যান্ডলার ডেমো

নিম্নলিখিত কোড-উদাহরণ ( অনলাইন ডেমো ) ত্রুটি পরিচালনাকারীদের স্ট্যাকিং এবং ক্যাচব্যাবল মারাত্মক ত্রুটির উপর ব্যতিক্রম ছোঁড়া প্রদর্শন করে :

<?php
/**
 * error handler demonstration
 *
 * stackable error handle with previous call and catchable error exceptions
 *
 * @author hakre <http://hakre.wordpress.com>
 * @link /magento//a/64972/4115
 */

set_error_handler(function() {
    $args = func_get_args();
    var_dump("me is the previous error handler", $args);
});

$previous = set_error_handler(function($errno, $errstr, $errfile, $errline) use (&$previous) {
    if ($errno === E_RECOVERABLE_ERROR) {
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
    if ($previous) {
        return call_user_func($previous, $errno, $errstr, $errfile, $errline);
    }
    return false;
});

$test = function(callable $test) {};

$a = $undefined; // provoke little warning

$test(new stdClass); // provoke catchable fatal error

প্রোগ্রাম আউটপুট

string(32) "me is the previous error handler"
array(4) {
  [0]=>
  int(8)
  [1]=>
  string(29) "Undefined variable: undefined"
  [2]=>
  string(45) "/tmp/execpad-0eca072b619d/source-0eca072b619d"
  [3]=>
  int(28)
}

Fatal error: Uncaught exception 'ErrorException' with message 'Argument 1 passed to {closure}() must be callable, object given, called in /tmp/execpad-0eca072b619d/source-0eca072b619d on line 30 and defined' in /tmp/execpad-0eca072b619d/source-0eca072b619d:26
Stack trace:
#0 /tmp/execpad-0eca072b619d/source-0eca072b619d(26): {closure}(4096, 'Argument 1 pass...', '/tmp/execpad-0e...', 26, Array)
#1 /tmp/execpad-0eca072b619d/source-0eca072b619d(30): {closure}(Object(stdClass))
#2 {main}
  thrown in /tmp/execpad-0eca072b619d/source-0eca072b619d on line 26

চমৎকার লেখার আপ। আপনার পরীক্ষার সময়, ত্রুটি হ্যান্ডলারটিকে পুনরায় সেট করা থেকে পরিমাপযোগ্য পারফরম্যান্সের অবনতি হয়েছিল?
এমপিডাব্লু

আমি এখনও পর্যন্ত না। মূল ক্ষেত্রেও একটি সম্পর্কিত ক্ষেত্র রয়েছে যেখানে বিকাশ মোডে সমস্ত সতর্কতা / ত্রুটিগুলি ব্যতিক্রমে রূপান্তরিত হয় (এবং ত্রুটি- এক্সসেপ্টিউশন নয় - এমনকি লগও করা হয়নি)। এটিকে বুদ্ধিমান পদ্ধতিতে সমাধানের জন্য সম্ভবত প্যাচসেটের প্রয়োজন। এরার হ্যান্ডলার, সেখানে কোন ভাল প্রেরণ পদ্ধতি পাওয়া যায়, এখানে আমি একরকম এমনকি একটি নির্দিষ্ট ডিফল্ট এরার হ্যান্ডলার আনতে প্যাচ কোর ঝোঁক।
hakre

1

এটি ইতিমধ্যে ডিফল্ট পিএইচপি দ্বারা (Exception $e)ফাংশন প্যারামিটার সংজ্ঞা যুক্ত করে পরিচালনা করা হয় ।

আপনি এই ফাংশনে কোনও ব্যতিক্রম বা ব্যতিক্রমের প্রসারণ ব্যতীত আর কিছুই পাস করতে পারবেন না।


mageCoreErrorHandlerফাংশনটি একবার দেখুন । ভুল প্যারাম দ্বারা চালিত একটি ত্রুটি পরিচালনা করা হবে এবং অ-বিকাশকারী মোডে দমন করা হবে এবং একটি Exceptionবিকাশকারী মোডে ফেলে দেওয়া হবে।
এমপিডাব্লু

যখন প্রথম স্থানে এমন কিছু ঘটে তখন মারাত্মক কিছু ভুল হয়। ম্যাজেন্টোদের mageCoreErrorHandlerনিশ্চিত হওয়া উচিত যে দর্শকদের মুখে কোনও ত্রুটি নিক্ষেপ হবে না। try{}catch(){}এগুলিকে নিজের করে নেওয়ার জন্য আপনি নিজের তৈরি করতে পারেন এবং যদি আপনি এগুলি পাস না করতে পারেন।
জেরোইন

কোনও দমন-বিহীন মারণাত্মক মারাত্মক ত্রুটির ক্ষেত্রে কোনও ব্যতিক্রম ছুঁড়ে দেওয়া বিবেচনা করে, চেষ্টা / ধরা আমাকে কী পেতে পারে?
এমপিডব্লু

1
স্থানীয় পরীক্ষার পরে অবশেষে আমি এটি পাচ্ছি ... আপনি খুব ঠিক বলেছেন, ত্রুটিটি দমন করা হয়েছে এবং কোডটি অবিরত থাকবে। আমি আমার উত্তর আপডেট করব এবং কিছু অতিরিক্ত চিন্তা যুক্ত করব
জেরোইন

আমি একটি নতুন উত্তর পোস্ট করব অন্যথায় আমাদের কথোপকথনের কোনও অর্থ হয় না
জেরোইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.