atVSG

0011001000110100

وحید امیری مطلق

توسعه دهنده وب و موبایل

حل مشکل UnexpectedValueException in Response.php line 395 در Laravel 5


داشتم یک ماژول سرور رو برای NewsGet آپدیت میکردم که وقتی اجراش کردم:

laravel stack trace

stack trace ها با این که طولانی و خسته کننده هستن، میتونن اطلاعات زیادی راجع به نحوه ی به وجود آمدن مشکلات و exception ها بدن اما نه در این مورد.

رفع مشکل در ادامه مطلب.

اینجا exception ای که میگیریم UnexpectedValueException هست و خوب دلایل زیادی میتونه داشته باشه و بنابراین زیاد کمک نمیکنه و خود trace هم حتی اگه ساعت ها وقت روش بزارید باز هیچ ایده ای راجع به نحوه ی ایجاد مشکل نمیده پس کاملا بی استفادس اما بخش اصلی که کمک میکنه، اینه که این exception در فایل Response.php اتفاق افتاده و از این مساله متوجه میشیم که موقعی که فریم ورک میخواسته داده ای رو برگردونه (در برنامه من، json برمیگردونه) با داده ای غیر منتظره رو به رو شده. حالا برای رفع این مشکل باید بفهمیم کجای برنامه همچین داده ای برگردونده میشه؟؟

بعد از var_dump های متوالی متوجه علامت سوال هایی عجیب داخل متن برگشت داده شده، شدم. دلیل اینکه اینا از کجا اومدن رو کاری باهاش نداریم. این علامت سوال ها در واقع کاراکتر های یونیکد غیر قابل چاپ هستند و فرمت json تا جایی که میدونم نمیتونه از این کاراکتر ها درونش باشه. پس صرفا باید قبل از return کردن اون داده، اون رو از این کاراکتر ها پاک کنیم. این کار رو با یک تابع ساده انجام میدیم:

function clean_string($string)
{
	$s = trim($string);
	$s = iconv("UTF-8", "UTF-8//IGNORE", $s); // drop all non utf-8 characters

	// this is some bad utf-8 byte sequence that makes mysql and laravel complain
	$s = preg_replace('/(?>[\x00-\x1F]|\xC2[\x80-\x9F]|\xE2[\x80-\x8F]{2}|\xE2\x80[\xA4-\xA8]|\xE2\x81[\x9F-\xAF])/', ' ', $s);

	$s = preg_replace('/\s+/', ' ', $s); // reduce all multiple whitespace to a single space

	return $s;
}

حالا هر رشته ای رو که فکر میکنید (یا میدونید) میتونه شامل کاراکتر های مشکل ساز غیر قابل چاپ باشه، به این تابع پاس کنید و رشته ی تمیز رو تحویل بگیرید و باهاش هر کاری که دوست دارید انجام بدید!


 دیدگاه ها:
سوال یا دیدگاه؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *