是否在Laravel 5.4中不允许使用namespace()开始路由分组?

时间:2017-08-09 13:41:38

标签: php laravel laravel-5.4

使用Laravel 5.4,确实在关于路由分组的文档中,以及关于namespacing的示例:

Route::namespace('Admin')->group(function () {
   // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

这根据文档是可以的,但在安装Laravel 5.4.30之后我发现上面的操作会引发以下错误:

PHP Parse error:  syntax error, unexpected 'namespace' (T_NAMESPACE) in /Applications/MAMP/htdocs/my_app/routes/web.php on line

即使我之前使用其他路由方法做了一个解决方法,例如:

Route::prefix('')->namespace('Admin')->group(function () {
   // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

然而,这是Laravel中的一个错误还是我怀疑代码中存在的问题?

  

如果需要提供更多解释,那么我很乐意这样做。

enter image description here

更新:正如@Adweb建议的那样,可以使用group(['namespace' => 'Admin'])...来完成,但我仍然非常热衷基于我得到的错误会出现什么问题。

这是我的PHP版本:

PHP 5.6.30 (cli) (built: Mar 11 2017 09:56:27) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

4 个答案:

答案 0 :(得分:6)

简而言之,这是一个PHP问题,而且Laravel没有详细记录(这只能在PHP 7中工作,但不能在5.x中工作)。这不是你身边的问题,所以请放松〜

启动PHP 5.3,添加名称空间,因此不能用作函数名。

根据http://docs.php.net/manual/en/migration53.incompatible.php

  

以下关键字现已保留,可能无法使用   功能,类等名称。

     
      
  • 转到
  •   
  • 命名空间
  •   

有关PHP中命名空间关键字的更多信息,请查看http://php.net/manual/en/language.namespaces.nsconstants.php

(至于为什么Route::prefix('')->namespace('Admin')有效,它可能是PHP解析器的一个问题,但一般来说PHP 5.x的设计不支持这种方法命名)

自PHP 7起,代码实际运行良好。根据http://php.net/manual/en/reserved.keywords.php

  

这些词在PHP中具有特殊含义。其中一些代表了一些东西   看起来像函数,有些看起来像常量,等等 - 但是   他们不是,真的:他们是语言结构。你不能使用任何   以下单词作为常量,类名,函数或方法   名。使用它们作为变量名通常是可以的,但可能会导致   混乱。

     

从PHP 7.0.0开始,这些关键字被允许作为属性,常量和   类,接口和特征的方法名称,但类可以   不能用作常数名称。

命名空间是其中一个关键字。从PHP 7开始,它们可以用作方法名称。因此,如果你真的想使用这种Laravel方法,你需要升级到PHP 7。

或者,您可以使用其他方法来使用此功能,而无需使用命名空间方法,如问题和其他答案中所述。

希望这能解决您的疑虑。 ^ _ ^

答案 1 :(得分:5)

我想你可以试试这个:

Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () {

});

希望这对你有用!!!

答案 2 :(得分:3)

Route::group([ 'prefix' => 'admin','namespace' => 'Admin','middleware' =>'admin'], function () {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
});

答案 3 :(得分:0)

问题是Illuminate\Routing\Router 没有 namespace()功能。

要将名称空间应用于路线,请使用group()

Route::group(['namespace' => 'Admin'], function() {

  // Other routes under the Admin namespace here...

});

我不确定为什么docs会流利地使用namespace()group()。但很明显namespace()不在我所知道的所有代码中。

参考:https://laravel.com/api/5.4/Illuminate/Routing/Router.html