Installation:
composer.json under require:
"ais/mahasiswabundle": "dev-master"
composer update in your project root.Register the Bundle:
Ais\MahasiswaBundle\AisMahasiswaBundle() to AppKernel.php under registerBundles().NelmioApiDocBundle, FOSRestBundle, and JMSSerializerBundle are also registered.Configure Routing:
app/config/routing.yml:
ais_mahasiswas:
type: rest
prefix: /api
resource: "@AisMahasiswaBundle/Resources/config/routes.yml"
Access API Docs:
/api/doc (e.g., http://localhost/web/app_dev.php/api/doc) to explore endpoints.Fetching Student Data:
MahasiswaBundle (likely a typo).GET /api/dosen (or similar) to retrieve a list of lecturers via the API.RESTful API Integration:
FOSRestBundle for standardized API responses (e.g., JSON).NelmioApiDocBundle to auto-generate Swagger/OpenAPI documentation for client-side tooling.Entity Management:
Dosen entity (class) with CRUD operations.// Create a lecturer
$dosen = new \Ais\MahasiswaBundle\Entity\Dosen();
$dosen->setName('Dr. Smith');
$em->persist($dosen);
$em->flush();
DosenRepository (if available) for queries:
$repository = $this->get('ais_mahasiswa.dosen.repository');
$lecturers = $repository->findAll();
Serialization:
JMSSerializerBundle handles data transformation (e.g., converting entities to JSON).@Serializer\ExclusionPolicy).Testing:
LiipFunctionalTestBundle for API endpoint testing:
$client = static::createClient();
$client->request('GET', '/api/dosen');
$this->assertEquals(200, $client->getResponse()->getStatusCode());
Database Schema:
AisMahasiswaBundle/Resources/config/doctrine/Dosen.orm.yml for entity mappings.Dosen entity if additional fields are needed:
namespace Ais\MahasiswaBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity */
class Dosen {
// ...
}
Custom Controllers:
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
class CustomDosenController extends \Ais\MahasiswaBundle\Controller\DosenController {
/**
* @Route("/api/dosen/custom", name="custom_dosen")
*/
public function customAction() {
return new Response('Custom logic here');
}
}
Validation:
@Assert\NotBlank) on the Dosen entity.Event Listeners:
prePersist) for side effects:
namespace AppBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
class DosenListener {
public function prePersist(LifecycleEventArgs $args) {
$dosen = $args->getEntity();
if ($dosen instanceof \Ais\MahasiswaBundle\Entity\Dosen) {
$dosen->setCreatedAt(new \DateTime());
}
}
}
services.yml:
services:
app.dosen_listener:
class: AppBundle\EventListener\DosenListener
tags:
- { name: doctrine.event_listener, event: prePersist }
Bundle Naming Inconsistency:
MahasiswaBundle (Students) but manages Dosen (Lecturers). Clarify requirements with stakeholders to avoid confusion.Symfony Version Lock:
Missing Documentation:
AisMahasiswaBundle/Resources/config/routing.yml for available routes.AisMahasiswaBundle/Controller/ for controller logic.AisMahasiswaBundle/Entity/ for data models.Dependency Conflicts:
FOSRestBundle, NelmioApiDocBundle, and JMSSerializerBundle are required but may conflict with newer versions. Pin versions in composer.json:
"fos/rest-bundle": "1.11.*",
"nelmio/api-doc-bundle": "2.14.*",
"jms/serializer-bundle": "0.15.*"
API Doc Access:
app_dev.php is not used in production. Configure nelmio_api_doc in config.yml:
nelmio_api_doc:
areas: [api] # Ensure this matches your route prefix
Route Debugging:
ais_mahasiswas is loaded:
php app/console debug:router
ais_mahasiswas_* routes.Entity Debugging:
Dosen entity is mapped:
php app/console doctrine:schema:validate
AisMahasiswaBundle is enabled in AppKernel.API Response Issues:
JMSSerializerBundle configuration in config.yml:
jms_serializer:
metadata:
directories:
AisMahasiswaBundle: ~
Event Listener Debugging:
config.yml:
doctrine:
dbal:
logging: true
app/log/dev.log) for lifecycle event triggers.Custom Fields:
Dosen entity by creating a child class:
namespace AppBundle\Entity;
use Ais\MahasiswaBundle\Entity\Dosen as BaseDosen;
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity */
class Dosen extends BaseDosen {
/** @ORM\Column(type="string") */
private $customField;
}
New Routes:
app/config/routing.yml:
app_custom_dosen:
type: rest
resource: "@AppBundle/Resources/config/routing/dosen.yml"
dosen.yml):
custom_route:
path: /api/dosen/custom
defaults: { _controller: AppBundle:Dosen:custom }
Custom Serialization:
Dosen entity:
namespace AppBundle\Serializer;
use JMS\Serializer\Context;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\Metadata\ClassMetadata;
use JMS\Serializer\VisitorInterface;
class DosenHandler {
public static function getClassMetadata(ClassMetadata $metadata) {
$metadata->xmlRootName = 'lecturer';
$metadata->xmlNamespace = 'http://example.com';
}
}
services.yml:
services:
app.serializer.dosen_handler:
class: AppBundle\Serializer\DosenHandler
tags:
- { name: jms_serializer.subscribing_handler }
Fixtures:
doctrine-fixtures-bundle to seed testHow can I help you explore Laravel packages today?