2016-02-29 63 views
0

我是一個使用laravel的新手,在將代碼從路由更改爲控制器後出現問題。Laravel 5.2調用未定義的方法Illuminate Database Query Builder :: activateTask()

當我將它們放置在routes.php中時,所有代碼都工作正常,但是當我將此代碼放入控制器Task.php中的函數並將函數函數添加到routes.php時,出現以下錯誤 - >

BadMethodCallException in Builder.php line 2161: Call to undefined method Illuminate\Database\Query\Builder::activateTask() 



in Builder.php line 2161 
at Builder->__call('activateTask', array(object(Task))) 
at call_user_func_array(array(object(Builder), 'activateTask'), array(object(Task))) in Builder.php line 1313 
at Builder->__call('activateTask', array(object(Task))) 
at call_user_func_array(array(object(Builder), 'activateTask'), array(object(Task))) in Model.php line 3490 
at Model->__call('activateTask', array(object(Task))) 
at call_user_func_array(array(object(Task), 'activateTask'), array(object(Task))) in Model.php line 3504 
at Model::__callStatic('activateTask', array(object(Task))) in routes.php line 45 
at RouteServiceProvider->{closure}(object(Task)) 
at call_user_func_array(object(Closure), array('task' => object(Task))) in Route.php line 158 
at Route->runCallable(object(Request)) in Route.php line 137 
at Route->run(object(Request)) in Router.php line 724 
at Router->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in VerifyCsrfToken.php line 64 
at VerifyCsrfToken->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(VerifyCsrfToken), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ShareErrorsFromSession.php line 49 
at ShareErrorsFromSession->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(ShareErrorsFromSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 62 
at StartSession->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(StartSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37 
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(AddQueuedCookiesToResponse), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59 
at EncryptCookies->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(EncryptCookies), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102 
at Pipeline->then(object(Closure)) in Router.php line 726 
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 699 
at Router->dispatchToRoute(object(Request)) in Router.php line 675 
at Router->dispatch(object(Request)) in Kernel.php line 246 
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44 
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102 
at Pipeline->then(object(Closure)) in Kernel.php line 132 
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99 
at Kernel->handle(object(Request)) in index.php line 53 
at require_once('D:\wamp64\organizer\public\index.php') in server.php line 21 

我的任務控制器Task.php - >

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use App\Http\Requests; 
use App\Http\Controllers\Controller; 

class Task extends Controller 
{ 
    // 

    public function activateTask($task) 
    { 
     if($task->active == 1) 
     { 
      return redirect('/'); 
     } 
     else 
     { 
      $task->active = 1; 
      $task->save(); 
      if(Session('active') != null) 
      { 
       $oldtask = App\Session::find(Session('active')); 
       $oldtask->Task->active = 0; 
       $oldtask->Task->save(); 
       $oldtask->touch(); 
       $oldtask->save(); 
      } 
      $session = new Session; 
      $session->task()->associate($task); 
      $session->save(); 
      Session(['active' => $session->id]); 
      return redirect('/'); 
     } 
    } 

    public function saveTask($request) { 

     $validator = Validator::make($request->all(), [ 
      'name' => 'required|max:255', 
     ]); 

     if($validator->fails()) { 
      return redirect('/')->withInput()->withErrors($validator); 
     } 

     $task = new Task; 
     $task->name = $request->name; 
     $task->deadline = $request->deadline; 
     $task->save(); 
    } 

} 

任務模型Task.php - >

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Task extends Model 
{ 
    // 
    public function sessions() 
    { 
     return $this->hasMany('App\Session'); 
    } 
} 

會話模型session.php文件 - >

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Session extends Model 
{ 
    // 

    public function task() 
    { 
     return $this->belongsTo('App\Task'); 
    } 

} 

routes.php文件 - >當我按下按鈕張貼到路由

<?php 

use App\Task; 
use App\Session; 

use Illuminate\Http\Request; 

Route::group(['middleware' => ['web']], function() { 
    // 

    Route::get('/', function() { 
     $task = Task::orderBy('created_at', 'desc')->get(); 

     return view('layouts/tasks', [ 
      'tasks' => $task 
     ]); 

    }); 


    Route::post('/task', function (Request $request) { 
     Task::saveTask($request); 
    /* 
     $validator = Validator::make($request->all(), [ 
      'name' => 'required|max:255', 
     ]); 

     if($validator->fails()) { 
      return redirect('/')->withInput()->withErrors($validator); 
     } 

     $task = new Task; 
     $task->name = $request->name; 
     $task->deadline = $request->deadline; 
     $task->save(); 


    */ 
     return redirect('/'); 
    }); 



    Route::post('/task/{task}/activate', function (Task $task) { 
     Task::activateTask($task); 
    }); 



    Route::post('/task/{task}/deactivate', function (Task $task) { 
     $task->active = 0; 
     $task->save(); 
     $session = App\Session::find(Session('active')); 
     $session->touch(); 

     $started = strtotime($session->created_at); 
     $ended = strtotime($session->updated_at); 
     $hours = abs(($ended - $started))/(60*60); 
     $session->hours = $hours; 

     $session->save(); 
     Session(['active' => null]); 
     return redirect('/'); 

    }); 

    Route::delete('/task/{task}', function (Task $task){ 
     if($session = Session::find(Session('active'))) 
     { 
      if($session->task->id == $task->id) 
      { 
       Session(['active', null]); 
      } 
     } 

     $task->delete(); 
     return redirect('/'); 
    }); 

}); 

問題發生。

試圖谷歌的問題,並嘗試不同的方法來解決這個問題,但沒有運氣。我非常確定這是一件非常容易和愚蠢的事情,但無法弄清楚。

回答

0

您的路線設置不正確。要使用控制器,請以[email protected]格式傳遞字符串作爲第二個參數。所以,你的路線應該是這樣的:

Route::post('/task/{task}/activate', '[email protected]'); 

而且,你的控制器的方法是希望傳遞的值是模型,而不是一個ID,所以你要輸入提示您的參數,以利用隱式模型綁定:

public function activateTask(\App\Task $task) { 
    // 
} 

您可能需要查看routing documentation以獲取更多信息。

+0

非常感謝!我試圖從文檔中找出。我只是不明白變量是如何通過路由的......但它似乎是自動執行的,如果你在函數中請求它的話? 插件使用App/Session到任務控制器後開始工作。有更多的問題,但希望可以自己游泳徹底。 –

相關問題