Laravel面向对象

时间:2016-02-08 11:33:59

标签: php oop laravel object

我对OOP有点新手,虽然我对接口和抽象类有所了解。我有很多资源控制器在更大的方案中有点类似,它们看起来像下面的例子,唯一的主要区别是索引和我传递给索引视图的内容。

我只需要知道的是,我可以使用我的资源控制器进行一些操作吗?例如,创建一个“主”资源控制器,我只需使用接口传递正确的实例?我试过玩这个但是我得到一个错误,界面不可实例化,所以我不得不绑定它。但这意味着我只能将接口绑定到特定的控制器。

任何建议,提示和指示都会帮助我:)

class NotesController extends Controller
{
    public function index()
    {
        $notes = Note::all();

        return view('notes.index', compact('notes'));
    }

    public function create()
    {
        return view('notes.create');
    }

    public function show(Note $note)
    {
        return view('notes.show', compact('note'));
    }

    public function edit(Note $note)
    {
        return view('notes.edit', compact('note'));
    }

    public function store(Request $request, User $user)
    {
        $user->getNotes()->create($request->all());

        flash()->success('The note has been stored in the database.', 'Note created.');

        return Redirect::route('notes.index');
    }

    public function update(Note $note, Request $request)
    {
        $note->update($request->all());

        flash()->success('The note has been successfully edited.', 'Note edited.');

        return Redirect::route('notes.index');
    }

    public function delete($slug)
    {
        Note::where('slug', '=', $slug)->delete();

        return Redirect::to('notes');
    }
}

2 个答案:

答案 0 :(得分:1)

注意:完全是我的意见!

我会告诉他们你是如何拥有它们的。它使以后更容易阅读和理解。当您需要更新一个以执行与其他操作不同的操作时,也可以节省您的时间。我们在我参与的一个项目中试过这个,虽然它没有被认为是最好的实现,但直到今天仍然是一个痛点。

尽管如此。我确信人们以他们喜爱和工作的方式做到了这一点。根据我的经验,情况并非如此。我怀疑有人会看你的代码并批评你没有这样做。

答案 1 :(得分:1)

如果您需要绑定不同的模型实例,那么您可以使用Contextual Binding,例如,将以下代码放在AppServiceProvider' register()方法中:

$this->app->when('App\Http\Controllers\MainController')
        ->needs('Illuminate\Database\Eloquent\Model')
        ->give(function () {
            $path = $this->app->request->path();
            $resource = trim($path, '/');
            if($pos = strpos($path, '/')) {
                $resource = substr($path, 0, $pos);
            }
            $modelName = studly_case(str_singular($resource));
            return app('App\\'.$modelName); // return the appropriate model

    });

在您的控制器中,使用__construct方法注入模型,如下所示:

// Put the following at top of the class: use Illuminate\Database\Eloquent\Model;

public function __construct(Model $model)
{
    $this->model = $model;
}

然后你可以使用这样的东西:

public function index()
{
    // Extract this code in a separate method
    $array = explode('\\', get_class($this->model));
    $view = strtolower(end($array));

    // Load the result
    $result = $this->model->all();
    return view($view.'.index', compact('result'));
}

希望你有了这个想法,所以实现其余的方法。