نور
نور

Reputation: 1527

How will I identify resource default url in laravel?

I am running this command for model, migration, resource controller.

`php artisan make:model QuestionAnswer -mc -r` ..

Laravel give me in Resource Controller

public function show(QuestionAnswer $questionAnswer) {
        // return $questionAnswer;
 }
public function edit(QuestionAnswer $questionAnswer) {
    // return $questionAnswer;
}
public function update(Request $request, QuestionAnswer $questionAnswer){
  // return $questionAnswer;
}

if I write in web.php
Route::resource('question-answer','QuestionAnswerController'); or Route::resource('questionAnswer','QuestionAnswerController'); or Route::resource('question_answer','QuestionAnswerController'); laravel resolve route model binding... that means....

Example as a

public function edit(QuestionAnswer $questionAnswer)
    {
        return $questionAnswer;  
    }

$questionAnswer return object for this url {{route('admin.question-answer.edit',$questionAnswer->id)}}

but if I write in web.php Route::resource('faq','QuestionAnswerController'); laravel can not resolve route model binding...

that means.. $questionAnswer return null for this url {{route('admin.faq.edit',$questionAnswer->id)}}

also in show and update function $questionAnswer; return null...

for working as a faq url.. i need change in edit function variable($faq) . or Route::resource('faq','QuestionAnswerController')->parameters(['faq' => 'questionAnswer']);I

But These three url questionAnswer,question-answer,question_answer by default work...

I check it on "laravel/framework": "^6.0" (LTS)

Question

is there possible way to find out what exact url I will write ? .. like question-answer.. or is there any command line ...

after running auth command .. php artisan route:list command give us all route list.. and when I make model Category laravel create table name categories and follow grammar rules

Upvotes: -2

Views: 1082

Answers (3)

Donkarnash
Donkarnash

Reputation: 12835

How will I know I need to write question-answer this ? by default it works... when i write faq i need to change in edit function variable($faq) .

How will I know by default url (question-answer) will work ..when php artisan route:list command give us all route list.. and when I make model Category laravel create table name categories and follow grammar rules

think about i will create 20 model ,migration & controller by cmd... i will not change edit,show and update function variable ...how i will know the default url for 20 model and controller ? Laravel is an opinionated framework. It follows certain conventions

Let us understand a route parts

Route::match(
    ['PUT', 'PATCH'], 
    '/question-answer/{questionAnswer}',
    [QuestionAnswerController::class, 'update']
)->name('question-answers.update')

In the above route:

1st argument: ['PUT', 'PATCH'] are the methods which the route will try to match for an incoming request

2nd argument: '/question-answer/{questionAnswer}' is the url wherein

/question-answer is say the resource name and

{questionAnswer} is the route parameter name

3rd argument: [QuestionAnswerController::class, 'update'] is the controller and the action/method which will be responsible to handle the request and provide a response

When you create a model via terminal using

php artisan make:model QuestionAnswer -mc -r

It will create a resource controller for the 7 restful actions and take the method parameter name for show, edit, update and delete routes as camel case of the model name i.e. $questionAnswer

class QuestionAnswerController extends Controller
{
    public function show(QuestionAnswer $questionAnswer){}

    public function edit(QuestionAnswer $questionAnswer){}

    public function update(Request $request, QuestionAnswer $questionAnswer){}

    public function delete(QuestionAnswer $questionAnswer){}
}

Which means if you don't intend to change the parameter name in the controller methods then you can define the routes as below to get the benefit of implicit route model binding

//Will generate routes with resource name as questionAnswer
//It would not be considered a good practice

Route::resource('questionAnswer', QuestionAnswerController::class);

//OR

Route::resource('question-answer', QuestionAnswerController::class)->parameters([
    'question-answer' => 'questionAnswer'
]);

//OR

Route::resource('foo-bar', QuestionAnswerController::class)->parameters([
    'foo-bar' => 'questionAnswer'
]);

RFC 3986 defines URLs as case-sensitive for different parts of the URL. Since URLs are case sensitive, keeping it low-key (lower cased) is always safe and considered a good standard.

As you can see, you can name the url resource anything like foo-bar or question-answer instead of questionAnswer and yet keep the route parameter name as questionAnswer to match the Laravel convention when generating controller via php artisan make:model QuestionAnswer -mc -r and without having to change the parameter name in controller methods.

Laravel is an opinionated framework which follows certain conventions:

  • Route parameter name ('questionAnswer') must match the parameter name in controller methods ($questionAnswer) for implicit route model binding to work

  • Controller generated via artisan commands, have parameter name as camelCase of the model name

  • Routes generated via Route::resource('posts', PostController::class) creates routes with resource name equal to the first argument of the method and route parameter name as the singular of the first argument

  • Route::resource() provides flexibility to use a different name for route resource name and route parameter name

Read more at Laravel docs:

If you want to know how the php artisan make:model works you can study the code in vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php and have a look at the various stubs these commands use to generate the files.

For almost all artisan commands you will find the class files with code in

vendor/laravel/framework/src/Illuminate/Foundation/Console and the stubs used by the commands to generate files in vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs folder.

If you study these command classes properly then you will get an idea of the various conventions Laravel follows when generating files via the artisan commands

Upvotes: 1

Abilogos
Abilogos

Reputation: 5010

Actually Laravel has got Naming Convection Rules In its core.

These Convictions make it to default binding database_tables to model, model to controllers ....

if you want, you can tell your custom parameters but if you dont, The Laravel uses its own default and searching for them.

for example: if you have a model named bar, laravel look for a table named plural bars . and if you dont want this behave, you can change this default by overriding the *Models* $table_name` attribute for your custom parameter.

There are some Name Convection Rules Like :

  • tables are plural and models are singular : its not always adding s (es) in trailing. sometimes it acts more complicate. like : model:person -> table: people

  • pivot table name are seperate with underline and should be alphabetic order: pivot between fooes and bars table should be bar_foo (not foo_bar)

  • table primary key for Eloquent find or other related fucntion suppose to be singular_name_id : for people table : person_id

  • if there are two-words name in model attribute, all of these are Alias : oneTwo === one_two == one-two

check this out:

class Example extends Model{

 public function getFooBarAttribute(){
    return "hello";
}
}

all of this return "hello" :

 $example = new Example();
 $example->foo_bar();
 $example->fooBar();
 // $example->foo-bar() is not working because - could be result of lexical minus

there is a page listing laravel naming conventions :

https://webdevetc.com/blog/laravel-naming-conventions/

Name Conventions : is The Language Between The Laravel and Developer it made it easy to not to explicitly mention everything like Natural Language we can eliminate when we think its obvious. or we can mention if its not (like ->parameter(...)).

Upvotes: 1

Masoud
Masoud

Reputation: 1245

I think its becuse of dependency injection which you used in youre method.

Try this

public function edit($id)
    {
        // return $questionAnswer;
        return view('backend.faq.edit',get_defined_vars());
    }

Upvotes: -2

Related Questions