I am not using Eloquent ORM
for Laravel 4 and willing to bind my Model with Edit Form using model binding
. My code is given below:
Routes.php
Route::get('/', 'HomeController@index');
Route::get('exchanges', 'Exchange@index');
//Route::get('details/{exchangeID}', 'Exchange@details');
//add question to make the parameter option
Route::get('details/{exchangeID?}', function($exchangeID = 0)
{
return App::make('Exchange')->details($exchangeID);
});
//Admin Dashboard
Route::get('admin', 'Exchange@dashboard');
//Route::get('admin/exchange/edit/{exchangeID?}', function($exchangeID = 0)
//{
// return App::make('Exchange')->edit($exchangeID);
//});
Route::model('exchange', 'ExchangeModel');
Route::get('admin/exchange/edit/{exchange}', array('uses' => 'Exchange@edit', 'as' => 'exchange.edit'));
Controller Method
public function edit(ExchangeModel $exchange)
{
return View::make('exchangeedit')->with('exchange', $exchange);
VIew
{{ Form::model($exchange, array('route' => array('exchange.edit', $exchange->id))) }}
{{ Form::close() }}
Model
public static function all()
{
return DB::select('select * from Exchanges');
}
However When I visit: http://localhost/path/site/public/admin/exchange/edit/4
It considers it a 404 and redirects to a 404 page. Where am I going wrong?
The 404 error is being generated by your Route model binding Route::model()
. If you are not using Eloquent, route model binding won't function as expected without additional work (mainly making sure your desired class has a find()
method, which will return the record you need).
You do not need to use route model binding in order to use Form model binding. These are two different features, neither of which depend on the either.
Form model binding does NOT require an Eloquent model instance. It can be any array or object with the correct properties / keys. Here's an excerpt from Illuminate\Html\FormBuilder.php
that is responsible for finding a model attribute:
protected function getModelValueAttribute($name)
{
if (is_object($this->model))
{
return object_get($this->model, $this->transformKey($name));
}
elseif (is_array($this->model))
{
return array_get($this->model, $this->transformKey($name));
}
}
object_get()
and array_get()
are Laravel helper functions, if you want to look into them further.
So you do not need an Eloquent model to use form model binding, but you will probably want to use it when using route model binding. :)
No, you can't use a model binding without Eloquent ORM
because in Route::model()
method there is something like this
if ($model = with(new $class)->find($value))
{
return $model;
}
So, when you use following code to bind a model
Route::model('exchange', 'ExchangeModel');
The model
method of the router
class does something like this
$model = new $class; // Here $class is your ExchangeModel
$model->find(($value) // The id passed to the url {exchange}
if($model) return $model;
So, when you are not extending the Eloquent ORM
in your model there is no such method like find
is available because Eloquent
is an alias of Illuminate\Database\Eloquent\Model
class and find
method belongs to this Model
class.
Update : As an alternative, you may try something like this. Add a find
method in your model like this
class Exchange {
public static function find($id)
{
$user = DB::table('users')->where('id', $id)->get();
if($user) {
$user = new \Illuminate\Database\Eloquent\Collection($user);
return $user->first();
}
return false; // or not found exception
}
}
This way, you can still use Form::model()
in your form. If you don't want use static
method you can change it but can't use ::
method call.
BTW, you may also use something like this (can manually pass the model to the form)
public function edit($id)
{
// Manually load the model and pass to view
$exchange = Exchange::find($id);
return View::make('exchangeedit')->with('exchange', $exchange);
}
So, in this case your route should be normally (without model binding)
Route::get('admin/exchange/edit/{exchange}', ['uses' => 'Exchange@edit', 'as' => 'exchange.edit']);