انجمن پشتیبانی فارسی فریم ورک کیک پی اچ پی - cakephp
New in version 2.3: CakeBaseException was added ? - نسخه قابل چاپ

+- انجمن پشتیبانی فارسی فریم ورک کیک پی اچ پی - cakephp (http://forum.cakephp.ir)
+-- انجمن: اخبار، تازه ها و اعلانات (http://forum.cakephp.ir/forum-1.html)
+--- انجمن: تازه های CakePHP (http://forum.cakephp.ir/forum-2.html)
+--- موضوع: New in version 2.3: CakeBaseException was added ? (/thread-861.html)



New in version 2.3: CakeBaseException was added ? - Mehrdad - 2012/10/16

درود به همه اساتید کیک پز
داشتم بوک را می خوندم که رسیدم به اینجا:
کد پی‌اچ‌پی:
New in version 2.3CakeBaseException was added

exception CakeBaseException
Base exception 
class in CakePHPAll CakeExceptions and HttpExceptions above extend this class.

CakeBaseException::responseHeader($header null$value null)
See CakeResponse::header()

All Http and Cake exceptions extend the CakeBaseException class, which has a method to add headers
 to the response
. For instance when throwing a 405 MethodNotAllowedException the rfc2616 says:
 
“The response MUST include an Allow header containing a list of valid methods for the requested resource.” 

طبق راهنمایی خودش یه سری هم به اینجا زدم
کد پی‌اچ‌پی:
http://book.cakephp.org/2.0/en/controllers/request-response.html#CakeResponse::header 

ولی باز متوجه نشدم که این قابلیت جدید چه کاری می خواد انجام بده؟!
به خصوص اونجایی که نوشته :

کد پی‌اچ‌پی:
the rfc2616 says“The response MUST include an Allow header containing a list of valid methods
 
for the requested resource.” 
یعنی طبق استاندارد rfc2616 باید یه لیست از متدهای معتبر در قالب هدر ارسال کنیم؟
فکر می کنم اشتباه متوجه شده باشم !!!


RE: New in version 2.3: CakeBaseException was added ? - saleh - 2012/10/17

تو قرار داد rfc2616 اینجوری تائین شده که لیستی از متود های مجاز ارسال بشه.
تو کیک هم اومده زمانی پرتاب استثنا 405 در پاسخ به درخواست این کار رو انجام داده.

فکر میکنم تو این حالت 405 به درخواست دهنده می فهمونه که این متد وجود داره، اما برای تو نه یا دسترسی نداری


RE: New in version 2.3: CakeBaseException was added ? - Mehrdad - 2012/10/17

خوب این دو آرگومانی که این تابع دریافت می کنه چی هستند؟
یعنی وقتی می خوام از MethodNotAllowedException استفاده کنم باید اول با استفاده از CakeBaseException::responseHeader به client بفهمونم که این متد وجود داره اما نه برای تو و بعد MethodNotAllowedException را اجرا کنم ؟ منظورم یه همچین چیزیه:
کد پی‌اچ‌پی:
CakeBaseException::responseHeader($header null$value null);

throw new 
MethodNotAllowedException('شما به این متد دسترسی ندارید!'); 



RE: New in version 2.3: CakeBaseException was added ? - saleh - 2012/10/17

شما اصلا به این کار احتیاجی ندارید. دنبال چه چیزی هستید.؟

این سورس استثنا هست
کد:
class MethodNotAllowedException extends HttpException {

/**
* Constructor
*
* @param string $message If no message is given 'Method Not Allowed' will be the message
* @param string $code Status code, defaults to 405
*/
    public function __construct($message = null, $code = 405) {
        if (empty($message)) {
            $message = 'Method Not Allowed';
        }
        parent::__construct($message, $code);
    }

}

این هم نحوه استفاده
کد:
public function admin_delete($id) {

     if (!$this->request->is('post'))
        {
            throw new MethodNotAllowedException();
        }

        $this->{$this->modelClass}->id = $id;
        if (!$this->{$this->modelClass}->exists())
        {
            throw new NotFoundException(__('Invalid post'));
        }
        if ($this->{$this->modelClass}->delete())
        {
            $this->Rita->flashRedirect(__('حذف شد'), array('action' => 'index'));
        }
        $this->Rita->flashRedirect(__('مجدد تلاش کنید'), array('action' => 'index'));

    }



RE: New in version 2.3: CakeBaseException was added ? - Mehrdad - 2012/10/17

دنبال دو چیز:
اولا اینکه می خواستم بفهمم اضافه شدن CakeBaseException::responseHeader($header = null, $value = null); چه دلیلی داشته و چه سودی داره و چطور باید ازش استفاده کرد؟
و دوم این:
کد پی‌اچ‌پی:
By using exceptions for HTTP errorsyou can keep your code both clean, and give RESTful responses to client applications and users

یه سوال: وقتی از exceptionها استفاده می کنیم یه header جدید ست میشه درسته؟ مثلا وقتی از BadRequestException استفاده می کنیم باید HTTP status بشه 400 درسته؟
اگر این مسئله درست باشه چرا وقتی من از این exception استفاده می کنم و داخل error400.ctp از get_headers
pr می گیریم خروجی کد 302 و 200 را نشونم میده
کد پی‌اچ‌پی:
pr(get_headers('http://localhost/cakephp/sharif/posts/add',1)); 

و خروجی :
کد پی‌اچ‌پی:
Array
(
    [
0] => HTTP/1.1 302 Found
    
[Date] => Array
        (
            [
0] => Wed17 Oct 2012 08:10:46 GMT
            
[1] => Wed17 Oct 2012 08:10:46 GMT
        
)

    [
Server] => Array
        (
            [
0] => Apache/2.2.22 (Ubuntu)
            [
1] => Apache/2.2.22 (Ubuntu)
        )

    [
X-Powered-By] => Array
        (
            [
0] => PHP/5.3.10-1ubuntu3.4
            
[1] => PHP/5.3.10-1ubuntu3.4
        
)

    [
Set-Cookie] => Array
        (
            [
0] => CAKEPHP=urn10jmfpbhop6pmjurb51mj93expires=Wed17-Oct-2012 12:10:46 GMTpath=/; HttpOnly
            
[1] => CAKEPHP=f8i0es5ohadejnjibquni267r5expires=Wed17-Oct-2012 12:10:46 GMTpath=/; HttpOnly
        
)

    [
Location] => http://localhost/cakephp/sharif/admin
    
[Vary] => Array
        (
            [
0] => Accept-Encoding
            
[1] => Accept-Encoding
        
)

    [
Content-Length] => Array
        (
            [
0] => 0
            
[1] => 416
        
)

    [
Content-Type] => Array
        (
            [
0] => text/htmlcharset=UTF-8
            
[1] => text/htmlcharset=UTF-8
        
)

    [
1] => HTTP/1.1 200 OK


اگر اشتباه متوجه شدم ممنون میشم راهنماییم کنید ...


RE: New in version 2.3: CakeBaseException was added ? - saleh - 2012/10/18

ببنید موضوع خیلی ساده تر از این ها هست. شما وقتی BadRequestException استفاده می کنید. اگر در خواست معمولی باشه کیک بعد از دریاقت این کد در پاسخ ها در خواست رو به یک صحفه خطا ارجاع میده. و خروجی شامل صفحات که محتوای اچ تی ام ال هست. در صورتی که به همون آدرس به صورت rest درخواست بفرستید. در پاسخ هیچ خروجی ندارید.

کلا به نوع درخواست پستگی داره. شما دیباگ رو 0 کنید. فایل error رندر هم پاک کنید. فکر میکنم اون چیزی که میخواهید رو به دست میارید.