2017-08-09 44 views
9

使用Laravel 5.4,約路由分組的文件確實是在和一個例子,因爲這給出約namespacing在Laravel 5.4中不允許使用命名空間()啓動路由分組嗎?

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中的一個錯誤還是我沒有懷疑的是我的代碼中的問題?

If there is a need to provide more explanations, then I am glad to do that.

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 
+1

我剛剛安裝了一個新版本的Laravel(5.4.32,也降級到5.4.30)並添加了您描述的第一條路線到我的路線。 'PHP工匠服務'拋出沒有錯誤,我錯過了什麼? – mimo

+0

@mimo事實上,你所說的是通過其中一個答案再次證明的。我現在懷疑我的PHP版本5.6.30,因爲文檔說'> = 5.6.4'我必須檢查這個。 –

+1

這可能是,我用php 7 – mimo

回答

6

簡而言之,這是一個PHP問題,並且Laravel沒有很好的記錄(這隻能在PHP 7中工作,而不能在5.x中工作)。這不是你的問題,所以放鬆〜


開始PHP 5。3,名稱空間被添加,因此不能用作函數名稱。

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

The following keywords are now reserved and may not be used in function, class, etc. names.

  • goto
  • namespace

有關在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

These words have special meaning in PHP. Some of them represent things which look like functions, some look like constants, and so on - but they're not, really: they are language constructs. You cannot use any of the following words as constants, class names, function or method names. Using them as variable names is generally OK, but could lead to confusion.

As of PHP 7.0.0 these keywords are allowed as property, constant, and method names of classes, interfaces and traits, except that class may not be used as constant name.

namespace是其中一個關鍵字。從PHP 7開始,它們可以用作方法名稱。因此,如果您真的想使用Laravel的這種方法,您需要升級到PHP 7.

或者,您可以使用其他方式使用此功能,而不使用名稱空間方法,如問題和其他答案中所述。

希望這可以解決您的疑慮。^_^

+0

這個答案講述了很多關於這個問題,我希望Laravel在這個意義上說清楚。儘管如此我還是無法在PHP 5.6.4及更高版本上測試這個問題(因爲有些困難我會這樣做),以便看到實際的區別,但答案有足夠的證據來證明我需要至少知道故障來自何處。 –

+0

另外至少它可以在php7上使用L5來確認答案的正確性。有一個很好的教訓,可以在跳入任何框架之前詳細閱讀有關需求的文檔。感謝您的研究。 –

+0

@adamyi可悲的是,我錯誤地獎賞了另一個*答案*而不注意對話框確認警告:( –

2

我想你可以試試這個:

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

}); 

希望這對你的工作!

+0

感謝您的回答,真的,我可以這樣做(我知道),但具體使用問題中的方法。如果您在新項目上遇到類似問題,您可以嘗試嗎? –

+0

@OmisakinOluwatobi很高興能幫到 –

+0

@OmisakinOluwatobi如果我的答案是你的解決方案,那麼請接受我的回答 –

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

其實這個名字路線::命名空間(),我們使用的是此

例如:當您在聯繫文件夾中有控制器(應用程序\ HTTP \控制器\聯繫;) 你可以使用這樣

Route::namespace('Admin')->group(function() { 
    Route::get('/home', '[email protected]'); 
}); 

因此,如果不使用命名空間的n您在頂部使用這樣

Route::get('/home', 'Admin\[email protected]'); 

但要確保在你的的HomeController必須更改名稱空間這樣

namespace App\Http\Controllers;namespace App\Http\Controllers\Admin;

我與Laravel 5.4檢查。 3服務器 - XAMPP PHP - 7.0 :)

+0

感謝您的回答。事實上,我確實按照你所說的檢查了這一點,發現我做得正確,但仍然是同樣的事情。我會在問題中更新我的PHP版本。 –

+0

它可能是我的PHP版本的問題?我檢查了Laravel doc for 5.4並且看到了'PHP> = 5.6.4'? –

+0

某些行有語法錯誤,所以最好刪除路由文件中的所有路由,只嘗試上面的路由 – Hamelraj

-1

問題是Illuminate\Routing\Router沒有 a 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

+0

確定你是正確的,以這種方式使用它將起作用並確實有效。我的問題是爲什麼文檔說它可以以這種方式使用,並從某些人使用該方法的反應(使用PHP 7)。所以我想相信它的PHP的問題有這些保留字,就像@adamyi說的。我必須驗證這與7.0的另一個項目也是如此。 –