I am trying to have two separate fuctions on my application. One to complete a task and the other to delete but I am getting an error and the form doesn't load: Route [task.delete] not defined. How can I resolve the conflict between the routes? The form only loads when I take the second route out. UPDATE: The delete function now acts the same as the complete function.
Route::patch('/task/{task}',['uses' => 'TaskController#complete', 'as'=> 'task.complete']);
Route::delete('/task/{task}',['uses' => 'TaskController#delete', 'as'=> 'task.delete']);
Controller:
public function delete(Task $task) { $task->delete(); session()->flash('status', 'Task Deleted!'); return redirect('/profile/' . auth()->user()->id); }
In laravel world you should use the delete request type if you try to remove
something from database
so it will be
Route::delete('/task/{task}',['uses' => 'TaskController#delete', 'as'=> 'task.delete']);
Route::patch('/task/{task}',['uses' => 'TaskController#complete', 'as'=> 'task.complete']);
you can read more about it in the Basic Routing section
Use a different verb. You can have multiple routes matching the same pattern as long as they use different methods.
Route::delete('/task/{task}',['uses' => 'TaskController#delete', 'as'=> 'task.delete']);
Route::post('/task/{task}',['uses' => 'TaskController#complete', 'as'=> 'task.complete']);
// or `Route::patch()`, both are valid.
Try to change
Route::patch('/task/{task}',['uses' => 'TaskController#delete', 'as'=> 'task.delete']);
to
Route::delete('/task/{task}',['uses' => 'TaskController#delete', 'as'=> 'task.delete']);
Related
I'm actually inserting data without problems on my DB...but when I try to edit one row and save the changes... it throws me this error...
"No query results for model [model's name]"
I already try to fix that with => protected $primaryKey = 'id'; On my model.
But still getting the same error ....any help ?
The specific error route looks like
"admin/titulares/2"
and before I press the save button like "admin/titulares/2/edit"
My routes
Route::group([
'middleware' => ['prefix' => config('backpack.base.route_prefix', 'admin'),
'web', config('backpack.base.middleware_key', 'admin')],
'namespace' => 'App\Http\Controllers\Admin',
], function () { // custom admin routes
Route::get('dashboard', 'dashboardController#dashboard');
#CRUD::resource('equipos', 'EquiposCrudController');
#CRUD::resource('regiones', 'RegionesCrudController');
CRUD::resource('parametros', 'ParametrosCrudController');
CRUD::resource('estaciones', 'EstacionesCrudController');
#CRUD::resource('redes', 'RedesCrudController');
#CRUD::resource('huso', 'HusoCrudController');
CRUD::resource('titulares', 'TitularesCrudController');
CRUD::resource('operadores', 'OperadoresCrudController');
});
UPDATE:
This is my edit form action (it uses https://laravelcollective.com/docs/5.0/html)
{!! Form::open(array('url' => $crud->route.'/'.$entry->getKey(), 'method' => 'put', 'files'=>$crud->hasUploadFields('update', $entry->getKey()))) !!}
Are you sure using right method for update, You should use put for update data, for example,
Route::put('example/{id}', 'ExampleController#update')
I hope this will help
I am working on a legacy code, a project built with Laravel 5.2, and I am getting an error:
Route pattern "/api/v0/taxonomy/{term}/{{term}}" cannot reference variable name "term" more than once.
For this route:
/post/106
This is are my routes:
Route::group(['prefix' => 'api'], function() {
Route::group(['prefix' => 'v0'], function () {
Route::get('route/{a?}/{b?}/{c?}/{d?}', 'DynamicRouteController#resolve');
Route::get('id/{id}', 'DynamicRouteController#resolveId');
Route::get('search', 'SearchController#search');
Route::resource('taxonomy/{term}','TaxonomyController');
});
});
Not sure, why am I getting this error?
When you define a route as a resource then Laravel seems to create all the routes necessary for your resource: GET, POST, PATCH, DELETE.
So you would just need to define Route::resource('taxonomy','TaxonomyController'); or Route::resource('taxonomy.post','TaxonomyPostController');
Check docs
You just need rename your route parameter like this:
Route::resource('taxonomy/{term}','TaxonomyController', ['parameters'
=> ['{term}' => 'your_name']]);
be careful!!!!. you need insert bracket. this will cause wrong result:
Route::resource('taxonomy/{term}','TaxonomyController', ['parameters'
=> ['term' => 'your_name']] );
attention:
'your_name' should not be same as your parameter so this method make wrong
result.
Route::resource('taxonomy/{term}','TaxonomyController', ['parameters'
=> ['{term}' => 'term']});
I am using a Laravel jenssengers MongoDB and it is my first time seeing the word obfuscating. I see many open source options on github but nothing that does what i want.
How do i obfuscate my url from looking like this
http://blog.dev:8000/article/57780ee99a892008f64d5341
To looking like
http://blog.dev:8000/article/how-to-do-this-article
My routes expect an article id like so
Route::get('/article/{article_id}', [
'uses' => 'MainController#singleArticle',
'as' => 'article'
]);
...And Controller
public function singleArticle($article_id){
$article = Article::find($article_id);
return view('article',['article' => $article]);
}
And i am assuming it is quicker working with ids rather than text.(Correct me if i am wrong) Therefore changing the route to ...
Route::get('/article/{article_title}', [
'uses' => 'MainController#singleArticle',
'as' => 'article'
]);
and controller to
public function singleArticle($article_title){
$article = Article::where('title',$article_title)->first();
return view('article',['article' => $article]);
}
Would be a bad choice that i might regret later when two articles have the same title?
So how do i obfuscate my routes, to look like the title of the article which is being fetched from the database?
I am creating some hard coded routes that will likely be changed again freely in the future. To abstract the ideas a bit:
We have a controller/method BuySubscriptionController#start:
class BuySubscriptionController
function start()
{
$plan = Plan::findBySlug($request->get('plan'));
return view('someView', ['plan' => $plan]);
}
}
We currently have the following route:
Route::get('/buy-subscription/start', 'BuySubscriptionController#start');
This means the sales team would need to advertise the following urls:
site.com/buy-subscription/start?plan=plan-one
site.com/buy-subscription/start?plan=plan-two
Now we have been requested to have a few specialized routes:
site.com/purchase/the-basic-plan (plan-one)
site.com/purchase/the-mega-plan (plan-two)
Now I am trying to add these specialized urls to my routes. I was hoping to do something as follows, but does not work:
Route::get('/purchase/the-basic-plan', [
'uses' => 'BuySubscriptionController#start',
'with' => ['plan' => 'plan-one']
]);
Route::get('/purchase/the-mega-plan', [
'uses' => 'BuySubscriptionController#start',
'with' => ['plan' => 'plan-two']
]);
Is there any way to achieve this, simply, without over engineering some new translation layer? Keep in mind that next week the url might be /buy/the-god-plan meaning plan-one, so being able to simple add a line to my routes seems ideal.
You can define a route that takes the plan as a parameter, and use Regular Expression Constraints so that parameter can only take certain values that you allow. So your route definition can look like this:
Route::get('/purchase/{plan}', 'BuySubscriptionController#start')
->name('purchase-plan')
->where('plan', 'the-basic-plan|the-mega-plan');
Then in your controller action just use the parameter:
class BuySubscriptionController
{
protected $plans = [
'the-basic-plan' => 'plan-one',
'the-mega-plan' => 'plan-two'
];
function start($plan)
{
// You can use an associative array to convert the $plan parameter
// into the value you need for querying the database
$plan = Plan::findBySlug($this->plans[$plan]);
return view('someView', ['plan' => $plan]);
}
}
If you need to generate URLs for the route you can just use the route helper method and pass it the plan name:
route('purchase-plan', 'the-basic-plan');
And you'll get:
site.com/purchase/the-basic-plan
This solution allows you to add any number of plan names by just adding the public plan for the URL in the where constraint of the route, then associating that value with the one you need for the query in your controller's $plans property.
I have this defined in my routes.php file
Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController#Login'));
Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController#RegistrarAdministrador'));
And in my login.blade.php file, the form starts as this
{{ Form::open(array('route'=>'Loguearse'))}}
I dont know why when i submit the form takes the second route instead the first one, even though I am pointing to the first one.
There must be a way to go to the same url from two different forms, that is what I want.
If you have two routes with the exact same URI and same method:
Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController#Login'));
Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController#RegistrarAdministrador'));
How can Laravel know the difference between them when something hit /gestionAdministrador?
It will always assume the first one.
The name you set 'as' => 'RegistrarAdministrador' will be used to create URLs based on that route name, only, when something (browser, curl...) hit the URL the only ways to differentiate them is by
1) URL
2) URL parameters (which is basically number 1 plus parameters)
3) Method (GET, POST)
So you could change them to something like:
Route::post('gestionAdministrador/loguearse', array('as' => 'Loguearse', 'uses' => 'AdministradorController#Login'));
Route::post('gestionAdministrador/registrar', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController#RegistrarAdministrador'));
EDIT 2
What you really need to understand is that the name you give to a route ('as' => 'name') will not be part of your url, so this is not something that Laravel can use to differentiate your two URls, this is for internal use only, to identify your routes during the creation of URLs. So, those instructions:
$loguearse = URL::route('Loguearse');
$registrar = URL::route('RegistrarAdministrador');
Would generate exactly the same URL:
http://yourserver.dev/gestionAdministrador
EDIT 1 - TO ANSWER A COMMENT
Redirecting in Laravel is easy, in your controller, after processing your form, in any of your methods you can just:
return Redirect::to('/');
or
return Redirect::route('home');
Having a route like this one:
Route::get('/', array('as' => 'home', 'uses' => 'HomeController#index'));
So, your controller would look like this:
class AdministradorController extends Controller {
public function RegistrarAdministrador()
{
...
return Redirect::route('home');
}
public function Login()
{
...
return Redirect::route('home');
}
}
Actually you have only one route in your route collection, because:
You have following routes declared:
Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController#Login'));
Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController#RegistrarAdministrador'));
Both of these used post method and this is post method:
public function post($uri, $action)
{
return $this->addRoute('POST', $uri, $action);
}
It calls addRoute and here it is:
protected function addRoute($methods, $uri, $action)
{
return $this->routes->add($this->createRoute($methods, $uri, $action));
}
Here $this->routes->add means Illuminate\Routing\RouteCollection::add() and the add() method calls addToCollections() and it is as follows:
protected function addToCollections($route)
{
foreach ($route->methods() as $method)
{
$this->routes[$method][$route->domain().$route->getUri()] = $route;
}
$this->allRoutes[$method.$route->domain().$route->getUri()] = $route;
}
The $routes is an array (protected $routes = array();) and it's obvious that routes are grouped by methods (GET/POST etc) and in each method only one unique URL could be available because it's something like this:
$routes['post']['someUrl'] = 'a route';
$routes['post']['someUrl'] = 'a route';
So, in your case, the last one is replacing the first one and in this case you may use different methods to declare two routes using same URL so it would be in different array, something like this:
$routes['post']['someUrl'] = 'a route';
$routes['put']['someUrl'] = 'a route'; // Route::put(...)
There must be a way to go to the same url from two different forms
Yes, there is a way and it's simply that you have to use the same route as the action of your form and therefore, you don't need to declare it twice.
What you want to do is a bad idea, you shouldn't be logging in and registering from the same route. With that said what you are saying isn't really possible. Routing in Laravel is first come first served. Basically it checks the route until the URI matches one and then calls that method on the controller or executes the callback. Your routes have to be the other way in your routes file. This will be fixed by changing the url.