El controlador de Laravel usa un rasgo que usa otro rasgo usado

El controlador de Laravel usa un rasgo que usa otro rasgo usado

Tengo un controlador que usa dos rasgos, CavityTools y OperationTools

class OperationController extends Controller
{

    use \App\Traits\CavityTools;
    use \App\Traits\OperationTools;

Sin embargo, el segundo rasgo OperationTools usingCavityTools`:

trait OperationTools {
    use \App\Traits\CavityTools;

Entonces, cuando trato de usar un método de OperationTools desde cualquier método de controlador como $this->getProduction(), aparece un error que informa sobre un método en el CavityTools que no se aplica por colisión:

No se ha aplicado el método de rasgo cavidadPerformanceBetweenTimes, porque hay colisiones con otros métodos de rasgos en Aplicación\Http\Controllers\OperationController

He intentado crear un alias para el segundo rasgo, use \App\Traits\OperationTools as OpTs; pero genera un error de análisis:

Error de análisis: error de sintaxis, 'como' inesperado (T_AS), esperando ',' o ';' o '{'

¿Cómo podría solucionar este problema?

Mostrar la mejor respuesta

¿Por qué no usas el rasgo OperationTools, ya que ya usa CavityTools dentro de tus controladores? class Ctrl { use OperationTools; //rest of the class } ver ejemplo sandbox.onlinephpfunctions.com/code/…

@Kyslik porque hay acciones de otro controlador que usa otros métodos de CavityTools directamente. Sin embargo, es una buena idea, lo comprobaré pronto.

Cuando los rasgos del código de interpretación simplemente se copian dentro de la clase, no tienen nada de especial, es el mismo concepto que extender la clase. No entiendo tu último comentario. También me sorprende que tengas 7k representantes y en su mayoría de PHP y no sepas esto. Muy raro.

Su comentario deja en claro que me di cuenta erróneamente de que cada rasgo puede funcionar como una cápsula aislada, pero no pensé que funcionara como PHP incluido, es decir, cada rasgo que usa otro rasgo traerá sus métodos consigo.

podría cambiar el nombre de uno de ellos, consulte este ejemplo método">stackoverflow.com/questions/39441612/…

Esto se debe a que hay las mismas funciones en ambos rasgos. Para evitar eso, deberá usar "InsteadOf" en su clase actual.

Referencia: Colisiones con otros métodos de rasgos

Simplemente use el rasgo OperationTools ya que CavityTools ya se usan.

Código de ejemplo:

<?php


trait A {
    function a() {
        echo "a trait\n";
    }
}

trait B {
    use A;
    function b() {
        echo "b trait\n";
    }

    function a() {
        echo "a fcn from trait B\n";
    }
}

trait C {
    use B;
    function a() {
        echo "a fcn from C trait\n";
    }

    function b() {
        echo "b fcn from C trait\n";
    }
}


class AClass {
    use A;
}

$classA = new AClass;
$classA->a();
// $classB->b(); // will throw up


class BClass {
    use B;
}

$classB = new BClass;
$classB->a();
$classB->b();

class CClass {
    use C;
}

$classC = new CClass;
$classC->a();
$classC->b();

// salida

a trait
a fcn from trait B
b trait
a fcn from C trait
b fcn from C trait