Actualización Cakephp de 1.3 a 2.1
cakephp-1.3 cakephp-2.0 (4)
ACTUALIZACIÓN: la pregunta que hice no cubre la profundidad con la que hice esta actualización. Si te tropiezas con esto, espero que la respuesta que te empujé te sea útil
Por lo tanto, en un esfuerzo por hacer funcionar el complemento "foro", he decidido actualizar cakephp de 1.3 a 2.1
(Esto se debió a que el plugin del foro usa algo llamado CakeDC utils, y ya están listos para cakephp 2.0, y sorpresa sorpresa, la versión 2.3 del foro no está clara con qué utilidades funciona ...)
Ok, entonces he ejecutado la magia de mejora de pastel, de acuerdo con las instrucciones que se encuentran aquí:
http://book.cakephp.org/2.0/en/console-and-shells/upgrade-shell.html#upgrade-shell
Y ejecuté el actualizador, y dijo que hizo un montón de cosas, y parece que hizo un montón de cosas.
Ahora cuando visito mi sitio, está inactivo, sin respuesta.
El error se registra en la lectura de apache:
[Jue 05/05 02:58:04 2012] [error] [cliente 173.45.125.112] Error grave de PHP: no se puede encontrar el archivo de núcleo de la aplicación. Cree /cake_install/app/config/core.php, y asegúrese de que sea legible por PHP. en / cake_install/cake/libs/configure.php en la línea 393
La razón por la que el archivo no existe es que se cambió a una configuración "C" mayúscula en la actualización. ¿Qué me estoy perdiendo?
Aquí está la publicación de mi blog sobre la migración de 1.3 a 2.x: http://www.forceflow.be/2011/11/12/migrating-from-cakephp-1-3-to-2-0/
Para referencia futura, he incluido el contenido de esa publicación aquí. ¡Disfrutar!
Empezando
Hay varias formas de actualizar, pero para proyectos pequeños y medianos, me pareció mejor simplemente descomprimir la nueva estructura de CakePHP 2 y copiar manualmente sus Controladores y Vistas a sus nuevas carpetas. Tenga en cuenta que la estructura de carpetas ha cambiado significativamente. Por ejemplo, el mapa de los controladores ahora es Controlador. Preste atención al lugar donde copie los archivos; no se preocupe por los nombres de los archivos, lo veremos más adelante.
Asegúrese de actualizar core.php y database.php (ahora ubicado en (cakephp root) / app / Config) con los valores para su aplicación. Asegúrate de copiar los valores de sal y cifra de la instalación anterior también, ya que CakePHP continuará lloriqueando cuando uses los predeterminados, es un riesgo de seguridad. Además, para que la conexión de la base de datos vuelva a funcionar, se modificó la sintaxis:
''driver'' => ''mysqli''
se convierte
''datasource'' => ''Database/Mysql''
Trabajo a granel: actualización a través de la consola
Para cambiar el nombre de todos los archivos de su aplicación a la nueva estructura de archivos de CakePHP, hay un comando de consola. Nuevo en CakePHP 2.0 es que cada aplicación ahora tiene su propia consola. Navega a la consola de tu aplicación (no a la consola en / lib / Cake!) En / app / Console, asegúrate de que el comando de la consola sea ejecutable haciendo un chmod + x en él, y ejecuta:
./cake upgrade all
Esto cambiará el nombre de todos los archivos al nuevo estándar de torta y actualizará todas las referencias dentro de su código PHP.
Limpiar
Lamentablemente, este no es el final. Es probable que tu código funcione bien ahora. Eche un vistazo a la guía de migración de CakePHP 2.0 para obtener más información. Voy a resumir los problemas que he tratado más aquí:
En su opinión, ahora debe abordar las clases de Ayuda a través del $ this object. No más llamadas, por ejemplo
$html->link(
, es
$this->Html->link(
ahora, señor
También:
- El JavascriptHelper ahora se llama JsHelper.
- El componente Auth ha cambiado significativamente. La acción de inicio de sesión () no se agrega automáticamente cuando usa el componente, debe especificarlo ahora manualmente. Consulte la nueva documentación del componente Auth para obtener más información.
El AjaxHelper ha sido eliminado, junto con las funciones útiles para búsquedas de estilo AJAX, como observe el campo . He cocinado mi propio campo de observación usando jQuery. Úselo bajo su propio riesgo. Yo serializo un formulario, que en este caso contiene un cuadro de entrada de consulta que me permite hacer una búsqueda en vivo y actualización para Reservas.
$this->Js->get(''#query'')->event(''keyup'', $this->Js->request(
array(''controller'' => ''sales'',''action'' => ''searchReservations'', $event[''Event''][''id'']),
array(
''update'' => ''#view'',
''async'' => true,
''dataExpression'' => true,
''method'' => ''post'',
''data'' => $this->Js->serializeForm(array(''isForm'' => false, ''inline'' => true)))
La respuesta dada por mensch no es exactamente lo que necesito, nunca toqué el archivo index.php, así que detallaré lo que intento aquí.
Estoy usando este sitio como una guía, ¡pero también con mis propios comentarios! http://www.paulmarshall.us/blog/migrating-from-cakephp-13-to-cakephp-20
(También encontré esto: https://github.com/dereuromark/upgrade, que podría tener una oportunidad si el tutorial anterior falla. Sin embargo, no estoy muy interesado, me gustan los documentos super-exhaustivos, no
Put `CakePlugin::loadAll();` in your app bootstrap to make sure this plugin is loaded
que para mí no tiene sentido ... ¿puedes especificar la carpeta del archivo? Cualquier lugar en particular en el archivo para agregar la línea? etc ... intentaré y ser particular acerca de lo que hice!)
Primero, me he dado cuenta de que el index.php que estaba usando mi pastel no era el index.php que vino con el código cake2.1. No estoy seguro de por qué es así, pero copié el "nuevo" 2.1 index.php across (sí, este es el archivo app / webroot / index.php) y ahora tengo un nuevo error:
Aviso: Índice no definido: Error en / cake_install/lib/Cake/Core/Configure.php en la línea 94 Aviso: Índice no definido: Excepción en /cake_install/lib/Cake/Core/Configure.php en la línea 95 Error grave: el nombre de la clase debe ser un objeto válido o una cadena en / cake_install/lib/Cake/Error/ErrorHandler.php en la línea 126
(donde cake_install es la carpeta donde se encuentra mi aplicación de pastel)
Trabajando en esto ahora ...
Y ahora veo que la herramienta de actualización no actualizó el archivo core.php, que se encuentra en la aplicación / Config (para 2.1, aplicación / configuración para 1.3) ... ¿qué hizo realmente la herramienta de actualización? Corté y pegué la versión 2.1 (es decir, desde el archivo zip del código 2.1, tomé esa /app/Config/core.php y la moví a mi directorio / app / Config) y me aseguré de que los valores de sal y seguridad se intercambiaron. Eso es.
Todavía sin suerte. Así que ahora he actualizado el archivo database.php (también en la aplicación / Config, o app / config) ~ Cambié el
''driver'' => ''mysqli'',
a
''datasource'' => ''Database/Mysqli'',
¡Configurar archivos al azar es divertido!
Ah, vale, entonces la actualización al núcleo y la base de datos cambió el mensaje de error ... ¿eso está bien? Todavía no está seguro de lo que hizo su tan cacareada secuencia de comandos de "actualización" ... ¿simplemente cambió los nombres de los archivos? De Verdad?
Advertencia (2): file_put_contents (/cake_install/app/tmp/logs/error.log): no se pudo abrir la secuencia: Permiso denegado [CORE / Cake / Log / Engine / FileLog.php, línea 69]
Aviso (1024): cambie el valor de ''Security.cipherSeed'' en la aplicación / Config / core.php por un valor de inicialización numérico (solo dígitos) específico para su aplicación [CORE / Cake / Utility / Debugger.php, línea 810]
Error fatal: no se encontró la clase ''AppHelper'' en /cake_install/lib/Cake/View/Helper/HtmlHelper.php en la línea 31
Ok, entonces 777 la carpeta / cake_install / app / tmp / logs / (chmod 777 -R folderHere) y
... supongo que nunca actualicé la semilla de cifrado. Ok, inventó un nuevo número! (¿Qué hace la semilla de cifrado, preguntas? Um, bueno, bing no fue de mucha ayuda, leí el código. Parece que se usa para cifrar / descifrar de las cookies. De acuerdo, puedo vivir con eso)
Bootstrap.php
Moví el programa de arranque en el archivo zip a mi versión (¡gracias por actualizar el script!). Todavía no he hecho ningún cambio, creo que tendré que cargar complementos ... estoy seguro de que está bien documentado (¡ja!)
Entonces eso me deja con este error:
Error fatal: no se encontró la clase ''AppHelper'' en /cake_install/lib/Cake/View/Helper/HtmlHelper.php en la línea 31
Y, por supuesto, el mejorador de pastel muy cacareada no ha podido hacer otra actualización. Verifique esta página: http://book.cakephp.org/2.0/en/appendices/2-1-migration-guide.html
Ok, entonces ahora tengo que hacer los archivos, tal como están en esa página. El único truco fue que, sí, está en la carpeta de la aplicación, y no, mi carpeta app / View que cakePhp hizo no tenía una subcarpeta "Helper" ... así que para el AppHelper.php tuve que hacer un Helper subcarpeta en / app / View /.
...
¡OYE! Ahora obtengo un fondo y un logotipo ... y estos:
Aviso (8): variable no definida: loggedIn [APP / pages / top_menu.html, línea 3]
Aviso (8): variable no definida: html [APP / pages / top_menu.html, línea 25]
Error grave: llamada a un enlace de función miembro () en un objeto no en / install_install / app / pages / top_menu.html en la línea 25
Estupendo. ¿Algún tipo de nueva y genial característica de cake 2 que significa que no puedo usar $ html? Eso parece ... extrañamente apropiado, en serio.
Increíble. Ahora necesito cambiar cómo funciona $ this-> data ??? ¿¿POR QUÉ?? ¿¿POR QUÉ?? ¿Por qué esta mafia no puede resolver que las apis tienden a ser contratos fijos, no ideas flotantes ... argh. Está bien, la línea de pasteles más usada que tengo ahora es ... incorrecta. Estoy desarrollando en scala o django a partir de ahora, las lenguas junior son malas.
Aquí es lo que corrí: encontrar. -type f -exec sed -i ''s / $ this-> data / $ this-> request-> data / g'' {} /;
Fui al directorio / app para hacerlo. Este 2.1 ... es mejor que sea realmente increíble ... la cantidad de trabajo que todos tienen que hacer para levantarlo. ¿Es esto, supongo, un día normal trabajando con los idiomas junior?
Ah fantástico, el problema $ html es causado porque a alguien no le gustaba minúsculas? Uno solo puede preguntarse: var indefinido cuando se usa Html Helper en CakePHP 2.0 y la solución es: (gracias a otra publicación en SO)
encontrar . -type f -exec sed -i ''s / $ html / $ this-> Html / g'' {} /;
Y, naturalmente, el mismo problema con $ sesión -
encontrar . -type f -exec sed -i ''s / $ session / $ this-> Session / g'' {} /;
...
Las cosas están viniendo! Ahora tengo el error inescrutable:
Controlador de clase PagesController no se pudo encontrar.
Oh, por el amor de ... así que necesito mover el controlador de páginas que se encuentra aquí:
lib / Cake / Console / Templates / skel / Controller / PagesController.php
y ponlo aqui
aplicación / Controlador /
una vez más, el instalador / mejorador de Cake parece estar dormido en el trabajo.
Y ahora tengo
Helper class JavascriptHelper no se pudo encontrar.
Esto no es tan malo: no encontrará ninguna referencia a "JavascriptHelper", pero encontrará referencias a "Javascript" en su matriz "$ helpers". El back-end agrega en la palabra Helper una ofuscación extra. De todos modos, busqué en mis archivos php cualquier array $ helpers, y encontré uno, en la clase AppController (2.1).
No me gusta ni entiendo a los ayudantes, javascript, de todos modos, así que nunca los utilicé. Debo haber seguido un tutorial a ciegas en algún momento y lo agregué ... pero no lo necesito, ¡así que se va!
Y ahora necesito limpiar todos los archivos ctp que tenía, donde utilicé un "requerir" para asegurarme de que se usó el html correcto. Una vez más, usaré el comando find de arriba para esto (para apuntarlos a la carpeta "Ver" y no a "vistas") Suspiro. Ok, no, no es tan simple, ¿verdad? Donde antes tenía:
require (app / View / Pages / man_front.html)
ahora necesito:
require (/cake_folder/app/View/Pages/man_front.html)
(donde la carpeta de tortas está donde está todo mi pastel). No estoy seguro de por qué, pero un simple hallazgo lo solucionó:
find . -type f -exec sed -i ''s/app//View//Pages///cake_folder//app//View//Pages/g'' {} /;
(the / will "depower" a /)
Ok, entonces habiendo hecho todo eso y conseguido su sitio a un nivel aceptable, ¿qué sigue? Bueno, ahora puede encontrar algunos problemas de DB:
Warning (2): mysqli :: mysqli () espera que el parámetro 1 sea string, array dado [CORE / Cake / Model / ConnectionManager.php, línea 101]
Error fatal: llamada al método no definido mysqli :: getSchemaName () en / cake_install/lib/Cake/Model/Model.php en la línea 3383
Por supuesto, no hay más soporte mysqli. Edité el database.php para usar mysql en su lugar (es decir, simplemente eliminé el final "i")
(¿Qué pasa con los píos en cakephp? API significa "no cambiar todo si se rompe el código existente, nunca". ¡No "cambiar! OBAMAAAAA!" ~ próxima actualización, voy a empujar todo mi código a django o primavera o scala. Ruddy tonterías.)
El próximo problema son los "Componentes" que estoy usando, me sale un error de tarta diciendo:
Falta plug-in
Error: la aplicación está intentando cargar un archivo desde el complemento de Uploader
Error: asegúrese de que su complemento Uploader esté en el directorio de la aplicación / complemento y se haya cargado
<?php
CakePlugin::load(''Uploader'');
Cargando todos los complementos: si desea cargar todos los complementos a la vez, use la siguiente línea en su archivo de la aplicación / Config / bootstrap.php
CakePlugin::loadAll();
Entonces ... ¿no solo se rompió todo mi código, sino también todos los complementos antiguos? Bonito.
La solución es crear una carpeta de aplicación / complemento (sí, el mejorador mágico tampoco lo hace) y luego ver los complementos que tenía. ¡Ahora! ¡Esto es diferente de tus componentes! No sé cómo por el momento, revisa mi pregunta para obtener una posible respuesta: ¿ diferencia entre un "componente" y un "complemento" en cakephp 2.1? - pero en este momento, solo estamos mirando la carpeta "PLUGIN" y los complementos en general. Parece que, en el pastel 1.3, los complementos se enumeraron así:
var $ components = array (''Uploader.Uploader'', ...);
es decir, con una notación de puntos. Puedo vivir con ello. En mi caso, necesitaba obtener la última versión del complemento de Uploader (que, afortunadamente, se actualizó para ser compatible con 2.x) y ponerlo en la carpeta de la aplicación / Plugin
así que tengo:
app
Plugin
Uploader
Config
Locale
<the other files here too!>
Eso parece funcionar ahora, ¡hurra!
El siguiente error fue:
Advertencia (2): argumento inválido suministrado para foreach () [CORE / Cake / Utility / Set.php, línea 1048]
Advertencia (2): array_multisort () [ http://php.net/function.array-multisort] : Se espera que el argumento # 1 sea una matriz o una bandera de clasificación [CORE / Cake / Utility / Set.php, línea 1087 ]
Advertencia (2): array_unique () espera que el parámetro 1 sea una matriz, nulo dado [CORE / Cake / Utility / Set.php, línea 1089]
Advertencia (2): argumento no válido proporcionado para foreach () [CORE / Cake / Utility / Set.php, línea 1091]
Advertencia (2): No se puede modificar la información del encabezado - encabezados ya enviados por (salida iniciada en / cake_install/lib/Cake/Utility/Debugger.php:761) [CORE / Cake / Network / CakeResponse.php, línea 395]
Ah, está bien entonces. Eso esta limpio. Me alegro de saber cuál es el error en mi código. Buen mensaje de error!
Ahora veo, me engaño, pensar que la utilidad Set :: Sort continuaría funcionando si la primera matriz estuviera vacía. Verdaderamente, la gente de la torta está de pie, no sobre los hombros de los gigantes, sino sobre sus frentes.
Parecería que la nueva actualización 2.1 elimina esta práctica lamentable, por lo que ahora necesito una verificación antes de cualquier conjunto: Ordenar llamadas para evitar si el conjunto en cuestión está vacío o nulo. Multa. Bastante fácil, pero ... geeze.
Acabo de lanzar un
if (! empty ($ theArray)) {Set :: sort ($ theArray, ...); }
y eso solucionó eso.
Ahora recibo errores de FormHelper: parece que $ form en la vista ahora se convierte en $ this-> Form, por lo que tengo otro script rápido para reemplazar esto:
encontrar . -type f -exec sed -i ''s / $ form / $ this-> Form / g'' {} /;
Y ahora el siguiente error que obtengo es:
Error fatal: tipos de operandos no admitidos en /cake_install/lib/Cake/View/Helper/FormHelper.php en la línea 1804
Y ahora han hecho un lío con el método "seleccionar" en el FormHelper, por lo que antes, donde tenía esto:
echo $ this-> Form-> select (''treatment_id'', $ treatments, null, array (''empty'' => ''- seleccionar tratamiento para calificar -''));
ahora tengo esto:
echo $ this-> Form-> select (''treatment_id'', $ treatments, array (''empty'' => ''- seleccionar tratamiento para calificar -''));
Y ahora uno de mis componentes, en realidad, el You_tube_loader_component, estaba roto. Necesito modificarlo para que el encabezado lea:
class YouTubeLoaderComponent extends Component {
function __construct(ComponentCollection $collection, $settings = array()) {
parent::__construct($collection, $settings);
...
}
}
Previamente había dejado de usar el valeus de la unme y la contraseña, ahora los incluyo en la sección "..." en lugar de meterme con la misteriosa matriz de "configuraciones".
El siguiente es:
Advertencia (2): tipo de compensación ilegal [CORE / Cake / Model / Model.php, línea 2689]
Advertencia (2): Tipo de compensación ilegal [CORE / Cake / Model / Model.php, línea 2665]
Así que este es un problema que no se recogió en el pastel 1.3, pero está en el 2.1
El problema es que en la acción de controlador a la que se hace referencia, hay una llamada de "búsqueda" sin un parámetro de tipo. Es decir, tuve
$ results = $ this-> User-> find (array (...), array (...), null, falso);
donde debería haber tenido:
$results = $this->User->find(''first'',array(
''conditions'' => array("User.id" => ($this->Auth->user("id"))),
''fields'' => array("User.confirmed")
)
);
Otro problema que tuve fue que, por alguna razón, el cheque:
$ this-> set (''loggedIn'', $ this-> Auth-> user (''id''));
no funcionó. Aparentemente (aunque no estoy seguro de cómo / por qué), CakePHP auth en 2.x ya no almacenará todos los detalles del usuario en la sesión. No sé qué detalles almacena en la sesión, o cómo modificarlos, ¡investigando eso! - pero mi código no guardaba el valor "id", por lo que la comprobación anterior siempre establece el valor de loggedIn en falso.
Para remediar, modifiqué la llamada para leer:
$ this-> set (''loggedIn'', $ this-> Auth-> loggedIn ());
lo cual funcionó bien para mí.
El siguiente problema es que el usuario tios-> auth-> (''id'') no me devolverá nada después de iniciar sesión en un usuario. Afortunadamente me encontré con esta publicación, que hizo las cosas más claras:
http://ask.cakephp.org/questions/view/unable_to_access_logged-in_users_data_in_2_0
Sorprendentemente, los genios de los laboratorios de tartas pensaron que cambiar la forma en que funcionaba el inicio de sesión ayudaría a despejar la confusión. Para ser sincero, lo único que me confunde es quién estaba tan confundido sobre el hecho de que el componente de autenticación tenía todos los detalles del usuario disponibles después de iniciar sesión. Pero no temas, han aclarado la confusión y ... eliminado la característica por completo.
¿Entonces qué vas a hacer? El enlace de arriba sugiere obtener todos los detalles del usuario y luego enviarlos a la sección de inicio de sesión de autenticación. No me gusta especialmente (porque es un problema estúpido y no puedo creer que se necesite algo tan poco elegante), pero es lo que tengo que hacer. Sugerencias bienvenidas!
Entonces, en lugar de lo tan confuso:
if ($this->Auth->login($this->request->data)) {
... //argh! I am so confused by that line above!!!1
ahora tengo:
$user = $this->User->find(''first'', array(
''conditions'' => array(''User.email'' => $this->request->data[''User''][''email''])
)
);
// Use the AuthComponent~Rs login action
if ($this->Auth->login($user[''User''])) {
... //omg the extra check that the entry is in the db is just brilliant and efficient
¿no es eso mucho más ordenado y menos confuso? Buen trabajo, Cakephp Mavericks!
El siguiente error es
No se encontró el "controlador" del adaptador de autorización.
Lo cual es un poco vago ...
Ah! Respondido ya en desbordamiento de pila aquí: Adaptador de autorización no se encontró en cakePHP
¡Y eso fue todo! Puede haber otros problemas, la velocidad de Dios en ellos, pero no los encontré, así que no puedo ayudarlo más.
Probablemente app/webroot/index.php
una ruta de acceso de Cake personalizada en app/webroot/index.php
. La estructura de directorios para Cake 2.0 ha cambiado ligeramente y normalmente esto sería manejado por el nuevo código que automáticamente encuentra el valor correcto para CAKE_CORE_INCLUDE_PATH
. Además, asegúrese de que APP_DIR
esté configurado correctamente en el mismo archivo index.php
.
Asegúrese de que app/webroot/index.php
contenga la ruta correcta de Cake, que es /path/to/cake/lib
.
if (!defined(''CAKE_CORE_INCLUDE_PATH'')) {
define(''CAKE_CORE_INCLUDE_PATH'', DS.''path''.DS.''to''.DS.''cake''.DS.''lib'');
}
Volver a la define(''CAKE_CORE_INCLUDE_PATH'', ROOT)
estándar define(''CAKE_CORE_INCLUDE_PATH'', ROOT)
podría funcionar también, si el modo en que Cake está configurado no es demasiado personalizado.
Tuve el mismo problema después de usar la herramienta de actualización Cake Shell. Si bien nuestra aplicación web es grande, nunca personalizamos el archivo index.php.
Reemplazar nuestra myapp / app / webroot / index.php con CakePHP cakephp-2.3.4 / app / webroot / index.php recién descargado resolvió este problema para mí.
No estoy seguro de por qué el Shell de actualización de CakePHP o sus instrucciones no especifican para cambiar el archivo index.php, pero como muestra la respuesta larga y excelente de @ bharal, hay mucho más trabajo por hacer ya que el Shell de actualización no lo hace hacer todo.