Hola de nuevo, vine a compartirles el link del último video sobre CausaFramework que publiqué anoche en YT:
trata sobre cómo conectar Causa con MongoDB, que es super sencillo, y el mérito no es precisamente de Causa gran parte de eso se debe a PHP, Composer y una apropiada estructura de directorios; lo único que hace Causa es aplicar una lógica que ya ha sido comprobada en otros frameworks como Laravel y la aplica a "pure PHP projects". Cuando trabajas para agencias grandes y se presenta un proyecto PHP, la discusión trata sobre qué resources del ecosistema Laravel se usará: Livewire, Inertia, Nova, Sail, etc. En cambio en muchos países de Latino América dices. "tu hosting soporta Laravel?" y en muchos casos la respuesta es NO así que Causa nace en escenarios donde me decía: "quiero usar Blade, pues me hace la vida más fácil pero le agrega valor y eficiencia al proyecto".
En ese sentido luego vino: "debo usar Composer pues necesito determinada librería", "esta tarea es muy repetitiva, necesito un comando CLI para esto", "quiero usar live reload", "quiero usar Tailwind", etc. Laravel o Symfony son open source frameworks así que puedes "customizarlo" pero cuántos de nosotros estamos en capacidad de hacerlo apropiadamente? Pero Causa es tan sencillo, tiene tan pocos elementos que modificarlo es cosa de unos cuantos minutos.
estoy de vacaciones pero igual, me quito 😄.
PS: Roxana, una estudiante de la UNCP me escribió preguntándome si cuando se usa una clase endpoint podría evitarse definir la variable:
protected static string $endpoint
y si esa variable sería el equivalente de:
protected $table
la respuesta es sí, es además una aguda observación. Su otra pregunta era: "podría asignarse el nombre automáticamente?" y también la respuesta es SÍ. Para hacer eso usas puro PHP, en este caso
\ReflectionClass
ejem: ReflectionClass('App\Api\Endpoints\Products') que devuelve información sobre la clase como el nombre: 'Products'. La DB tradicionales usan convenciones como nombres de las tablas en minúsculas, nombres compuestos separados por '_' ejem: 'user_contacts' (la clase debería llamarse UserContacts) etc.
Aquí les comparto una clase que otras classes model extienden -es parte de una app que tengo en mi localhost dash, así que tiene algunos años pero es funcional-:
namespace OscarAlderete\Models\Mongodb;
use Doctrine\Inflector\InflectorFactory;
use Exception;
use MongoDB\Client;
use MongoDB\Collection;
class Model
{
private static ?Client $client = null;
protected $db;
protected Collection $collection;
public function __construct()
{
if (self::$client === null) {
try {
self::$client = new Client(sprintf(MONGODB_REMOTE_CLIENT, MONGODB_USER, urlencode(MONGODB_PASSWORD)));
} catch (Exception $e) {
self::$client = null;
}
}
if (self::$client) {
$this->db = self::$client->selectDatabase(MONGODB_DBNAME);
$this->collection = $this->db->selectCollection($this->resolveCollectionName());
}
}
public function find(array $filter = [], array $options = []): array
{
if ($this->collection) {
return $this->collection->find($filter, $options)->toArray();
}
return [];
}
public function insert(array $data): array
{
if (empty($data)) {
throw new \InvalidArgumentException("Insert data cannot be empty.");
}
$result = $this->collection->insertOne($data);
return [
'insertedId' => $result->getInsertedId(),
];
}
// privates
private function resolveCollectionName(): string
{
$className = (new \ReflectionClass($this))->getShortName();
// Convert camel case to snake case first
$snakeCaseName = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $className));
// Use Doctrine Inflector to pluralize correctly
$inflector = InflectorFactory::create()->build();
return strtolower($inflector->pluralize($snakeCaseName));
}
}