{"id":418,"date":"2026-09-28T14:53:59","date_gmt":"2026-09-28T12:53:59","guid":{"rendered":"https:\/\/airasystems.io\/insights\/?p=418"},"modified":"2026-09-28T14:54:33","modified_gmt":"2026-09-28T12:54:33","slug":"actualizacion-de-laravel-legacy","status":"publish","type":"post","link":"https:\/\/airasystems.io\/insights\/es\/actualizacion-de-laravel-legacy\/","title":{"rendered":"Actualizacion de Laravel Legacy: d\u00f3nde empiezan los verdaderos problemas"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">&#8220;Vamos a actualizar Laravel&#8221; suena a una tarea sencilla. Hasta que abres <code>composer.json<\/code>. Un proyecto heredado (legacy) puede estar funcionando perfectamente en Laravel 7 u 8, pero la actualizaci\u00f3n a una versi\u00f3n moderna puede exponer toda una cadena de problemas de compatibilidad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estos son algunos de los m\u00e1s comunes al realizar una actualizaci\u00f3n de Laravel Legacy:<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">1. Un paquete utilizado por el proyecto antiguo no es compatible con el nuevo Laravel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este es probablemente el escenario m\u00e1s frustrante. La aplicaci\u00f3n utiliza un paquete que funcionaba perfectamente en Laravel 8:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Laravel 8\n\u2514\u2500\u2500 package-x 2.4\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9\">Laravel<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\u2514\u2500\u2500 <\/span><span style=\"color: #81A1C1\">package-<\/span><span style=\"color: #D8DEE9\">x<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">2.4<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Actualizas a Laravel 11:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Laravel 11\n\u2514\u2500\u2500 package-x 2.4 \u274c\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9\">Laravel<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">11<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\u2514\u2500\u2500 <\/span><span style=\"color: #81A1C1\">package-<\/span><span style=\"color: #D8DEE9\">x<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">2.4<\/span><span style=\"color: #D8DEE9FF\"> \u274c<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Composer se niega a instalarlo porque el paquete requiere una versi\u00f3n m\u00e1s antigua de <code>illuminate\/*<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora tienes que elegir:<\/li>\n\n\n\n<li>buscar una versi\u00f3n m\u00e1s reciente;<\/li>\n\n\n\n<li>reemplazar el paquete;<\/li>\n\n\n\n<li>hacer un <em>fork<\/em> y mantenerlo t\u00fa mismo;<\/li>\n\n\n\n<li>o posponer la actualizaci\u00f3n de Laravel.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Y, a veces, el paquete est\u00e1 abandonado, por lo que no hay ninguna ruta de actualizaci\u00f3n posible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">2. Conflictos de dependencias de Composer en la actualizaci\u00f3n de Laravel Legacy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una sola actualizaci\u00f3n puede exponer conflictos a varios niveles de profundidad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Laravel 11\n   \u2193\nrequires Symfony 7\n   \u2193\nPackage A requires Symfony 6\n   \u2193\nPackage B requires Package A\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">Laravel<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">11<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   \u2193<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">requires<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Symfony<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   \u2193<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Package<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">A<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">requires<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Symfony<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">6<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   \u2193<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Package<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">B<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">requires<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Package<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">A<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Composer no puede satisfacer todos estos requisitos. La parte frustrante es que el paquete que causa el problema puede no ser algo que uses directamente. Puede ser una dependencia de otra dependencia. Ah\u00ed es donde una simple actualizaci\u00f3n del framework se convierte en arqueolog\u00eda de dependencias.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">3. <code>composer.lock<\/code> puede mantener el \u00e1rbol de dependencias antiguo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Actualizas <code>composer.json<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\"laravel\/framework\": \"^11.0\"\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #CE9178\">&quot;laravel\/framework&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;^11.0&quot;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Pero Composer sigue reportando conflictos porque <code>composer.lock<\/code> contiene versiones de la aplicaci\u00f3n antigua. El archivo <em>lock<\/em> representa el \u00e1rbol de dependencias que fue resuelto previamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por lo tanto, a veces necesitas actualizar no solo Laravel, sino un grupo cuidadosamente seleccionado de dependencias relacionadas, sin borrar a ciegas el <code>composer.lock<\/code> y esperar lo mejor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">4. La nueva versi\u00f3n de Laravel requiere un PHP m\u00e1s reciente<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo:<br>Aplicaci\u00f3n antigua<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Laravel 8<br>PHP 7.4<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pasa a ser:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Laravel 11<br>PHP >= 8.2<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pero actualizar PHP puede exponer otra capa de problemas. Es posible que algunos paquetes antiguos ya no sean compatibles con PHP 8.2. As\u00ed que la cadena de dependencias se convierte en:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Laravel upgrade\n      \u2193\nPHP upgrade\n      \u2193\nold packages become incompatible\n      \u2193\npackages need upgrading\/replacing\n      \u2193\napplication code needs changes\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Laravel upgrade<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      \u2193<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">PHP upgrade<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      \u2193<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">old packages become incompatible<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      \u2193<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">packages need upgrading\/replacing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      \u2193<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">application code needs changes<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">5. El paquete tiene una nueva versi\u00f3n, pero su API ha cambiado<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este es f\u00e1cil de subestimar. Encuentras una versi\u00f3n compatible y Composer la instala con \u00e9xito. Genial.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Excepto que el c\u00f3digo antiguo:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>SomePackage::process($data);\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SomePackage::process($data);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">ahora podr\u00eda requerir:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>SomePackage::process($data, $options);\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">SomePackage::process($data, $options);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">o el m\u00e9todo puede haber sido renombrado, eliminado o haber cambiado su tipo de retorno. Por lo tanto: \u00e9xito de Composer \u2260 \u00e9xito de la aplicaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">6. Las actualizaciones de Symfony pueden afectar a las aplicaciones Laravel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel depende en gran medida de los componentes de Symfony. Cuando Laravel pasa a versiones m\u00e1s recientes de Symfony, el c\u00f3digo personalizado o los paquetes creados en torno al comportamiento antiguo de Symfony pueden dejar de funcionar. Esto es especialmente relevante para proyectos con integraciones personalizadas, manejo de HTTP, comandos de consola, correo, eventos o funcionalidad del sistema de archivos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">7. Las actualizaciones de Flysystem pueden romper las integraciones del sistema de archivos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un buen ejemplo es el cambio a Flysystem 3. Una aplicaci\u00f3n antigua puede tener:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Laravel\n\u2514\u2500\u2500 Flysystem 1\/2\n    \u2514\u2500\u2500 custom storage adapter\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Laravel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\u2514\u2500\u2500 Flysystem <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">\/<\/span><span style=\"color: #B5CEA8\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    \u2514\u2500\u2500 custom storage adapter<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Tras la actualizaci\u00f3n:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Laravel\n\u2514\u2500\u2500 Flysystem 3\n    \u2514\u2500\u2500 old adapter \u274c\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Laravel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\u2514\u2500\u2500 Flysystem <\/span><span style=\"color: #B5CEA8\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    \u2514\u2500\u2500 old adapter \u274c<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">La aplicaci\u00f3n Laravel en s\u00ed puede ser compatible, pero un adaptador personalizado o un paquete creado en torno a la antigua API de Flysystem podr\u00eda no serlo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">8. Los paquetes de autenticaci\u00f3n tienen sus propias rutas de actualizaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel Passport, Sanctum, Socialite y otros paquetes del ecosistema no avanzan necesariamente a la par que Laravel. Puedes terminar con:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Laravel \u2192 new version\nPassport \u2192 old version\n      \u2193\nincompatible dependencies\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Laravel \u2192 new version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Passport \u2192 old version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      \u2193<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">incompatible dependencies<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">O puedes actualizar Passport y luego descubrir que los flujos de autenticaci\u00f3n, la configuraci\u00f3n o las migraciones de la base de datos necesitan cambios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">9. Las migraciones de los paquetes pueden cambiar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este es otro problema sutil. Un paquete puede instalarse correctamente, pero su configuraci\u00f3n de base de datos podr\u00eda funcionar de manera diferente en una versi\u00f3n m\u00e1s reciente. Actualizas el paquete, despliegas la aplicaci\u00f3n y de repente descubres que las tablas, columnas o \u00edndices esperados no est\u00e1n presentes. Por esta raz\u00f3n, las actualizaciones de paquetes deben tratarse como cambios en la aplicaci\u00f3n, no solo como cambios en Composer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">10. PHPUnit y la suite de pruebas pueden convertirse en otra migraci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo de producci\u00f3n puede seguir pareciendo correcto. Luego ejecutas:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>php artisan test\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">php artisan test<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">y la mitad de la suite de pruebas falla. \u00bfPor qu\u00e9? Porque las versiones de PHPUnit compatibles con Laravel cambian con el tiempo, y el propio PHPUnit elimina las API obsoletas. As\u00ed que actualizar Laravel puede significar actualizar:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Laravel\n+\nPHP\n+\nComposer packages\n+\nPHPUnit\n+\ntest code\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Laravel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">PHP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Composer packages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">PHPUnit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">test code<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">11. La configuraci\u00f3n y la estructura de la aplicaci\u00f3n pueden cambiar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una versi\u00f3n m\u00e1s reciente de Laravel puede introducir una estructura predeterminada o un enfoque de configuraci\u00f3n diferentes. La tentaci\u00f3n es tomar una instalaci\u00f3n limpia de Laravel y copiar todo en el proyecto antiguo. A menudo, esto es una mala idea. Una aplicaci\u00f3n heredada tiene a\u00f1os de configuraci\u00f3n personalizada, <em>middleware<\/em>, proveedores de servicios e integraciones. El objetivo no es hacer que la aplicaci\u00f3n antigua se vea como una instalaci\u00f3n limpia de Laravel. El objetivo es trasladar la aplicaci\u00f3n existente de forma segura a la nueva versi\u00f3n del <em>framework<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Y esto es lo que hace que las actualizaciones de Laravel sean dif\u00edciles.<\/strong> El problema rara vez es:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>&#8220;\u00bfC\u00f3mo instalo Laravel 11?&#8221;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El verdadero problema es:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>&#8220;\u00bfQu\u00e9 partes de este \u00e1rbol de dependencias de hace 7 a\u00f1os pueden realmente pasar a Laravel 11 sin romper la aplicaci\u00f3n?&#8221;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de actualizar, me gustar\u00eda saber:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00bfQu\u00e9 paquetes bloquean la actualizaci\u00f3n?<\/li>\n\n\n\n<li>\u00bfQu\u00e9 paquetes est\u00e1n abandonados?<\/li>\n\n\n\n<li>\u00bfQu\u00e9 paquetes necesitan ser reemplazados?<\/li>\n\n\n\n<li>\u00bfQu\u00e9 versi\u00f3n de PHP se requiere?<\/li>\n\n\n\n<li>\u00bfQu\u00e9 versiones de Symfony\/Flysystem van a cambiar?<\/li>\n\n\n\n<li>\u00bfQu\u00e9 versiones mantiene fijas actualmente <code>composer.lock<\/code>?<\/li>\n\n\n\n<li>\u00bfQu\u00e9 APIs tienen cambios que rompen la compatibilidad (<em>breaking changes<\/em>)?<\/li>\n\n\n\n<li>\u00bfQu\u00e9 migraciones de base de datos se ven afectadas?<\/li>\n\n\n\n<li>\u00bfSeguir\u00e1 funcionando la suite de pruebas existente?<\/li>\n\n\n\n<li>\u00bfQu\u00e9 flujos cr\u00edticos para el negocio necesitan pruebas de regresi\u00f3n?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Porque en una aplicaci\u00f3n Laravel heredada (legacy), la ruta de actualizaci\u00f3n a menudo es m\u00e1s complicada que la actualizaci\u00f3n en s\u00ed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfCu\u00e1l ha sido el mayor obst\u00e1culo que has encontrado al actualizar Laravel: un paquete incompatible, conflictos de Composer, PHP, o alguna otra cosa?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Leer m\u00e1s:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <a href=\"\/insights\/es\/modernizacion-de-sistemas-heredados\/\">Modernizaci\u00f3n de sistemas heredados: C\u00f3mo actualizar sistemas cr\u00edticos del sector p\u00fablico sin interrupciones<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;Vamos a actualizar Laravel&#8221; suena a una tarea sencilla. Hasta que abres composer.json. Un proyecto heredado (legacy) puede estar funcionando perfectamente en Laravel 7 u 8, pero la actualizaci\u00f3n a una versi\u00f3n moderna puede exponer toda una cadena de problemas de compatibilidad. Estos son algunos de los m\u00e1s comunes al realizar una actualizaci\u00f3n de Laravel [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":419,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[393,395],"tags":[409,407,404,400,397],"class_list":["post-418","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo-en-laravel","category-modernizacion-de-sistemas-heredados","tag-actualizacion-de-laravel","tag-codigo-heredado","tag-composer-es","tag-laravel-es","tag-modernizacion-de-software"],"_links":{"self":[{"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/posts\/418","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/comments?post=418"}],"version-history":[{"count":1,"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/posts\/418\/revisions"}],"predecessor-version":[{"id":420,"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/posts\/418\/revisions\/420"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/media\/419"}],"wp:attachment":[{"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/media?parent=418"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/categories?post=418"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/airasystems.io\/insights\/wp-json\/wp\/v2\/tags?post=418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}