Is there any way to define custom routes in Phoenix?

You can add a get inside the do block of resources.

web/router.ex

resources "/tasks", TaskController do
  get "/implement", TaskController, :implement
end

$ mix phoenix.routes

     task_path  GET     /tasks                     MyApp.TaskController :index
     task_path  GET     /tasks/:id/edit            MyApp.TaskController :edit
     task_path  GET     /tasks/new                 MyApp.TaskController :new
     task_path  GET     /tasks/:id                 MyApp.TaskController :show
     task_path  POST    /tasks                     MyApp.TaskController :create
     task_path  PATCH   /tasks/:id                 MyApp.TaskController :update
                PUT     /tasks/:id                 MyApp.TaskController :update
     task_path  DELETE  /tasks/:id                 MyApp.TaskController :delete
task_task_path  GET     /tasks/:task_id/implement  MyApp.TaskController :implement

I want to improve Dogbert's answer a little bit:

resources "/tasks", TaskController do
  get "/implement", TaskController, :implement, as: :implement
end

The only addition is as: :implement in the end of the route.

Thus you will get route named task_implement_path instead of ugly task_task_path.