Both products are “nice to see”. The presentation is clean. Nova seems a bit more modern but this is a question of taste. However, there are big differences in the features proposed. I will try to list the ones that can be a deal-breaker for your projects, in one way or another.

Nova: no export function

With Nova, you cannot export the data from the list. I was very surprised to see that, I think it is an important feature. Of course, you can develop what it called (in the Nova-world) a custom “action” for that, but it will add some work to do.

Nova: adding custom actions

Laravel Backpack: native functions to export data

Laravel Backpack: no multiple-rows selection

Yes, it is incredible, there is still not any mean to select multiple rows and to apply an action to them (such as delete…). I never understood why this is not the top-priority, and I am not alone I think.

Update of August 26, 2018: Laravel Backpack announced a patch to implement this feature (see comments of this article).

Filters are nicer with Backpack

I dislike the way and the presentation of filters in Nova. To define your filters, you have to create a Filter class for each field. Furthermore, the presentation of filters is not practical at all: everything is available by clicking on the filter icon, and then all filters are displayed. I dislike it because there are lot of empty spaces in the table, and this space is not used even on a wide screen.

One Nova Filter

Furthermore, it seems you cannot define a “text” filter (you just enter a text to filter rows).

In Backpack, filters can be implement with less work. No need to have one file/class per filter, everything is in the CrudController:

$this->crud->addFilter([ // dropdown filter

'name' => 'status',

'type' => 'dropdown',

'label'=> 'Status'

], [

1 => 'In stock',

2 => 'In provider stock',

3 => 'Available upon ordering',

4 => 'Not available',

], function($value) { // if the filter is active

// $this->crud->addClause('where', 'status', $value);

});

You have several types of filters (text-based, toggle-based, select-based, and even select2-based which is basically a searchable select field, date and date-range filters).

Laravel Backpack — Select2 filter

Laravel Backpack date-range filter — Amazing feature :-)

In addition, the presentation of the filters is more intuitive in Backpack, even if it is a personal taste:

Laravel Backpack filters are intuitively on top of the table

For this part, Laravel Backpack is a big winner.

Nova lenses: a very good concept

Nova offers the possibility to configure custom views (called lenses) of any CRUD table. This is really a great concept. There is an artisan command to create these lenses, and the overall result is very nice:

Custom view of the User model: showing the “most valuable users”

In Backpack, this feature is not so direct. The best option to do it would probably to use the filters as they offer a great customization, and the callback function is exposing the full CRUD object so you can add all clauses you want to your eloquent query and add/remove columns. This has not been tested but at a first sight it should work.

$this->crud->addFilter([ // select2 filter

'name' => 'status',

'type' => 'select2',

'label'=> 'Status'

], function() {

return [

1 => 'In stock',

2 => 'In provider stock',

3 => 'Available upon ordering',

4 => 'Not available',

];

}, function($value) { // if the filter is active

$this->crud->addClause('where', 'status', $value);

$this->crud->addColumn(...) // Should work

$this->crud->removeColumn(...) // Should work

});

Laravel Backpack: do you like buttons?

With Backpack, you can add many buttons. Everywhere. Above the table, below the table, in each rows, and so on. Each one can do whatever you want: going to a new route, or perform client-side stuff with Javascript/jQuery.

With Nova, this seems not supported yet. Backpack is a winner on this feature. This is clearly a killer-feature as I wonder how you can make a good application without adding on or more buttons, especially at the row level.

Customizing columns format

With Backpack, you can also customize the format of the content of a column, for instance to have a custom condition like: “if the value is 1, then set the text color in red”. This can be achieved with two different mechanisms:

With the model_function column type, which will call a function of your model to format the content of the column.

By adding a Blade template corresponding to the column you want to format.

I am not a fan of the first possibility, it always seems strange to add a Model function just to format the content, it breaks the MVC principles, but as there is another option — which seems more healthy — that’s fine.

What about Nova? Here I had a very bad surprise. You can indeed format as you want any column with the displayUsing function. But with a big limitation.

Here is the code:

/**

* Get the fields displayed by the resource.

*

* @param \Illuminate\Http\Request $request

* @return array

*/ public function fields(Request $request)

{

return [

ID::make()->sortable(),

Text::make(‘Title’)->sortable()->displayUsing(function ($value) { // Let's try that!

return ‘<b>’.strtoupper($value).’</b>’; }), Textarea::make(‘Description’)->sortable(), ];

}

And the unexpected result:

Nova: how I can customize column format?

This is a bit surprising, I think this is a bug and not a feature. Too much security here.

Winner: Backpack.

Revisions: easy with Backpack!

Laravel Backpack provides a way to display a “revisions” button on each row, leading to a screen that displays the… revisions of the record: