Трейты нужны для уменьшения дублирования кода. Причем выносить в них стоит только тупой код, который не имеет смысла покрывать тестами. Все что делает хоть что нибудь умное в трейте хранить не стоит.
Пример когда трейты хороши - паттерн композиция.
interface A {
    function foo();
}
interface B {
    function bar();
}
trait AImpl {
    function foo() {
        return $this->a->foo();
    }
}
trait BImpl {
    function bar() {
        return $this->b->bar();
    }
}
class AB implements A, B {
    private $a;
    private $b;
    use AImpl;
    use BImpl;
    public function __construct(A $a, B $b) {
        $this->a = $a;
        $this->b = $b;
    }
}