Использование методов контроллера из командной строки Laravel

Бывает, необходимо быстро протестировать какой-то метод контроллера, который не имеет точки доступа (endpoints) в роутинге.

Например, у нас в контроллере PostController есть метод, привязывающий пост блога к юзеру:

public function attachUserToPost(User $user, Post $post) {
  $post->users()->attach($user->id);
  $post->fresh();
  return $post;
}

И он вызывается где-то в другом методе, где ему передаются параметры. POST запрос нам некуда послать, а проверить работоспособность конкретного метода или передать какие-то определенные параметры нужно.

В Laravel существует замечательный инструмент tinker:

php artisan tinker 

Он позволяет построчно выполнять команды php (правильно называется repl)

В нем мы можем обращаться к моделям Laravel:

$user = App\User::find(1);

Мы можем создать экземпляр контроллера и передать в произвольный метод необходимые параметры

>>> это пользовательский ввод
=> это ответ Laravel

Psy Shell v0.9.9 (PHP 7.2.0RC4 — cli) by Justin Hileman
  
>>> $user = App\User::find(1);                                                                           
=> App\User {#2976                                                                                                                                                                                                 
     id: 1,                                                                                                                                                                                                        
     name: "Dr. Lelia Bailey DDS",                                                                                                                                                                                 
     is_admin: 0,                                                                                                                                                                                                  
     email: "ymayert@example.org",                                                                                                                                                                                 
   }                                                                                                                                                                                                               
>>> $post = App\Post::find(5);                                                                                                                                                                                   
=> App\Post {#2974                                                                                                                                                                                                
     id: 5,                                                                                                                                                                                                        
     title: "test",                                                                                                                                                                                                 
   }                                                                                                                                                                                                              
>>> $controller = app()->make('App\Http\Controllers\PostController');                                                                                                                                             
=> App\Http\Controllers\PostController {#2979                                                                                                                                                                     
     +user: null,                                                                                                                                                                                                  
   }                                                                                                                                                                                                               
>>> app()->call([$controller, 'attachUserToPost'], [$user, $post]);