Est-ce que le groupage de route de départ avec namespace() n'est pas autorisé dans Laravel 5.4?

en utilisant Laravel 5.4, en effet dans la documentation sur le regroupement des routes, et un exemple comme ceci a été donné à propos de namespacing:

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

ceci selon le doc est correct, mais après avoir installé Laravel 5.4.30 j'ai découvert que faire ce qui précède envoie l'erreur suivante:

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

même si j'ai fait une solution de contournement en utilisant d'autres méthodes de route avant elle telles que:

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

Pourtant est-ce un bug dans Laravel ou quelque chose que je ne soupçonnais pas est le problème dans mon code?.

Si il est nécessaire de fournir plus d'explications, alors je suis heureux de le faire.

enter image description here

mise à jour: comme @Adweb l'a suggéré, cela peut être fait en utilisant group(['namespace' => 'Admin'])... mais je suis vraiment encore vif sur quel pourrait être le problème basé sur de l'erreur que j'ai obtenu.

voici ma version 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
11
demandé sur Oluwatobi Samuel Omisakin 2017-08-09 16:41:37

5 réponses

en bref, C'est un problème de PHP, et une chose pas bien documentée de Laravel (cela ne peut fonctionner qu'en PHP 7 mais pas 5.x). Ce n'est pas un problème de votre côté, si vous détendre~


à partir de PHP 5.3, namespace est ajouté et ne peut donc pas être utilisé comme nom de fonction.

Selon http://docs.php.net/manual/en/migration53.incompatible.php:

Les mots clés suivants sont maintenant réservés et ne peuvent être utilisés dans fonction, classe, etc. nom.

  • goto
  • namespace

pour plus d'informations concernant le mot-clé to namespace en PHP, veuillez jeter un oeil à http://php.net/manual/en/language.namespaces.nsconstants.php.

(comme pour pourquoi Route::prefix('')->namespace('Admin') fonctionne, il est probablement un problème de L'analyseur PHP, mais en général PHP 5.x n'est pas conçu pour supporter ce genre de nom de méthode)


le code fonctionne réellement bien que depuis PHP 7. Selon http://php.net/manual/en/reserved.keywords.php:

ces mots ont un sens particulier dans PHP. Certains d'entre eux représentent des choses qui ressemblent à des fonctions, certains ressemblent à des constantes, et ainsi de suite - mais ils ne le sont pas vraiment: ce sont des constructions linguistiques. Vous ne pouvez pas utiliser des mots suivants comme constantes, noms de classe, fonction ou méthode nom. Les utiliser comme noms de variables est généralement OK, mais pourrait conduire à confusion.

à partir de PHP 7.0.0 ces mots-clés sont autorisés comme propriété, constante, et les noms de méthode des classes, interfaces et traits, sauf que la classe peut pas être utilisé comme nom de constante.

namespace est l'un de ces mots clés. En commençant par PHP 7, ils pourraient être utilisés comme noms de méthode. Donc, si vous voulez vraiment utiliser cette méthode de Laravel, vous devez mettre à jour à PHP 7.

Ou, vous pouvez utiliser d'autres méthodes pour utiliser cette fonction sans utiliser l'espace de noms méthode, comme mentionné dans votre question et d'autres réponses.

J'espère que cela résoudra vos préoccupations. ^_^

6
répondu adamyi 2017-08-14 04:58:24

je pense que vous pouvez essayer ceci:

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

});

espérons que cela fonctionne pour vous !!!

4
répondu AddWeb Solution Pvt Ltd 2017-08-09 13:45:34
Route::group([ 'prefix' => 'admin','namespace' => 'Admin','middleware' =>'admin'], function () {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
});
2
répondu Kuldeep Mishra 2017-08-09 14:25:10

en fait, ce nom Route::espace de noms() nous sommes à l'aide de ce

Ex: quand vous avez le contrôleur en Admin dossier (App\Http \ Controllers\Admin;) vous pouvez l'utiliser comme ceci

Route::namespace('Admin')->group(function () {
    Route::get('/home', 'HomeController@index');
}); 

donc si vous n'utilisez pas namespace ensuite, vous devez utiliser comme ceci

Route::get('/home', 'Admin\HomeController@index');

mais assurez-vous que dans votre HomeController en haut vous devez changer namespace comme ceci

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

j'ai vérifié avec Laravel 5.4.3 Serveur XAMPP PHP -7.0:)

2
répondu Hamelraj 2017-08-12 16:06:18

Le problème est que Illuminate\Routing\Routerne pasnamespace() fonction.

pour appliquer namespace aux routes, utilisez group():

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

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

});

je ne sais pas pourquoi docsnamespace() et group() couramment. Mais clairement namespace() n'est pas dans le code pour tout ce que je sais maintenant.

référence:https://laravel.com/api/5.4/Illuminate/Routing/Router.html.

-1
répondu doncadavona 2017-08-14 14:22:58