首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel 8控制器的实现途径

Laravel 8控制器的实现途径
EN

Stack Overflow用户
提问于 2020-10-03 17:39:18
回答 2查看 23.8K关注 0票数 8

我正在使用Laravel 8,当我编写到__invoke控制器的路由时,如下所示:

代码语言:javascript
运行
复制
use App\Http\Controllers\PortfolioController;

Route::get('/portfolio', 'PortfolioController')->name('portfolio');

它显示了这个错误:

无效路由操作: PortfolioController。PortfolioController是不可调用的

所以它只能这样工作:

代码语言:javascript
运行
复制
Route::get('/portfolio', [PortfolioController::class, '__invoke'])->name('portfolio');;

这对我来说没有意义,因为它应该找到__invoke,这是PortfolioController.php中唯一的一个

代码语言:javascript
运行
复制
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PortfolioController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {

      $portfolio = [

      ['title' => 'Project #1'],
      ['title' => 'Project #2'],
      ['title' => 'Project #3'],
      ['title' => 'Project #4'],

      ];

      return view('portfolio',compact('portfolio'));
    }
}

Laravel 8是否忽略了__invoke属性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-03 20:45:50

TL;DR

照这样做:

代码语言:javascript
运行
复制
use App\Http\Controllers\PortfolioController;

Route::get('/portfolio', PortfolioController::class)->name('portfolio');
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^

解释

在Laravel 8之前,路线都是用RouteServiceProvider.php命名的

代码语言:javascript
运行
复制
protected $namespace = 'App\Http\Controllers';

// ...

protected function mapWebRoutes()
{
    Route::middleware('web')
        ->namespace($this->namespace) // <----
        ->group(base_path('routes/web.php'));
}

因此,当您定义路由时,如您的示例中所示:

代码语言:javascript
运行
复制
Route::get('/portfolio', 'PortfolioController')->name('portfolio');
                         ^^^^^^^^^^^^^^^^^^^^^

PortfolioController字符串使用App\Http\Controllers命名空间。

然而,自Laravel 8以来,这种行为已被改变。来自v8发行说明

在Laravel8.x中,默认情况下此属性为null。这意味着Laravel不会自动进行名称空间前缀。因此,在新的Laravel 8.x应用程序中,应该使用标准PHP可调用语法定义控制器路由定义: 使用App\Http\Controller\UserController;路由::get(‘/ use’,UserController::class,'index');

现在,对于您提到的特殊情况,__invoke()方法,这是您应该如何处理它们的根据医生的说法

在为单个动作控制器注册路由时,不需要指定方法: 使用App\Http\Controller\ShowProfile;路由::get(‘user/{id}’,ShowProfile::class);

票数 22
EN

Stack Overflow用户

发布于 2020-10-04 23:14:30

另一个用途,您可以使用完整的路径。

代码语言:javascript
运行
复制
Route::get('/portfolio', 'App\Http\Controllers\PortfolioController')->name('portfolio');

或者调用特定的方法

代码语言:javascript
运行
复制
Route::get('/portfolio', 'App\Http\Controllers\PortfolioController@foo')->name('portfolio')
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64187141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档