【问题标题】:Laravel Object OrientedLaravel 面向对象
【发布时间】:2016-02-08 11:33:58
【问题描述】:

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

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

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

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');
    }
}

【问题讨论】:

  • 你应该在这里使用命名空间。
  • 我留下了所有的命名空间并包括在内,因为这与这个问题无关 imo :)
  • 我没有这个问题,我通过绑定解决了这个问题,这不是我在这里要问的。
  • 好的。现在我收到你的问题了。我专注于你写的错误:)

标签: php oop laravel object


【解决方案1】:

注意:完全是我的意见!

我会按照你拥有它们的方式保留它们。它使它们以后更容易阅读和理解。当您需要更新一个以做与其他人不同的事情时,也可以节省您的时间。我们在我参与的一个项目中尝试了这一点,虽然这不是最好的实现,但直到今天它仍然是一个痛点。

不过,由你决定。我敢肯定,人们已经以他们喜欢的方式做到了这一点,而且效果很好。根据我的经验,情况并非如此。我怀疑有人会看你的代码并批评你没有这样做。

【讨论】:

  • 是的,这只是为了我的个人项目,我只是在学习,但我打算自己使用这个项目:) 只是想知道,因为我已经有 15 个控制器,它们基本上做同样的事情,并且还会有更多。但是,嘿,如果这是一个好方法,那就没关系了。
  • 如果您使用所有资源控制器,那么我认为这不是一个坏方法。
【解决方案2】:

如果你需要绑定不同的Model实例,那么你可以使用Contextual Binding,例如在AppServiceProvider's 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'));
}

希望你明白了,所以实现其余的方法。

【讨论】:

  • 太棒了,“上下文绑定”,今天学到了新东西,谢谢 :)
猜你喜欢
  • 2016-07-08
  • 1970-01-01
  • 2015-04-28
  • 2014-08-25
  • 2018-06-12
  • 2010-10-22
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多