45

I'm new to Laravel and using PHP namespaces in general. I didn't run into any problems until I decided to make a model named File. How would I go about namespacing correctly so I can use my File model class?

The files are app/controllers/FilesController.php and app/models/File.php. I am trying to make a new File in FilesController.php.

5 Answers 5

92

Namespacing is pretty easy once you get that hang of it.

Take the following example:

app/models/File.php <?php

namespace App\Models;

class File {

    public function someMethodThatGetsFiles()
    {
    
    }
}

app/controllers/FileController.php <?php

namespace App\Controllers;

use App\Models\File;

class FileController {

    public function someMethod()
    {
    
        $file = new File();
    }
}

Declare the Namespace:

namespace App\Controllers;

Remember, once you've put a class in a Namespace to access any of PHP's built in classes you need to call them from the Root Namespace. e.g: $stdClass = new stdClass(); will become $stdClass = new \stdClass(); (see the \)

"Import" other Namespaces:

use App\Models\File;

This Allows you to then use the File class without the Namespace prefix.

Alternatively you can just call:

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

But it's best practice to put it at the top in a use statement as you can then see all the file's dependencies without having to scan the code.

Once that's done you need to them run composer dump-autoload to update Composer's autoload function to take into account your newly added Classes.

Remember, if you want to access the FileController via a URL then you'll need to define a route and specify the full namespace like so:

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

Which will direct all GET /file requests to the controller's someMethod()

Take a look at the PHP documentation on Namespaces and Nettut's is always a good resource with this article

Sign up to request clarification or add additional context in comments.

7 Comments

@JoshHollowway if having FileController extend BaseController this would fail with error of BaseController not found, how do you get around this?
You'll need to reference BaseController from the root namespace with a \ like this: \BaseController
i follow the above procedure, but in the end i get the error: Class 'App\Controllers\BaseController' not found . after making \BaseController i get the error: Class FileController does not exist . i also do composer dump-autoload
@JoshHolloway Any chance for an example that uses extends?
|
4

first, load your class with:

$ composer dump-autoload

then

$file = new File;

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

$file->save();

Section: Insert, Update, Delete on Laravel 4 Eloquent's doc

Comments

2

To namespace your model, at the top of your model class right after the opening

Then when you call from controllers you will call new Whatever\Model;

You probably have to do a dump-autoload with composer the first time around.

Comments

0

have a look to it.. hopefully will clear your query....

<?php

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

Comments

0

Namespaces are defined at the top of PHP classes right after the opening php script tag like this:

 <?php
   namespace MyNameSpace;

When you then want to use the namespaced class in some other class, you define it like this:

new MyNameSpace\PhpClass;

or import it at the top of the file (after namespaces if present) like this:

 <?php

   //namespace

   use MyNameSpace\MyPHPClass;

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

In Laravel namespaces can be defined anywhere composer can autoload them, I'd recommend defining namespaces within the app directory. So you can define a namespace like Utils for holding Utility classes by creating a Utils directory in the app directory, creating our utility classes and defining the namespace as we did above.

Afterwards you have run the command to ask composer to autoload classes:

 $ composer dump-autoload

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.