mdbootstrap/adminlte-laravel

Removing provider from your app.php is dangerous

Opened this issue · 13 comments

Currently configuration (at least routes) is partly overriden by acacha/adminlte-laravel, and if I try to unregister Acacha\AdminLTETemplateLaravel\Providers\AdminLTETemplateServiceProvider::class provider (as suggessted #47, #63, #59), then session is recreated with each request (laravel/framework#13352).

So that Session::flash(), etc. stops working properly!

That was horrible to debug. 😄

Same problem here. I spent 1 day trying to undo or reoverride package routes.

Invalidating this solution to avoid overwriting route made unusable for me.

¿Any ideas?

@rargueso It's lucky that they are quite a few (routes).
Which one's do you need to define (overwrite)? Give an example and I will try to help you.

My route file:

`Route::group(['middleware' => 'web'], function () {
/* Auth & register */
// Authentication Routes...
$this->get('login', 'Auth\AuthController@showLoginForm');
$this->post('login', 'Auth\AuthController@login');
$this->get('logout', 'Auth\AuthController@logout');

// Password Reset Routes...
$this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');
$this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail');
$this->post('password/reset', 'Auth\PasswordController@reset');

Route::get('/', 'HomeController@index');

});`
I want to disable /home route and /register routes. I want to override the closuse for /.

The best solution would be to turn off all package routes (and use custom), but I have not found the way to do it.

Thanks for helping!

Ok I see the problem (yes @tjomamokrenko is horrible to debug ;-)):

Taylor Otwell introduced a change in 23 mar:

laravel/laravel@5c30c98

So all routes added to routes.php are by default inside a web group middleware ([https://laravel.com/docs/5.2/middleware#middleware-groups])

So as Graham Campbell said on laravel/framework#13352 nesting two or more web middleware groups create a session bug: Session is recreated on every request.

I was working on some solution... Open any ideas...

How about leave routes out of package? As an option i mean. If we can't override then give us option to include or not that routes. Force to have default routes without any way to revoke or override not seems a good idea.

When a better solution is over the table, we take it.

Finally I find why you can't override routes.php... Let me explain you

As I said on other issues routes could be overrided by changing order of ServiceProviders in config/app.php file so if you put:

App\Providers\RouteServiceProvider::class

After

Acacha\AdminLTETemplateLaravel\Providers\AdminLTETemplateServiceProvider::class

Your routes in routes.php file will override default adminlte-laravel routes.

But this now not works because I accidentally added booted in AdminLTETemplateServiceProvider

 $this->app->booted(function () {
            $this->defineRoutes();
        });

Now I will remove this and make a new version of package. Please be sure to change this lines or run composer update to upgrade the package,

@tjomamokrenko maybe you have another problem/issue added to the related here? Be sure not using group middleware 'web' in routes.php as:

Route::group(['middleware' => 'web'], function () {
    Route::auth();

    Route::get('/home', 'HomeController@index');

    Route::get('/', function () {
        return view('welcome');
    });
});

Instead use:

    Route::auth();

    Route::get('/home', 'HomeController@index');

    Route::get('/', function () {
        return view('welcome');
    });

Because 'web' middleware group is applied by default by recent Laravel versions.

@rargueso Please notify me if this changes helps you.

Thanks a lot @acacha for your answer.

I updated to version 2.0.9 running composer update and I moved routes outside web group. All overrides are working now, but still I have 'register' routes and there is no way to remove it.

Of course I can patch that on Auth controller, but it is not a clean solution. Any idea would be apreciated.

Thanks again.

@rargueso Please give me more info or show me the code or some examples because I can't reproduce your problem I have no problems to override register route. Please check the order your services providers are loaded in config/app.php.

Overrides are working, but I want to remove register routes. So instead of take default package routes I updated package to get your fix then i added to my app.php:

/* * Acacha AdminLTE template provider */ Acacha\AdminLTETemplateLaravel\Providers\AdminLTETemplateServiceProvider::class, App\Providers\RouteServiceProvider::class

routes.php (outiside web group):

` $this->get('login', 'Auth\AuthController@showLoginForm');
$this->post('login', 'Auth\AuthController@login');
$this->get('logout', 'Auth\AuthController@logout');

// Password Reset Routes...
$this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');
$this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail');
$this->post('password/reset', 'Auth\PasswordController@reset');

Route::get('/', 'HomeController@index');`

At this point, overrides working great but still got undesired routes when I run a php artisan route:list.

| | GET|HEAD | register | | App\Http\Controllers\Auth\AuthController@showRegistrationForm | web,guest |
| | POST | register | | App\Http\Controllers\Auth\AuthController@register | web,guest |

@rargueso If you want to disable registration you may override some methods in AuthController.php:

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Registration & Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users, as well as the
    | authentication of existing users. By default, this controller uses
    | a simple trait to add these behaviors. Why don't you explore it?
    |
    */

    use AuthenticatesAndRegistersUsers {
        AuthenticatesAndRegistersUsers::showRegistrationForm as traitShowRegistrationForm;
        AuthenticatesAndRegistersUsers::register as traitShowRegister;
    }

    use ThrottlesLogins;

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware($this->guestMiddleware(), ['except' => 'logout']);
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|confirmed|min:6',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array $data
     * @return User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }

    /**
     * @inheritDoc
     */
    public function showRegistrationForm()
    {
        if (config('app.env') === 'production') {
            throw new NotFoundHttpException;
        }

        return self::traitShowRegistrationForm();
    }

    /**
     * @inheritDoc
     */
    public function register(Request $request)
    {
        if (config('app.env') === 'production') {
            throw new NotFoundHttpException;
        }

        return self::traitShowRegister($request);
    }
}

@rargueso Sorry for a late answer.

Thanks @tjomamokrenko

My solution to disable routes was add two methods to my Auth Controller:

public function showRegistrationForm()
{
    abort(404);
}

public function register()
{
    abort(404);
}

Ok thank you all for your messages. I think I can close this issue.