Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Nahuel Segovia
Nahuel Segovia

Posted on

     

Inyección de dependencias

La inyección de dependencias nos permite modularizar código, evitar repetir código y también evitar el acoplamiento de otras clases.

Supongamos que tenemos un servicio que nos permite envíar diferentes tipos de mensajes hacia un destino en particular, lo vamos a llamar "notificador", este notificador contiene adentro las funcionalidades para poder envíar un mensaje por correo electrónico, o por Whatsapp. Ahora, para poder acceder a enviar con cualquiera de los dos metodos de envío, tenemos que instanciarlos y llamar al metodo enviar de cada uno para poder enviar el mensaje, imaginemos que tenemos EnvioWhatsapp y EnvioCorreo y tenemos que instanciarlos:

classNotificador{publicfunctionenviar($whatsapp,$correo){$envioWhatsapp=newEnvioWhatsapp();$envioCorreo=newEnvioCorreo();$envioWhatsapp->enviar($whatsapp);$envioCorreo->enviar($correo);}
Enter fullscreen modeExit fullscreen mode

Entonces ya podemos envíar mensajes a través del método envíar:

$enviar=newNotificador();$enviar->enviar(+54112344555,correo@correo.com);-------------------MENSAJESENVIADOS----------------------
Enter fullscreen modeExit fullscreen mode

El problema de esto es que estamos instanciando los objetos cada vez que los necesitamos usar en alguna clase, por lo que si en el futuro EnvioCorreo y EnvioWhatsapp cambia, tendríamos que cambiar el código en cada uno de los lugares en los que lo estamos usando. La solución para esto es sencillo, crear un contendor que esté "subscripto" a cada una de las clases y nos proporcione los métodos correspondientes para poder usarlo en el lugar que nosotros queramos.

Hay varias formas de hacerlo y lo voy a mostrar con un ejemplo real, las mas conocidas son la inyección de dependencias a través del constructor:

  • Tengo un blog en donde necesitamos crear posteos, editarlos y eliminarlos, entonces vamos a crear un contenedor que esté subscripto a la clase posteo, que nos va a permitir crear un nuevo post en la base de datos:
<?phpnamespaceApp\Repositories;useIlluminate\Support\Facades\Auth;useApp\Models\Post;useApp;useDB;classPostrepository{publicfunctioncreate($data){$user=Auth::user();$post=newPost;$post->post_title=$data->post_title;$post->post_content=$data->post_content;$post->post_image_1=$data->post_image_1;$post->post_image_2=$data->post_image_2;$post->user_id=$user->id;$post->save();}publicfunctionupdate($id,$data){$update=DB::table('posts')->where('id',$id)->update(['post_title'=>$data->post_title,'post_content'=>$data->post_content,'post_image_1'=>$data->post_image_1,'post_image_2'=>$data->post_image_2,]);}publicfunctiondelete($id){$post=Post::find($id);$post->delete();}publicfunctionshow($id){if($posts=Post::find($id)){echo$posts;}echo'No existe el post';}}?>
Enter fullscreen modeExit fullscreen mode

Entonces lo único que nos falta es inyectar las dependencias de este contenedor que nos permite crear, eliminar y editar post adentro de nuestro controlador:

<?phpnamespaceApp\Http\Controllers;useIlluminate\Http\Request;useIlluminate\Support\Facades\Auth;useApp\Repositories\Postrepository;useApp\Models\Post;classPostControllerextendsController{private$postRepository;publicfunction__construct(Postrepository$repository){$this->postRepository=$repository;}publicfunctioncreate(Request$request){$post=$this->postRepository;$post->create($request);returnredirect('/home');}publicfunctionupdate(Request$request,$id){$post=$this->postRepository;$post->update($id,$request);returnredirect('/home');}publicfunctiondelete(Request$request,$id){$post=$this->postRepository;$post->delete($id);returnredirect('/home');}publicfunctionshow($id){$post=$this->postRepository;$post->show($id);}}
Enter fullscreen modeExit fullscreen mode

Y vemos como a través de estas pocas líneas podemos acceder a todos los métodos para utilizar con el crud:

private$postRepository;publicfunction__construct(Postrepository$repository){$this->postRepository=$repository;}
Enter fullscreen modeExit fullscreen mode

la explicación es fácil, el constructor va a iyectar todos los métodos del contendor adentro de la variable $repository y nosotros le pasamos esos métodos a la variable $postRepository para que pueda ser usada en cualquier parte del controlador:

Como en el método create por ejemplo:

publicfunctioncreate(Request$request){$post=$this->postRepository;$post->create($request);returnredirect('/home');}
Enter fullscreen modeExit fullscreen mode

La segunda opción más conocida es inyectar las dependencias directamente en los métodos, y esto es una forma muy facil, creamos un nuevo controlador e inyectamos directamente en el método en el que necesitamos usar las dependencias:

<?phpnamespaceApp\Http\Controllers;useIlluminate\Http\Request;useApp\Models\Post;useApp\Repositories\Postrepository;classNuevoControllerextendsController{publicfunctionporMetodos(Postrepository$post){return$post->show(5);}}
Enter fullscreen modeExit fullscreen mode

RESULTADO:

{"post_title":"Titulo de prueba","post_content":"Producto de prueba para que lo puedas comprar","post_image_1":"imagen1.jpg","post_image_2":"imagen2.jpg","user_id":"1","id":5,"created_at":null,"updated_at":null}
Enter fullscreen modeExit fullscreen mode

Y eso es todo, espero que les sirva.

Top comments(2)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss
CollapseExpand
 
alelazcano profile image
Alejandro Lazcano
Desde los 14 años participando activamente de proyectos web, en distintos roles y posiciones. 10 años usando WordPress, ahora profundizando js, php, css; también Prestashop ecommerce.
  • Location
    Argentina
  • Education
    Autodidacta y cursos
  • Work
    Consultor ecommerce, product owner
  • Joined

Excelente aporte y muy clara la explicación. Gracias

CollapseExpand
 
nahuelsegovia profile image
Nahuel Segovia
Backend developer interested in open source community. Building with Typescript/Python.
  • Location
    Argentina
  • Joined

Gracias a vos por leerme :)

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Backend developer interested in open source community. Building with Typescript/Python.
  • Location
    Argentina
  • Joined

More fromNahuel Segovia

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp