 <p>You are aborting before the view is even being rendered, so that's the expected behavior.</p> <p>Your <code>CakeResponse::send()</code> call actually has no effect (apart from possible headers being sent), and the only reason this is not causing an error is because the body that is being echoed is empty at that time, otherwise you'd receive a "<em>headers already sent</em>" error when Cake outputs the rendered data.</p> <p>Personally I'd probably use exceptions instead of this manual sending/aborting stuff, something like</p> <pre><code>if(!$abc) { throw new ForbiddenException(); } // ... </code></pre> <p>or a simple <code>return</code></p> <pre><code>if(!$abc) { return $this-&gt;returnError(); } // ... </code></pre> <p>where <code>returnError()</code> returns <code>$this-&gt;response</code>. Both would make invoking <code>send()</code> and <code>_stop()</code> unnecessary. </p> <p>However, it's of course also possible to manually invoke view rendering </p> <pre><code>protected function returnError($data = null, $message = 'Error', $extraSerialize = array(), $statusCode = 400) { // ... $this-&gt;render(); $this-&gt;response-&gt;statusCode($statusCode); $this-&gt;response-&gt;send(); $this-&gt;_stop(); } </code></pre> <p>that way a proper body would be set for the response.</p> <p>See also</p> <ul> <li><strong><a href="http://book.cakephp.org/2.0/en/views/json-and-xml-views.html" rel="nofollow">http://book.cakephp.org/2.0/en/views/json-and-xml-views.html</a></strong></li> <li><strong><a href="http://book.cakephp.org/2.0/en/development/exceptions.html" rel="nofollow">http://book.cakephp.org/2.0/en/development/exceptions.html</a></strong></li> </ul>