This will guide you through upgrading from Backpack 3.4 to 3.5. For upgrading from 3.3 to 3.4 check out the previous upgrade guide.
Run the commands below:
composer require backpack/base:"^1.0.0"
composer require backpack/crud:"^3.5.0"
Alternative: make the version changes above in your composer.json
, then run composer update
.
After you upgrade to Laravel 5.6 or 5.7, make sure you have \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
in your app/Http/Kernel.php
. Backpack\CRUD no longer converts empty strings to null, since Laravel 5.6 and 5.7 installations do that by default. Alternatively, if you can't place it there, you can:
config/backpack/base.php
, under middleware_class
;routes/backpack/custom.php
;Make sure your config/backpack/base.php
file has:
// The guard that protects the Backpack admin panel.
// If null, the config.auth.defaults.guard value will be used.
'guard' => 'backpack',
// The password reset configuration for Backpack.
// If null, the config.auth.defaults.passwords value will be used.
'passwords' => 'backpack',
We've added some new commands:
php artisan backpack:base:publish-user-model
published the BackpackUser
model inside your app/Models/
folder, so you can easily edit it, and say what's different between a User and a BackpackUser; or extend a different User model, if it's somewhere else than App/User.php
;php artisan backpack:base:publish-middleware
publishes the CheckIfAdmin
middleware, that Backpack uses everywhere, so you can easily say who's an admin an who's not (example: check for a is_admin
column, or for an admin
permission, etc.);This is not a breaking change. You can still use the files from the package, if you want to. In fact, you already do, since that's what's specified in your config/backpack/base.php
, under user_model_fqn
and middleware_class
. But on a new installation, Backpack published these files in your app, and uses from the app namespace, instead of the package. In order to have your app 100% upgraded and customizable, please consider running the two commands:
php artisan backpack:base:publish-user-model
php artisan backpack:base:publish-middleware
and using these in your config/backpack/base.php
file:
// Fully qualified namespace of the User model
+ 'user_model_fqn' => App\Models\BackpackUser::class,
- 'user_model_fqn' => \Backpack\Base\app\Models\BackpackUser::class,
// The classes for the middleware to check if the visitor is an admin
// Can be a single class or an array of clases
'middleware_class' => [
+ App\Http\Middleware\CheckIfAdmin::class,
- \Backpack\Base\app\Http\Middleware\CheckIfAdmin::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
],
Make sure you're using backpack_auth()
instead of Auth
in all custom files in the admin panel. For example, check all your Request files (ex: app/Http/Requests/Monster.php
) and make sure all your authorize()
methods return backpack_auth()
instead of Auth::check()
.
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
- return \Auth::check();
+ return backpack_auth()->check();
}
Search any custom files you use in your admin panels for Auth::
. You might have already done this when you upgraded to 0.9.0, but this wasn't properly stressed in the upgrade guide, so please make sure.
If you haven't created any custom error views, re-publish the resources/views/errors
folder. Please note that this will delete your existing folder.
php artisan vendor:publish --provider="Backpack\Base\BaseServiceProvider" --tag=errors --force
If you don't like how these new Backpack error views look, and would rather just use Laravel's, just remove that folder entirely. Do keep in mind that Laravel does NOT provide templates for some common errors (like 503), so it will show Whoops
to your end-users instead. Our recommendation - use Backpack's error views.
# OPTIONAL! see notice above
rm resources/views/errors
We've changed the CSS quite a bit, and its folder structure. If you haven't overwritten backpack's CSS or JS, please republish it using
php artisan vendor:publish --provider="Backpack\Base\BaseServiceProvider" --tag=public --force
Then delete the old CSS file you're no longer going to use:
rm public/vendor/backpack/backpack.base.css
And change the overlays path in your config/backpack/base.php
file (overlays
has been renamed to base
):
// Overlays - CSS files that change the look and feel of the admin panel
'overlays' => [
'vendor/backpack/base/backpack.bold.css',
// 'vendor/backpack/base/backpack.content.is.king.css', // opinionized borderless alternative
],
ALL Backpack/Base views have suffered some changes. If you've published/customized/overwritten any of the Backpack/Base views, please take a look at the changes and implement them in your file. To rephrase this:
resources/views/vendor/backpack/base/
it means you're actually using that file, instead of the new one provided by upgrading to Base 1.0.0;The non-trivial changes in views are that:
layout.blade.php
has been split into multiple files, so that it can be overwritten less often (head
, scripts
);inc/menu.blade.php
we're now loading inc/topbar_left_content.blade.php
and inc/topbar_right_content.blade.php
, so that developers can specify additional content for the top menu; details here;If you DON'T have separate logins & separate sessions for Users and Admins, skip this step.
Still reading? If you've had workarounds in place to use separate sessions for Users and Admins, that's no longer needed - separate sessions are a default in Base 1.0.x. But there's a catch.
If you use @can
statements inside Backpack routes, please note they will not work, since that uses the Auth
facade, and Auth
uses the default auth guard configured in config/auth.php
, not the backpack guard. Laravel provides no way to customize the guard that is used. There are two solutions to this:
A) Replace @can('read')
statements with @if(backpack_user()->can('read'))
inside your custom backpack pages. This allows you to use both helpers, across your entire application:
auth()
- returns the authenticated User;backpack_auth()
- returns the authenticated Admin;B) If you ABSOLUTELY need to use @can
statements for the logged in Admin, we've provided a middleware you can add to all Backpack routes in your config/backpack/base.php
file:
// The classes for the middleware to check if the visitor is an admin
// Can be a single class or an array of clases
'middleware_class' => [
App\Http\Middleware\CheckIfAdmin::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
+ Backpack\Base\app\Http\Middleware\UseBackpackAuthGuardInsteadOfDefaultAuthGuard::class,
],
This will force the Auth
facade to use the backpack guard, inside Backpack routes. Please note that this will make auth()
and backpack_auth()
return the exact same thing INSIDE Backpack routes, but NOT OUTSIDE Backpack routes. So inside your backpack routes you can use them interchangeably, but outside the backpack routes they return different things - the logged in user, or the logged in admin. This possible confusion makes us NOT recommend this method, but if you absolutely need to use @can
... you do you, girl. You do you.
If you use the Backpack authentication for your users to login as well, nothing changes for you. You're good.
If you have used addButtonFromModelFunction()
to add custom buttons to your CRUDs inside the line
stack, please make sure that your method has $crud
as parameter, not $entry
. All in all the changes might look like this:
- public function openGoogle($entry)
+ public function openGoogle($crud)
{
- return '<a class="btn btn-xs btn-default" target="_blank" href="http://google.com?q='.urlencode($entry->text).'"><i class="fa fa-search"></i> Google it</a>';
+ return '<a class="btn btn-xs btn-default" target="_blank" href="http://google.com?q='.urlencode($this->text).'"><i class="fa fa-search"></i> Google it</a>';
}
So if your method is called goToPage
it should be public function goToPage($crud)
, NOT public function goToPage($entry)
. If you used $entry
inside that method, just replace it with $this
- so $this->attribute
instead of $entry->attribute
. There is little chance for you to be using it this way since $crud
was documented, but please make sure - otherwise the update will break your app. Details here.
If you have used $this->crud->orderBy()
in your controllers, there was a bug - when the user clicked the table headings, what you specified in orderBy()
kept being applied, instead of the table being ordered by the column that the user chose. We've fixed this in #1535, but the fix does check for the order
variable. So if you have CRUDs where you have an attribute called order
and have a field for it, or you waybe pass order
as a GET parameter, please check that everything's still working - depends on your code.
Make sure all the models you have CRUD panels for have the CrudTrait (use Backpack\CRUD\CrudTrait;
).
Before this version, you could create CRUD panels form models without CrudTrait, but some things worked, some didn't. Now if your model doesn't have CrudTrait, an explicit 500 error will be thrown on all operations. You can no longer create CRUD panels for Models that do not use CrudTrait. See #1680 for more details.
There have been CSS changes in a lot of CRUD operation CSS files (ex: public/vendor/backpack/crud/css/list.css
. If you haven't changed them, please force republish all assets, and you'll get the new CSS:
php artisan vendor:publish --provider="Backpack\CRUD\CrudServiceProvider" --tag=public --force
If you have changed them, please take a look at the CSS changes and implement them to your code.
If you've overwritten a default operation, please consider updating your code to also include a few new featurs:
$this->crud->setOperation()
);Take a look at the changes that have happened in the operation and reproduce them in your overwritten method. They're trivial.
Add the following new items to your config/backpack/crud.php
file, and configure them to your liking:
// stores pagination and filters in localStorage for two hours
// whenever the user tries to see that page, backpack loads the previous pagination and filtration
'persistent_table' => false,
// Here you may override the css-classes for the content section of the create view globally
// To override per view use $this->crud->setCreateContentClass('class-string')
'create_content_class' => 'col-md-8 col-md-offset-2',
// Here you may override the css-classes for the content section of the edit view globally
// To override per view use $this->crud->setEditContentClass('class-string')
'edit_content_class' => 'col-md-8 col-md-offset-2',
// Here you may override the css-classes for the content section of the revisions timeline view globally
// To override per view use $this->crud->setRevisionsTimelineContentClass('class-string')
'revisions_timeline_content_class' => 'col-md-10 col-md-offset-1',
// Here you may override the css-class for the content section of the list view globally
// To override per view use $this->crud->setListContentClass('class-string')
'list_content_class' => 'col-md-12',
// Here you may override the css-classes for the content section of the show view globally
// To override per view use $this->crud->setShowContentClass('class-string')
'show_content_class' => 'col-md-8 col-md-offset-2',
// Here you may override the css-classes for the content section of the reorder view globally
// To override per view use $this->crud->setReorderContentClass('class-string')
'reorder_content_class' => 'col-md-8 col-md-offset-2',
Most views have suffered changes. That includes:
If you have files inside your resources/views/vendor/backpack/crud
directory, please take a look at the changes for that particular file, and consider doing the changes in your own view file. If you can't do them all:
Keep in mind that by NOT implementing these changes you won't benefit from some of the new features.
Clear the views cache:
php artisan view:clear
That's it. Thank you for taking the time to upgrade. Now time to use some of the shiny new features. Take a look at this version's release notes and click on their respective documentation links.
Then you'll love our premium add-ons - productivity tools and tons of new features.