Cuando usar las propiedades de las Clases Controladoras en Laravel
Queria hablar un poquito sobre lo que son las propiedades y también los métodos en este caso enfocado a los controladores aquí en larbel ya que al menos yo es una opinión muy personal pero cuando estamos empleando aquí los métodos:
public function registerBook(Book $book, string $orderId, string $payment = "paypal")
{
$user = $this->getUser();
if ($user == null) {
return $this->errorResponse("", 202, 'Usuario no encontrado, no se hizo ningun cargo a tu cuenta');
}
if ($book->isFree(request("coupon"))) {
return $this->registerBookToUser(
$book,
***
);
}
// registra el libro
return $this->registerBookToUser(
$book,
***
);
}
Que los definimos para resolver una petición es lo que yo llamo y creo que se llaman así como funciones controladoras o métodos controladores como lo quieras llamar porque la final el que es realmente controlador viene siendo el método en la cuales tenemos en un controlador múltiples métodos puede que se un poquito el enfoque o las bases que son.
Clases, propiedades, herencia, trait…
Qué es que esto es una clase con todas las ventajas que esto nos trae en bueno como quien dice muy resumidas cuenta y lo que más se pudiera aprovechar es la parte de la herencia que ya por aquí estamos extendiendo una de base con los Trade que esto como que la herencia múltiple se pudiera decir una especie de herencia múltiple que tenemos aquí en la en php y también otro gran abandonado viene siendo el uso de las propiedades que también nos puede facilitar muchísimo la vida y…
Ahorita te quiero hablar un poco sobre que tenía y cómo lo pude resolver entonces la forma más sencilla de emplear las propiedades antes de entrar en detalle con todo esto que tengo acá creo que sería esta que tengo por acá la llamada base URL lo primero que también quiero comentarte es que este código todavía lo tengo que mejorar más por ejemplo aquí puedes ver que algunos le definí el tipo aquí no lo definí porque esto es múltiple y tengo ahí una un conflicto existencial y aquí ni siquiera le definí un tipo no estoy
diciendo que es el mejor código simplemente quiero ejemplificar mi ejemplo valga aquí la redundancia el más sencillo sería este aquí yo tengo las URL:
Por cierto para que entres en contexto en la parte aquí de de compras de mi plataforma esta justamente esta también estoy colocando la strike y es por eso que ve referencias de strike por aquí en el código todavía no lo he lanzado a producción pero en fin es básicamente esto y esto es si has seguido mi curso sabes cómo funciona es para desde el servidor una vez obtenida la orden aquí en el cliente que es lo que se genera poder ver si la misma es válida y terminar de procesarla es decir es cuando se realiz el cobro de cliente se hace es en el servidor al menos así funciona en PayPal ya en strike cambia un poquito la cosa:
class BasePaymentController extends Controller
{
protected $clientId;
protected $secret;
protected $baseURL = 'https://api-m.paypal.com';
public function __construct()
{
$this->baseURL = config('app')['env'] == 'local' ? 'https://api-m.sandbox.paypal.com' : 'https://api-m.paypal.com';
$this->clientId = config('app')['paypal_id'];
$this->secret = config('app')['paypal_secrect'];
}
}
Pero ese es otro cuento aquí estamos generando la URL que pueden ser dos la de sandbox que sería para modo de prueba que la tengo aquí de referencia y esta que es la que empleamos en producción a la final también esta URL como te comento se emplea para hacer las peticiones a la de PayPal y es por eso que la referenci de esta forma para poder emplearla fácilmente a lo largo de la aplicación dónde se emplea para generar el token y también para verificar el pago y finalmente cobrarlo y es por eso que ves y para inicializar lo y es por eso que ves esto de esta forma esto es una manera sencilla como quien dice y útil de emplear las propiedades ya que se emplean en múltiples métodos que es la parte importante el constructor es para inicializar aquí lo empleamos en el caso de los controladores es para que cada vez que se llama a un método se también cada vez que se llama un método por ejemplo de un controlador también se inicializa es decir est viene siendo como una especie de middleware que se ejecuta antes de realizar la petición y en este caso es para reinicializar aspectos claves como vien siendo las claves secretas Y en este caso también el base URL de PayPal en la cual tomo el sandbox si estoy en ambiente de desarrollo y producción si estoy bueno en ambiente de producción que sería el otro caso que yo manejo acá entonces por lo demás esta URL se emplea internamente en los métodos controladores en este caso no directamente porque este método lo llamo desde los controladores para hacerlo más modularizado pero en esencia ex eso si lo buscamos Este es un método no este no bueno es que este es el base disculpa porque esta clase también la estoy agando desde otra parte esto lo llamaría acá en este s request Api que la final lo llamo en el controlador es un poco anidado y es que estoy intentando modularizar lo bastante y finalmente lo llamo acá que este sí es un controlador no importa aquí la bifurcación pero a la final se llama desde un controlador y a la final cómo funciona todo siempre se realiza aquí la el base URL tal cual te comentaba esto es un caso sencillo porque es simplemente un componente y se puede ver fácilmente que es necesario emplear este base URL en múltiples partes de la aplicación pero aquí también hay uno un poquito más interesante o más o menos lo mismo pero cambia un poquito y era precisamente para qué empleo estas que tengo acá en este caso esto es para información del pago de qué es lo que está sucediendo cuando estamos procesando la orden esta sería para el precio es decir cuando se está pagando me gusta obtener esa información de la respuesta de la Api en este caso estamos hablando de la de PayPal:
class BasePaymentController extends Controller
{
protected int|float $price = 0;
protected string $status = '';
protected string $idAPI = ''; // es el ordenId pero para manejar en la fun
protected array|object $responseAPI;
protected string $payment = 'paypal';
protected function sendRequestAPI(string $orderId)
{
if ($orderId == 'stripe') {
// stripe
$this->responseAPI = $this->checkPayedSession(request("stripe_session_id"));
if ($this->responseAPI->payment_status == 'paid') {
$this->status = 'COMPLETED';
$this->idAPI = request("stripe_session_id");
$this->payment = 'stripe';
//dd($this->responseAPI);
$this->price = intdiv($this->responseAPI->amount_total, 100);
} else {
// respuesta error stripe excepcion
return $this->errorResponse("", 202, json_encode($this->responseAPI));
}
} else {
// paypal
$this->responseAPI = $this->processPayPayPal($orderId);
if (isset($this->responseAPI['status']) && $this->responseAPI['status'] == 'COMPLETED') {
$this->status = 'COMPLETED';
$this->idAPI = $this->responseAPI['id'];
$this->price = $this->responseAPI['purchase_units'][0]['payments']['captures'][0]['amount']['value'];
}
}
}
Pero también es lo mismo para la stripe cuál es la plataforma de pago empleadas y ppal o stripe Esto es para control interno esto sería el identificador es decir el orden ID en PayPal y el session ID en stripe y esta sería el estatus si se completó y en caso de de stripe creo
que es payed:
// stripe
$this->responseAPI->payment_status == 'paid'
//paypal
isset($this->responseAPI['status']) && $this->responseAPI['status'] == 'COMPLETED'
Entonces, hay varios elementos que son comunes que queremos manejar de manera global, como el precio, estatus, plataforma entre otras, y al estar empleando plataformas de pago distintas, se puede unificar mediante un método que haga la conversión por nosotros y los establecemos en propiedades para que de manera transparente y sin importar la plataforma, los podamos usar.
Hay varias verificaciones en un solo lugar y justamente es este método que modularis qué es lo que hace este método que era común en esas tres operaciones entonces primero verifica qu demonios es el es la libreta de pago que estás empleando si PayPal o stripe porque en ambos casos es decir el plugin de pago es el mismo para todos los casos por lo tanto aquí estoy verificando cuál es cuál estás empleando es stripe o PayPal
Otra vez aquí también el problema principal es que tenemos dos tipos de respuestas una es la de stripe y otra es la de PayPal pero seguramente a futuro puede agregar otra plataforma suponte que mercado pago cualquier cosa que se me ocurra por ahí pero la final lo importante es notar de que independientemente de la plataforma que yo emplee si lo puedo esquematizar justamente con la estructura que yo definir anteriormente
Acepto recibir anuncios de interes sobre este Blog.
Comento un par de escenarios en las cuales considero de que son útiles las propiedades en los Controladores en Laravel.
- Andrés Cruz