I'm new to Laravel and now i manage project that was left by someone.
i try to add a function to API, what i edit :
1) Add a Method :
myproject/app/Http/Controllers/Api/ArticleController.php
2) Add Routes to controler :
myprojectmyproject/routes/api.php
However, when i try to run php artisan route:cache i got below error :
Route cache cleared! \n
LogicException : Unable to prepare route [/] for serialization. Uses Closure.
my route file, myproject/routes/api.php :
Route::group (['prefix' => 'v1', 'middleware' => 'ValidateHeaderSignature'], function() {
Route::group(['prefix' => 'auth'], function() {
Route::post('/login', 'Api\AuthController#login');
Route::post('/register', 'Api\AuthController#register');
Route::post('/login-social-media', 'Api\AuthController#loginSocialMedia');
Route::post('/forgot-password', 'Api\AuthController#forgotPassword');
Route::group(['middleware' => 'jwt.auth'], function() {
Route::patch('/change-password', 'Api\AuthController#changePassword');
Route::post('/logout', 'Api\AuthController#logout');
});
});
Route::group(['prefix' => 'foundation-donate'], function() {
Route::get('/', 'Api\FoundationDonateController#index');
});
Route::group(['prefix' => 'greeting-chat'], function() {
Route::get('/', 'Api\GreetingChatController#index');
});
Route::group(['prefix' => 'prayer-time'], function () {
Route::get('/', 'Api\PrayerTimeController#index');
Route::get('/montly', 'Api\PrayerTimeController#getMontlyPrayerTimes');
});
Route::group(['prefix' => 'asmaul-husna'], function () {
Route::get('/', 'Api\AsmaulHusnaController#index');
});
Route::group(['prefix' => 'guidance'], function () {
Route::get('/zikir', 'Api\GuidanceController#zikirGuidances');
Route::get('/prayer', 'Api\GuidanceController#prayerGuidances');
});
Route::group(['prefix' => 'duas'], function () {
Route::get('/', 'Api\DuasController#index');
Route::get('/index', 'Api\DuasController#index');
Route::get('/all', 'Api\DuasController#allPrayers');
Route::get('/category/{category}', 'Api\DuasController#category');
Route::get('/show/{id}', 'Api\DuasController#show');
});
Route::group(['prefix' => 'zakat'], function () {
Route::get('/', 'Api\ZakatController#index');
Route::get('/index', 'Api\ZakatController#index');
Route::get('/all', 'Api\ZakatController#allPrayers');
Route::get('/category/{category}', 'Api\ZakatController#category');
Route::get('/show/{id}', 'Api\ZakatController#show');
});
Route::group(['prefix' => 'playlist'], function () {
Route::get('/zikir', 'Api\PlaylistSongController#playlistZikir');
Route::get('/shalawat', 'Api\PlaylistSongController#playlistShalawat');
Route::get('/duas', 'Api\PlaylistSongController#playlistDuas');
Route::get('/murottal', 'Api\PlaylistSongController#playlistMurottal');
Route::get('/songs', 'Api\PlaylistSongController#playlistSongs');
});
Route::group(['prefix' => 'dzikir'], function() {
Route::get('/primary', 'Api\DzikirController#primaryDzikir');
Route::get('/my-dzikir', 'Api\DzikirController#myDzikir');
Route::get('/categories', 'Api\DzikirController#dzikirCategories');
Route::group(['middleware' => 'jwt.auth'], function() {
Route::get('/point-total', 'Api\DzikirController#pointTotal');
Route::get('/histories', 'Api\DzikirController#histories');
Route::get('/total-dzikir-history', 'Api\DzikirController#totalDzikirHistory');
Route::post('/post-dzikir', 'Api\DzikirController#postDzikir');
});
});
Route::group(['prefix' => 'sadaqah'], function() {
Route::group(['middleware' => 'jwt.auth'], function() {
Route::get('/histories', 'Api\DzikirController#sadaqahHistories');
});
});
Route::group(['prefix' => 'article'], function() {
Route::get('/', 'Api\ArticleController#index');
Route::get('/daily-reflection', 'Api\ArticleController#getDailyReflection');
Route::get('/get-random', 'Api\ArticleController#getRandom');
});
Route::group(['prefix' => 'notification'], function() {
Route::get('/quote', 'Api\NotificationController#prayerQuotes');
});
Route::group(['prefix' => 'user', 'middleware' => 'jwt.auth'], function() {
Route::get('/show', 'Api\UserController#show');
Route::patch('/update-profile', 'Api\UserController#update');
});
Route::group(['prefix' => 'master'], function() {
Route::get('/location', 'Api\MasterController#location');
});
});
if i got error because of Uses Closure, why previous developer can populate route?
by run php artisan route:list i can see list of route that have ever made before.
any idea ?
===Update, Add routes/web.php
Route::get('/', function () {
return view('welcome');
});
Auth::routes(['register' => false]);
Route::get('/home', 'HomeController#index')->name('home');
Route::get('register/activation/{code}', 'Auth\\RegisterController#activation')->name('register.activation');
Route::group(['prefix' => 'admin', 'middleware' => ['auth']], function() {
Route::get('/user-apps/list-index', ['as' => 'user-apps.list-index', 'uses' => 'Admin\\UserAppsController#listIndex']);
Route::get('/user-apps/resend-confirmation', ['as' => 'user-apps.resend-confirmation', 'uses' => 'Admin\\UserAppsController#resendConfirmation']);
Route::resource('/user-apps', 'Admin\\UserAppsController');
Route::get('/user/list-index', ['as' => 'user.list-index', 'uses' => 'Admin\\UserController#listIndex']);
Route::resource('/user', 'Admin\\UserController');
Route::get('/dzikir-playlist-category/list-index', ['as' => 'dzikir-playlist-category.list-index', 'uses' => 'Admin\\DzikirPlaylistCategoryController#listIndex']);
Route::resource('/dzikir-playlist-category', 'Admin\\DzikirPlaylistCategoryController');
Route::get('/dzikir-playlist/list-index', ['as' => 'dzikir-playlist.list-index', 'uses' => 'Admin\\DzikirPlaylistController#listIndex']);
Route::resource('/dzikir-playlist', 'Admin\\DzikirPlaylistController');
Route::get('/dzikir-playlist-homepage/list-index', ['as' => 'dzikir-playlist-homepage.list-index', 'uses' => 'Admin\\DzikirPlaylistHomepageController#listIndex']);
Route::resource('/dzikir-playlist-homepage', 'Admin\\DzikirPlaylistHomepageController');
Route::get('/dzikir-playlist-my-zikir/list-index', ['as' => 'dzikir-playlist-my-zikir.list-index', 'uses' => 'Admin\\DzikirPlaylistMyZikirController#listIndex']);
Route::resource('/dzikir-playlist-my-zikir', 'Admin\\DzikirPlaylistMyZikirController');
Route::get('/greeting-chat/list-index', ['as' => 'greeting-chat.list-index', 'uses' => 'Admin\\GreetingChatController#listIndex']);
Route::resource('/greeting-chat', 'Admin\\GreetingChatController');
Route::get('/foundation-donate/list-index', ['as' => 'foundation-donate.list-index', 'uses' => 'Admin\\FoundationDonateController#listIndex']);
Route::resource('/foundation-donate', 'Admin\\FoundationDonateController');
Route::get('/asmaul-husna/list-index', ['as' => 'asmaul-husna.list-index', 'uses' => 'Admin\\AsmaulHusnaController#listIndex']);
Route::resource('/asmaul-husna', 'Admin\\AsmaulHusnaController');
Route::get('/guidance/list-index', ['as' => 'guidance.list-index', 'uses' => 'Admin\\GuidanceController#listIndex']);
Route::resource('/guidance', 'Admin\\GuidanceController');
Route::get('/content-category/list-index', ['as' => 'content-category.list-index', 'uses' => 'Admin\\ContentCategoryController#listIndex']);
Route::resource('/content-category', 'Admin\\ContentCategoryController');
Route::get('/duas/list-index', ['as' => 'duas.list-index', 'uses' => 'Admin\\DuasController#listIndex']);
Route::resource('/duas', 'Admin\\DuasController');
Route::get('/zakat/list-index', ['as' => 'zakat.list-index', 'uses' => 'Admin\\ZakatController#listIndex']);
Route::resource('/zakat', 'Admin\\ZakatController');
Route::get('/quote/list-index', ['as' => 'quote.list-index', 'uses' => 'Admin\\QuoteController#listIndex']);
Route::resource('/quote', 'Admin\\QuoteController');
Route::get('/playlist-song-category/list-index', ['as' => 'playlist-song-category.list-index', 'uses' => 'Admin\\PlaylistSongCategoryController#listIndex']);
Route::resource('/playlist-song-category', 'Admin\\PlaylistSongCategoryController');
Route::get('/playlist-song/list-index', ['as' => 'playlist-song.list-index', 'uses' => 'Admin\\PlaylistSongController#listIndex']);
Route::resource('/playlist-song', 'Admin\\PlaylistSongController');
Route::get('/album/list-index', ['as' => 'album.list-index', 'uses' => 'Admin\\AlbumController#listIndex']);
Route::resource('/album', 'Admin\\AlbumController');
Route::get('/artist/list-index', ['as' => 'artist.list-index', 'uses' => 'Admin\\ArtistController#listIndex']);
Route::resource('/artist', 'Admin\\ArtistController');
Route::get('/article/list-index', ['as' => 'article.list-index', 'uses' => 'Admin\\ArticleController#listIndex']);
Route::resource('/article', 'Admin\\ArticleController');
});
When you want to use route caching, you can't use closure to register routes in any file.
As you still have the default route from the fresh Laravel installation in your routes/web.php file, you get this error because when you do php artisan route:cache, Laravel under the hood selializes the routes files and combine them in a single one as he lookup would be quicker.
To solve the issue, you can simply remove the route if that is unneeded or move it to a controller like you did for all the others routes.
The error should be gone then.
Simply delete any route with a callback function like the default routes.
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
edit in
Route::middleware('auth:api')->get('/user', 'SomeController#someMethod');
i just want to group all my admin routes in my laravel. I'm a beginner in laravel and i want to synchronize all my admin routes in one group, my question is, why i cant put the post route inside the group of my admin routes?
Here is my routes:
Route::group(['as' => 'admin::', 'prefix' => 'admin'], function () {
Route::get('login', [
'as' => 'login',
'uses' => 'admin\AdminLoginController#index'
]);
Route::post('login', 'admin\AdminLoginController#auth')->name('admin.login');
});
my above code was returning error , where laravel says admin.login route doesn't exist. Then i tried to put the post route outside the group and it works. Why?.
Here is the code where returns no error:
Route::group(['as' => 'admin::', 'prefix' => 'admin'], function () {
Route::get('login', [
'as' => 'login',
'uses' => 'admin\AdminLoginController#index'
]);
});
Route::post('login', 'admin\AdminLoginController#auth')->name('admin.login');
Because you use as in your route group and it's admin:: and you may link to admin.
Now it goes to admin::login and you need admin.login
What is the best and correct way to write the following routing:
Route::group(['middleware' => ['web']],function (){
Route::prefix('user')->group(function () {
//this address shows the login page
Route::any('login', 'User#login_page');
//others address that control the login action
Route::prefix('login')->group(function (){
Route::get('google', 'User#check_user_login_with_google');
Route::post('form', 'User#check_user_login_with_form');
Route::get('google-url', 'User#redirect_to_google_url');
});
//these address control the registration actions
Route::any('register','User#register');
Route::any('register/check','User#check_user_registration');
});
});
You can do it all in one shot:
Route::group(['prefix' => 'user', 'as' => 'user.', 'middleware' => ['web']], function() {
Route::any('login', 'User#login_page');
...
})
You can use all these in a separate associated array and assign this array to the group here is how to do that .
Route::group(['prefix' => 'user', 'as' => 'user.', 'middleware' => ['web']], function() {
Route::any('login', 'User#login_page');
...
})
Hope this may help you
I defined two different guard in auth.php file like this :
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'website' => [
'driver' => 'session',
'provider' => 'websites',
]
]
There is two different section routes in web.php routes. one for website admn and another for normal users that is a member of those websites. like this :
Route::prefix('/website/{website}')->middleware('auth:website')->group(function () {
Route::group(['prefix' => 'banner_ads'], function () {
Route::get('banner_adsDatatable', ['as' => 'banner_adsDatatable', 'uses' => 'BannerAdsController#banner_adsDatatable']);
});
Route::resource('/banner_ads', 'BannerAdsController');
Route::prefix('/member/{member}')->middleware('auth:web')->group(function () {
Route::group(['prefix' => 'banner_ads'], function () {
Route::get('banner_adsDatatable', ['as' => 'banner_adsDatatable', 'uses' => 'BannerAdsController#banner_adsDatatable']);
});
Route::resource('/banner_ads', 'BannerAdsController');
});
});
Problem is that I have a resource controller (banner ads) that is shared with to users (website admins and members). As you can see I must to add it twice time.
But beacause for normal user I defined banner ads controller again, when I call banner_ads.update for example always return unAuthenticated user.
I do not know what can I do for solve this problem.
Seems like your auth:web middleware is inside auth:website. This is basically checking for an authenticated admin who is trying to access routes of an authenticated user.
You are trying to access routes as a normal user. So it is not working. Just replace your code with this:
Route::prefix('/website/{website}')->middleware('auth:website')->group(function () {
Route::group(['prefix' => 'banner_ads'], function () {
Route::get('banner_adsDatatable', ['as' => 'banner_adsDatatable', 'uses' => 'BannerAdsController#banner_adsDatatable']);
});
Route::resource('/banner_ads', 'BannerAdsController');
});
Route::prefix('/member/{member}')->middleware('auth:web')->group(function () {
Route::group(['prefix' => 'banner_ads'], function () {
Route::get('banner_adsDatatable', ['as' => 'banner_adsDatatable', 'uses' => 'BannerAdsController#banner_adsDatatable']);
});
Route::resource('/banner_ads', 'BannerAdsController');
});
I have following routes:
Route::group(['prefix' => 'group1'], function () {
Route::get('view1', ['as' => 'group1_view1', 'uses' => 'group1Controller#get_view1']);
Route::get('view2', ['as' => 'group1_view2', 'uses' => 'group1Controller#get_view2']);
});
Route::group(['prefix' => 'group2'], function () {
Route::get('view1', ['as' => 'group2_view1', 'uses' => 'group2Controller#get_view1']);
Route::get('view2', ['as' => 'group2_view2', 'uses' => 'group2Controller#get_view2']);
});
I wish to pass variables, for example, $title = 'group-one' to all views in group1 and $title = 'group-two' to all views in group2. Instead of adding variable $title in all methods in each group controller, is it possible to pass variables groupwise in routes?
NO you cannot pass variables into route groups, but if in case you need one piece of view/code in multiple views, title for example, you can use view composers instead.