How can I organise classes in a Laravel 5 Project?

2019-06-10 02:27发布

问题:

I am working on a Task Management App. In App there is a User Model and there is Project and Task models.

In order for user to add a Project and related Task, all I would do at Model Level is:

class Project extends Model
{
    public function add($user_id,$task_details)
    {
        //Add Project Meta
        $this->title = "Project Title";
        $this->description "Desc"
        $this->save()

        for($t=0;$t<count($task_details);$t++) {
        //Add Task Details
        $task = new Task();
        $task->title = $task_details["title"];
        $task->description = $task_details["description"];
        $task->save();
        }
    }
}

It looks clumsy to me. How can I improve this in Laravel 5? How can I make my modules more atomic?

回答1:

Yeah it is clumsy. You should use Repository pattern so that there is no such type of multiple responsibilities. And Eloquent already has a create method like findorCreate or just create method. Here is simple example for UserRepository.

//UserRepository
<?php namespace App\Repository\User;
use App\User;


class UserRepository{
   public $model;
   public function __construct(User $userModel) // type hinting the User Model
   {
     $this->model=$userModel;
   }
   public function create($inputs)
   { 
      return $this->model->create($inputs);
   }

}


// UserController

<?php namespace App\Http\Controllers;
use \App\Repository\User\UserRepository;
class UserController extends Controller{

   public $userRepo;

   public function __construct(UserRepository $userRepository) //type hinting the userRepository Class
   {
      $this->userRepo=$userRepository;
   }

   public function getUser($id)
   {
      return $this->userRepo->model->findorfail($id);
   }
   public function getCreate()
   {
      if($this->userRepo->create(Input::all())
        return view('success');
      return Redirect->back()->withErrors();
   }
}