45 votes

Utilisation des espaces de noms dans Laravel 4

Je suis novice en matière de Laravel et d'utilisation des espaces de noms PHP en général. Je n'ai rencontré aucun problème jusqu'à ce que je décide de créer un modèle nommé File. Comment dois-je procéder pour utiliser correctement les espaces de noms afin de pouvoir utiliser ma classe de modèle File ?

Les fichiers sont app/controllers/FilesController.php y app/models/File.php . J'essaie de faire un nouveau File en FilesController.php .

92voto

Josh Holloway Points 1036

L'attribution d'un nom est assez facile une fois que vous l'avez compris.

Prenons l'exemple suivant :

app/models/File.php

namespace App\Models;

class File {

    public function someMethodThatGetsFiles()
    {

    }
}

app/controllers/FileController.php

namespace App\Controllers;

use App\Models\File;

class FileController {

    public function someMethod()
    {

        $file = new File();
    }
}

Déclarer le Namespace :

namespace App\Controllers;

Rappelez-vous, une fois que vous avez placé une classe dans un espace de nom, pour accéder aux classes intégrées à PHP, vous devez les appeler depuis l'espace de nom racine : $stdClass = new stdClass(); deviendra $stdClass = new \stdClass(); (voir le \ )

"Importer" d'autres espaces de noms :

use App\Models\File;

Cela vous permet ensuite d'utiliser le File sans le préfixe Namespace.

Vous pouvez également appeler :

$file = new App\Models\File();

Mais la meilleure pratique consiste à le mettre en haut de la page dans un fichier use car vous pouvez alors voir toutes les dépendances du fichier sans avoir à analyser le code.

Une fois que c'est fait, vous devez exécuter composer dump-autoload pour mettre à jour la fonction de chargement automatique de Composer afin de prendre en compte vos classes nouvellement ajoutées.

N'oubliez pas que si vous souhaitez accéder au FileController via une URL, vous devez définir une route et spécifier l'espace de nom complet comme suit :

Route::get('file', 'App\\Controllers\\FileController@someMethod');

Ce qui dirigera toutes les requêtes GET/fichier vers l'interface du contrôleur. someMethod()

Consultez la documentation PHP sur Espaces de noms et Nettut's est toujours une bonne ressource avec este article

1 votes

@JoshHollowway si FileController étend BaseController cela échouerait avec l'erreur de BaseController non trouvé, comment contournez-vous cela ?

1 votes

Vous devrez faire référence à BaseController dans l'espace de noms Root avec une référence comme celle-ci : \BaseController

3 votes

Je suis la procédure ci-dessus, mais à la fin je reçois l'erreur : La classe 'App \Controllers\BaseController non trouvé . après avoir fait \BaseController Je reçois l'erreur : La classe FileController n'existe pas. J'ai aussi fait le dump-autoload du compositeur.

4voto

Pierre Broucz Points 489

D'abord, chargez votre classe avec :

$ composer dump-autoload

puis

$file = new File;

// your stuff like:
$file->name = 'thename';
$file->active = true;

$file->save();

Section : Insérer, mettre à jour, supprimer sur Laravel 4 doc d'Eloquent

2voto

Pour définir l'espace de nom de votre modèle, au sommet de votre classe de modèle, juste après l'ouverture

Ensuite, lorsque vous appellerez depuis les contrôleurs, vous appellerez le nouveau Whatever. \Model ;

Vous devez probablement faire un dump-autoload avec le compositeur la première fois.

0voto

Muhammad Saeed Points 79

Jetez-y un coup d'œil. J'espère que cela vous aidera à résoudre vos problèmes. ....

<?php

 namespace app\controllers;
 use yii\web\Controller;
 use app\models\users;
  class UserController extends Controller{
 public function actionIndex()
 {
echo "working on .....";
}
}

0voto

Eric McWinNEr Points 446

Les espaces de noms sont définis au sommet des classes PHP juste après la balise d'ouverture php script comme ceci :

 <?php
   namespace MyNameSpace;

Lorsque vous souhaitez ensuite utiliser la classe namespaced dans une autre classe, vous la définissez comme suit :

new MyNameSpace\PhpClass;

ou l'importer en haut du fichier (après les espaces de noms s'ils sont présents) comme ceci :

 <?php

   //namespace

   use MyNameSpace\MyPHPClass;

   //then later on the code you can instantiate the class normally
   $myphpclass = new MyPHPClass();

Dans Laravel, les espaces de noms peuvent être définis partout où le compositeur peut les charger automatiquement. Je recommande de définir les espaces de noms dans le répertoire de l'application. Ainsi, vous pouvez définir un espace de nom tel que Utils pour contenir les classes utilitaires en créant un répertoire Utils dans le répertoire app, en créant nos classes utilitaires et en définissant l'espace de nom comme nous l'avons fait ci-dessus.

Ensuite, vous avez exécuté la commande pour demander au compositeur d'autoloader les classes :

 $ composer dump-autoload

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X