我对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');
}
}
答案 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'));
}
希望你有了这个想法,所以实现其余的方法。