On Wednesday, 30 May 2012 13:00:47 UTC+2, Ratty wrote:
>
>  Thanks for this thread actually Bill, it has given me a lot of pause for 
> thought...
>
> Exceptions are a method of reporting WHAT has gone wrong or is about to go 
> wrong. It is not a method of reporting WHERE it went wrong. In my 
> experience they are primarily used for detecting "This should not happen" 
> conditions. In your example the Category model delete function should not 
> be called unless that category is empty, so an exception could be thrown if 
> that condition is not met. This is a long way away from just calling 
> delete() and see if it works. Remember that an exception can be thrown in 
> beforeDelete(), delete(), afterDelete() in your model, any parent model, or 
> any related model that is affected in HABTM, HasMany, ... relationships and 
> they will all arrive at your catch block. You could end up with code like...
>
> try {
>    $this->Category->delete( $id );
> } catch( NotEmptyCategoryException $nece ) {
>      ....
> } catch( CategoryHasChildCategoriesException $ccce ) {
>     ....
> } catch( CategoryReferencedInBlogTableException $crbe ) {
>     ....
> } catch( ChildCategoryOfThisCategoryNotEmptyException $damn ) {
>     ....
> } 
>
> This logic, to my mind, would be far better positioned in the model 
> function...
>
> Category::isDeletable($id) {
>     $result = true;
>     if( $this->hasItems() ) {
>        $this->log( 'Cannot delete category containing items.', 'debug' );
>        $result = false;
>     }
>     if( $this->hasChildCategories() ) {
>         $this->log('Cannot delete category with child categories.', 
> 'debug' );
>         $result = false;
>     }
>     ...
>     return $result;
> }
>
> CategoriesController::delete( $id ) {
>     try {
>         if( $this->Category->isDeletable($id) ) {
>             $this->Category->delete($id);
>         }
>     }
>     catch( Exception $e ){
>         // If isDeletable has done it's job, this should never happen.
>         $this->log( $e->message(), 'error' );
>         ....
>     }
> }
>
> Not only is this cleaner, but the model is FAR easier to write test cases 
> for.
>

In what way is that FAR easier to test.

Note you've changed:

    $this->Category->delete( $id );

into

    if ($this->Category->isDeletable($id)) {
        $this->Category->delete( $id );
    }

Which means you're either checking things twice - or delete is nolonger 
atomic.

AD

-- 
Our newest site for the community: CakePHP Video Tutorials 
http://tv.cakephp.org 
Check out the new CakePHP Questions site http://ask.cakephp.org and help others 
with their CakePHP related questions.


To unsubscribe from this group, send email to
[email protected] For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to