【问题标题】:How will I identify resource default url in laravel?我将如何识别 laravel 中的资源默认 url?
【发布时间】:2021-03-09 01:54:06
【问题描述】:

我正在为模型、迁移、资源控制器运行此命令。

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

Laravel 给我资源控制器

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

如果我写信 web.php
Route::resource('question-answer','QuestionAnswerController');Route::resource('questionAnswer','QuestionAnswerController');Route::resource('question_answer','QuestionAnswerController'); laravel 解析路由模型绑定... 这意味着......

示例

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

$questionAnswer 为这个 url 返回对象 {{route('admin.question-answer.edit',$questionAnswer->id)}}

但是如果我写web.php Route::resource('faq','QuestionAnswerController'); laravel 无法解析路由模型绑定...

这意味着.. $questionAnswer 为这个 url 返回 null {{route('admin.faq.edit',$questionAnswer->id)}}

同样在showupdate 函数$questionAnswer; 中返回null...

作为faq url 工作。我需要更改edit function 变量($faq)。或Route::resource('faq','QuestionAnswerController')->parameters(['faq' => 'questionAnswer']);I

但这三个网址questionAnswer,question-answer,question_answer默认工作...

我在“laravel/framework”上查看:“^6.0”(LTS)

问题

有没有办法找出我要写的确切网址? .. 像question-answer.. 或者有没有命令行...

在运行 auth 命令后 ..php artisan route:list 命令给我们所有的路由列表.. 当我创建模型时 Category laravel 创建表名 categories 并遵循语法规则

【问题讨论】:

  • 告诉我你admin.faq.edit的路线
  • @brombeer no .. 我会写什么确切的网址? .. 喜欢question-answer ,,,.
  • 这是两种情况..一种工作另一种不...
  • 这能回答你的问题吗? laravel resource url depend on model?
  • 我的回答你满意吗?

标签: laravel url cmd routes pretty-urls


【解决方案1】:

我认为这是因为您在方法中使用了依赖注入。

试试这个

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

【讨论】:

  • 我想……你没有理解我的问题
【解决方案2】:

我怎么知道我需要写这个问答?默认情况下它可以工作......当我编写常见问题解答时,我需要更改编辑函数变量($faq)。

我怎么知道默认的 url (question-answer) 会起作用 ..when php artisan route:list 命令给我们所有的路线列表.. 当我做 model 类别 laravel 创建表名类别并遵循语法 规则

想想我将通过 cmd 创建 20 个模型、迁移和控制器...我不会更改编辑、显示和更新函数变量...我如何知道 20 个模型和控制器的默认 url? Laravel 是一个自以为是的框架。它遵循某些约定

让我们了解一下路线部分

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

在上述路线中:

第一个参数:['PUT', 'PATCH'] 是路由将尝试匹配传入请求的方法

第二个参数:'/question-answer/{questionAnswer}' 是其中的网址

/question-answer 是说资源名称

{questionAnswer}路由参数名称

第三个参数:[QuestionAnswerController::class, 'update'] 是控制器和负责处理请求并提供响应的操作/方法

当您通过终端创建模型时使用

php artisan make:model QuestionAnswer -mc -r

它将为 7 个 restful 动作创建一个资源控制器,并将用于显示、编辑、更新和删除路由的方法参数名称作为模型名称的骆驼大小写,即 $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){}
}

这意味着如果您不打算更改控制器方法中的参数名称,那么您可以如下定义路由以获得隐式路由模型绑定的好处

//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 将 URL 定义为对 URL 的不同部分区分大小写。由于 URL 区分大小写,因此保持低调(小写)始终是安全的,并且被认为是一个很好的标准。

如您所见,您可以将 url 资源命名为 foo-barquestion-answer 而不是 questionAnswer,但在通过 @987654337 生成控制器时保持路由参数名称为 questionAnswer 以匹配 Laravel 约定@ 并且无需更改控制器方法中的参数名称。

Laravel 是一个遵循某些约定的固执己见的框架:

  • 路由参数名称 ('questionAnswer') 必须与控制器方法 ($questionAnswer) 中的参数名称匹配,才能使隐式路由模型绑定起作用

  • 通过工匠命令生成的控制器,参数名称为模型名称的驼峰式

  • 通过Route::resource('posts', PostController::class) 生成的路由创建资源名称等于方法的第一个参数和路由参数名称作为第一个参数的单数的路由

  • Route::resource() 可以灵活地为路由资源名称和路由参数名称使用不同的名称

在 Laravel 文档中阅读更多内容:

如果您想知道php artisan make:model 的工作原理,您可以研究vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php 中的代码并查看这些命令用于生成文件的各种存根。

对于几乎所有的 artisan 命令,您都可以在其中找到带有代码的类文件

vendor/laravel/framework/src/Illuminate/Foundation/Console 以及命令用来在vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs 文件夹中生成文件的存根。

如果你正确地研究了这些命令类,那么你就会了解 Laravel 在通过 artisan 命令生成文件时遵循的各种约定

【讨论】:

  • 我的问题是什么?
  • 您可以使用任何您喜欢的词来定义您的应用程序的 url。就像您可以将路线定义为/foo/{question}。让路由模型绑定工作的主要事情是控制器方法中的方法参数名称应该与您在路由声明中使用的路由参数的名称匹配
  • 当你使用Route::resource() 定义你的路由时,Laravel 遵循我上面所说的约定来定义路由。
  • @noor 我已经为你的两个场景更新了我的答案
  • 我附上一个问题链接..您的答案已经存在...请尝试理解我的问题..我在寻找什么
【解决方案3】:

实际上,Laravel 的核心是命名对流规则。

这些信念使其默认绑定 database_tables 到模型,模型到控制器 ....

如果你愿意,你可以告诉你的自定义参数,但如果你不这样做,Laravel 会使用它自己的默认值并搜索它们。

例如:如果你有一个名为 bar 的模型,laravel 会查找一个名为复数 bars 的表。如果您不希望这种行为,您可以通过覆盖自定义参数的 *Models* $table_name` 属性来更改此默认值。

有一些名称对流规则,例如:

  • 表格是复数,模型是单数:它并不总是在尾随添加 s (es)。 有时它的行为更复杂。喜欢:模型:人->表:人

  • pivot 表名称用下划线分开,并且应该按字母顺序排列:fooesbars 表之间的枢轴应该是 bar_foo(不是 foo_bar)

  • Eloquent 查找或其他相关功能的表主键假设为 single_name_id:对于人员表:person_id

  • 如果模型属性中有两个词的名称,则都是别名: oneTwo === one_two == 一二

看看这个:

class Example extends Model{

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

所有这些都返回"hello"

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

有一个页面列出 laravel 命名约定:

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

命名约定:是 Laravel 和开发者之间的语言 这使得 不明确提及所有内容变得容易 就像自然语言一样,当我们认为它显而易见时,我们可以消除。 或者我们可以提及,如果不是(如->parameter(...))。

【讨论】:

  • 我会在一个小时内回复并完成答案
  • 首先感谢您的回答...转到提供程序文件夹.. 然后RouteServiceProvider.php 然后use Illuminate\Routing\Router; .. 在Router.php 你会发现bindmodel 功能... 我想它将帮助您解决$example->foo-bar() 这个one-two url...
猜你喜欢
  • 1970-01-01
  • 2013-03-27
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2018-08-24
相关资源
最近更新 更多